summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlejandro Colomar <Colomar.6.4.3@GMail.com>2018-09-16 14:08:19 +0200
committerGitHub <noreply@github.com>2018-09-16 14:08:19 +0200
commit5728130cf922d36627caddbc4e2c2e254346cf44 (patch)
tree2def2537133dbedcbffb4d91a1ecc28c2c576ef1
parentaa028666ba96b3210bf4e873cd6209b20bc42cf7 (diff)
parent3afc0905fe24798e7aaaccaac0a6e0073be74dbc (diff)
Merge pull request #60 from AlejandroColomar/4-a
V 4~a2
-rw-r--r--Makefile2
-rw-r--r--SETUP.cmd32
-rw-r--r--UNINSTALL.cmd4
-rw-r--r--modules/ctrl/src/start.c2
-rw-r--r--modules/menu/inc/menu_gui.h19
-rw-r--r--modules/menu/src/menu_gui.c841
-rw-r--r--modules/menu/src/menu_iface.c15
-rw-r--r--modules/player/inc/player_gui.h81
-rw-r--r--modules/player/obj/Makefile22
-rw-r--r--modules/player/src/player_gui.c933
-rw-r--r--modules/player/src/player_iface.c28
-rw-r--r--modules/save/src/score.c2
-rw-r--r--src/main.c3
13 files changed, 1699 insertions, 285 deletions
diff --git a/Makefile b/Makefile
index 86f68de..a12d5aa 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
#!/usr/bin/make -f
VERSION = 4
-PATCHLEVEL = ~a1
+PATCHLEVEL = ~a2
SUBLEVEL =
EXTRAVERSION =
NAME = graphic
diff --git a/SETUP.cmd b/SETUP.cmd
index ccd386b..b9c506c 100644
--- a/SETUP.cmd
+++ b/SETUP.cmd
@@ -13,39 +13,39 @@ call "%~dp0\UNINSTALL.cmd"
@echo off
mkdir "%ProgramFiles(x86)%\mine-sweeper\"
-echo "Create %ProgramFiles(x86)%/mine-sweeper/"
+echo Create %ProgramFiles(x86)%/mine-sweeper/
mkdir "%ProgramFiles(x86)%\mine-sweeper\bin\"
-echo "Create %ProgramFiles(x86)%/mine-sweeper/bin/"
+echo Create %ProgramFiles(x86)%/mine-sweeper/bin/
mkdir "%ProgramFiles(x86)%\mine-sweeper\share\"
-echo "Create %ProgramFiles(x86)%/mine-sweeper/share/"
+echo Create %ProgramFiles(x86)%/mine-sweeper/share/
mkdir "%ProgramFiles(x86)%\mine-sweeper\var\"
-echo "Create %ProgramFiles(x86)%/mine-sweeper/var/"
-echo ""
+echo Create %ProgramFiles(x86)%/mine-sweeper/var/
+echo.
copy "%~dp0\UNINSTALL.cmd" "%ProgramFiles(x86)%\mine-sweeper"
-echo "Copy UNINSTALL.cmd"
+echo Copy UNINSTALL.cmd
copy "%~dp0\COPYING.txt" "%ProgramFiles(x86)%\mine-sweeper"
-echo "Copy COPYING.txt"
+echo Copy COPYING.txt
copy "%~dp0\README.txt" "%ProgramFiles(x86)%\mine-sweeper"
-echo "Copy README.txt"
+echo Copy README.txt
robocopy "%~dp0\share" "%ProgramFiles(x86)%\mine-sweeper\share" /e
-echo "Copy share/*"
+echo Copy share/*
robocopy "%~dp0\var" "%ProgramFiles(x86)%\mine-sweeper\var" /e
-echo "Copy var/*"
+echo Copy var/*
copy "%~dp0\bin\mine-sweeper.exe" "%ProgramFiles(x86)%\mine-sweeper\bin"
-echo "Copy bin/mine-sweeper.exe"
-echo ""
+echo Copy bin/mine-sweeper.exe
+echo.
mkdir "%userprofile%\Start Menu\Programs\mine-sweeper\"
mklink "%userprofile%\Start Menu\Programs\mine-sweeper\mine-sweeper" "%ProgramFiles(x86)%\mine-sweeper\bin\mine-sweeper.exe"
mklink "%userprofile%\Start Menu\Programs\mine-sweeper\UNINSTALL" "%ProgramFiles(x86)%\mine-sweeper\UNINSTALL.cmd"
mklink "%userprofile%\Start Menu\Programs\mine-sweeper\README" "%ProgramFiles(x86)%\mine-sweeper\README.txt"
mklink "%userprofile%\Start Menu\Programs\mine-sweeper\COPYING" "%ProgramFiles(x86)%\mine-sweeper\COPYING.txt"
-echo "Create start menu shortcuts"
-echo ""
+echo Create start menu shortcuts
+echo.
-echo "Done"
-echo ""
+echo Done
+echo.
pause
diff --git a/UNINSTALL.cmd b/UNINSTALL.cmd
index 71181e1..d1a08e6 100644
--- a/UNINSTALL.cmd
+++ b/UNINSTALL.cmd
@@ -9,8 +9,8 @@
rmdir "%ProgramFiles(x86)%\mine-sweeper\" /s /q
rmdir "%userprofile%\Start Menu\Programs\mine-sweeper\" /s /q
-echo "Clean old installations"
-echo ""
+echo Clean old installations
+echo.
pause
diff --git a/modules/ctrl/src/start.c b/modules/ctrl/src/start.c
index cad72c9..e734b86 100644
--- a/modules/ctrl/src/start.c
+++ b/modules/ctrl/src/start.c
@@ -108,6 +108,8 @@ static void start_load (void)
/* size & game init (sets errno) */
int rows;
int cols;
+
+ errno = 0;
game_init_load(&rows, &cols);
if (!errno) {
diff --git a/modules/menu/inc/menu_gui.h b/modules/menu/inc/menu_gui.h
index e2515d8..c605842 100644
--- a/modules/menu/inc/menu_gui.h
+++ b/modules/menu/inc/menu_gui.h
@@ -18,6 +18,20 @@
/******************************************************************************
+ ******* macros ***************************************************************
+ ******************************************************************************/
+ # define ROWS_GUI_MAX (22)
+#if (ROWS_GUI_MAX > ROWS_MAX)
+# error "rows max (gui)"
+#endif
+
+ # define COLS_GUI_MAX (33)
+#if (COLS_GUI_MAX > COLS_MAX)
+# error "cols max (gui)"
+#endif
+
+
+/******************************************************************************
******* variables ************************************************************
******************************************************************************/
extern GtkWidget *window_gui;
@@ -26,8 +40,9 @@ extern GtkWidget *window_gui;
/******************************************************************************
******* functions ************************************************************
******************************************************************************/
- void menu_gui_init (void);
- void menu_gui (void);
+ void menu_gui_init (void);
+ void menu_gui_cleanup (void);
+ void menu_gui (void);
/******************************************************************************
diff --git a/modules/menu/src/menu_gui.c b/modules/menu/src/menu_gui.c
index 23e9bff..cec54f5 100644
--- a/modules/menu/src/menu_gui.c
+++ b/modules/menu/src/menu_gui.c
@@ -12,7 +12,10 @@
#include <gtk/gtk.h>
/* INFINITY */
#include <math.h>
+ /* true & false */
#include <stdbool.h>
+ /* sprintf() */
+ #include <stdio.h>
/* srand() */
#include <stdlib.h>
@@ -31,17 +34,19 @@
/******************************************************************************
- ******* macros ***************************************************************
+ ******* structs **************************************************************
******************************************************************************/
- # define ROWS_GUI_MAX (22)
-#if (ROWS_GUI_MAX > ROWS_MAX)
-# error "rows max (tui)"
-#endif
+struct Button_Data {
+ GtkWidget *ptr;
+ char text [80];
+ int num;
+ int *sw;
+};
- # define COLS_GUI_MAX (33)
-#if (COLS_GUI_MAX > COLS_MAX)
-# error "cols max (tui)"
-#endif
+struct Label_Data {
+ GtkWidget *ptr;
+ char text [80];
+};
/******************************************************************************
@@ -53,14 +58,22 @@ GtkWidget *window_gui;
/******************************************************************************
******* static functions *****************************************************
******************************************************************************/
-#if 0
-static void menu_tui_continue (void);
-static void menu_tui_select (void);
-static void menu_tui_level (void);
-static void menu_tui_custom (void);
-static void menu_tui_devel (void);
-static void menu_tui_verbose (void);
-#endif
+ /* Init & cleanup */
+static gboolean delete_window (GtkWidget *widget,
+ GdkEvent *event,
+ void *data);
+static void destroy_window (GtkWidget *widget,
+ void *data);
+ /* Selection */
+static void callback_button (GtkWidget *widget,
+ void *data);
+ /* Submenus */
+static void menu_gui_continue (void);
+static void menu_gui_select (void);
+static void menu_gui_level (void);
+static void menu_gui_custom (void);
+static void menu_gui_devel (void);
+static void menu_gui_verbose (void);
/******************************************************************************
@@ -68,379 +81,687 @@ static void menu_tui_verbose (void);
******************************************************************************/
void menu_gui_init (void)
{
+ /* Window */
window_gui = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+
+ /* Quit */
+ g_signal_connect(window_gui, "delete-event", G_CALLBACK(delete_window), NULL);
+ g_signal_connect(window_gui, "destroy", G_CALLBACK(destroy_window), NULL);
+
+ /* Title. PROG_VERSION defined in Makefile */
+ char title [80];
+ sprintf(title, "mine-sweeper %s", PROG_VERSION);
+ gtk_window_set_title(GTK_WINDOW(window_gui), title);
+
+ /* Border */
+ gtk_container_set_border_width(GTK_CONTAINER(window_gui), 20);
+}
+
+void menu_gui_cleanup (void)
+{
+ /* Destroy window */
+ gtk_widget_destroy(window_gui);
}
void menu_gui (void)
{
- gtk_widget_show(window_gui);
- gtk_main();
+ bool wh;
+ int sw;
+ GtkWidget *box;
+ GtkWidget *separator[3];
+ struct Label_Data label;
+ struct Button_Data button [4];
+
+ /* Text */
+ sprintf(label.text, "Main menu");
+ sprintf(button[1].text, "Continue");
+ sprintf(button[2].text, "Disclaimer of warranty");
+ sprintf(button[3].text, "Terms and conditions");
+ sprintf(button[0].text, "Exit program");
+
+ /* Data */
+ button[1].num = 1;
+ button[2].num = 2;
+ button[3].num = 3;
+ button[0].num = 0;
+ button[1].sw = &sw;
+ button[2].sw = &sw;
+ button[3].sw = &sw;
+ button[0].sw = &sw;
-#if 0
- alx_resume_curses();
-
- /* Menu dimensions & options */
- int h;
- int w;
- h = 10;
- w = 34;
- int N;
- N = 4;
- struct Alx_Menu mnu[4] = {
- {7, 4, "[0] Exit program"},
- {2, 4, "[1] Continue"},
- {4, 4, "[2] Disclaimer of warranty"},
- {5, 4, "[3] Terms and conditions"}
- };
-
- /* Menu */
- bool wh;
- int sw;
+ /* Menu loop */
wh = true;
while (wh) {
- /* Menu loop */
- sw = alx_menu(h, w, N, mnu, "MENU:");
+
+ /* Generate widgets */
+ box = gtk_vbox_new(false, 0);
+ label.ptr = gtk_label_new(label.text);
+ separator[0] = gtk_hseparator_new();
+ button[1].ptr = gtk_button_new_with_label(button[1].text);
+ separator[1] = gtk_hseparator_new();
+ button[2].ptr = gtk_button_new_with_label(button[2].text);
+ button[3].ptr = gtk_button_new_with_label(button[3].text);
+ separator[2] = gtk_hseparator_new();
+ button[0].ptr = gtk_button_new_with_label(button[0].text);
+
+ /* Events */
+ g_signal_connect(button[1].ptr, "clicked",
+ G_CALLBACK(callback_button), (void *)&button[1]);
+ g_signal_connect(button[2].ptr, "clicked",
+ G_CALLBACK(callback_button), (void *)&button[2]);
+ g_signal_connect(button[3].ptr, "clicked",
+ G_CALLBACK(callback_button), (void *)&button[3]);
+ g_signal_connect(button[0].ptr, "clicked",
+ G_CALLBACK(callback_button), (void *)&button[0]);
+
+ /* Container */
+ gtk_container_add(GTK_CONTAINER(window_gui), box);
+
+ /* Box */
+ gtk_box_pack_start(GTK_BOX(box), label.ptr, false, false, 0);
+ gtk_box_pack_start(GTK_BOX(box), separator[0], false, false, 5);
+ gtk_box_pack_start(GTK_BOX(box), button[1].ptr, true, true, 0);
+ gtk_box_pack_start(GTK_BOX(box), separator[1], false, false, 5);
+ gtk_box_pack_start(GTK_BOX(box), button[2].ptr, true, true, 0);
+ gtk_box_pack_start(GTK_BOX(box), button[3].ptr, true, true, 0);
+ gtk_box_pack_start(GTK_BOX(box), separator[2], false, false, 5);
+ gtk_box_pack_start(GTK_BOX(box), button[0].ptr, true, true, 0);
+
+ /* Show */
+ gtk_widget_show(label.ptr);
+ gtk_widget_show(separator[0]);
+ gtk_widget_show(button[1].ptr);
+ gtk_widget_show(separator[1]);
+ gtk_widget_show(button[2].ptr);
+ gtk_widget_show(button[3].ptr);
+ gtk_widget_show(separator[2]);
+ gtk_widget_show(button[0].ptr);
+ gtk_widget_show(box);
+ gtk_widget_show(window_gui);
+
+ /* GTK loop */
+ sw = 0;
+ gtk_main();
+
+ /* Clear window */
+ gtk_widget_destroy(box);
/* Selection */
switch (sw) {
case 0:
wh = false;
break;
-
case 1:
- menu_tui_continue();
+ menu_gui_continue();
break;
-
case 2:
- alx_pause_curses();
print_disclaim();
- getchar();
- alx_resume_curses();
break;
-
case 3:
- alx_pause_curses();
print_license();
- getchar();
- alx_resume_curses();
break;
}
}
-
- alx_pause_curses();
-#endif
}
/******************************************************************************
******* static functions *****************************************************
******************************************************************************/
-#if 0
-static void menu_tui_continue (void)
+/* * * * * * * * * *
+ * * Cleanup * * * * * *
+ * * * * * * * * * */
+static gboolean delete_window (GtkWidget *widget,
+ GdkEvent *event,
+ void *data)
+{
+ g_print ("delete event occurred\n");
+
+ gtk_main_quit();
+
+ /* false: send destroy signal */
+ return false;
+}
+
+static void destroy_window (GtkWidget *widget,
+ void *data)
+{
+ g_print ("destroy event occurred\n");
+
+ exit(EXIT_SUCCESS);
+}
+
+/* * * * * * * * * *
+ * * Selection * * * * * *
+ * * * * * * * * * */
+static void callback_button (GtkWidget *widget,
+ void *data)
+{
+ struct Button_Data *button;
+
+ button = ((struct Button_Data *)data);
+
+ *(button->sw) = button->num;
+
+ gtk_main_quit();
+}
+
+/* * * * * * * * * *
+ * * Submenus * * * * * *
+ * * * * * * * * * */
+static void menu_gui_continue (void)
{
- /* Menu dimensions & options */
- WINDOW *win;
- int h;
- int w;
- int r;
- int c;
- h = 18;
- w = 50;
- r = 1;
- c = (80 - w) / 2;
- int N;
- /* N = 7 if DEVEL option is enabled */
- N = 6;
- struct Alx_Menu mnu[6] = {
- {11, 4, "[0] Back"},
- {2, 4, "[1] Start"},
- {4, 4, "[2] Select map"},
- {5, 4, "[3] Change difficulty"},
- {6, 4, "[4] Change file name"},
- {7, 4, "[5] Hi scores"}/*,
- {9, 4, "[6] DEVEL"}*/
- };
-
- /* Input box */
- int w2;
- int r2;
- w2 = w - 8;
- r2 = r + h - 5;
- char *txt[] = {"File name:"};
-
- /* Menu */
- bool wh;
- int sw;
+ bool wh;
+ int sw;
+ GtkWidget *box;
+ GtkWidget *separator[4];
+ struct Label_Data label;
+ struct Button_Data button [7];
+
+ /* Text */
+ sprintf(label.text, "Game menu");
+ sprintf(button[1].text, "Start");
+ sprintf(button[2].text, "Select map");
+ sprintf(button[3].text, "Change difficulty");
+ sprintf(button[5].text, "Hi scores");
+ sprintf(button[6].text, "DEVEL");
+ sprintf(button[0].text, "Back");
+
+ /* Data */
+ button[1].num = 1;
+ button[2].num = 2;
+ button[3].num = 3;
+ button[4].num = 4;
+ button[5].num = 5;
+ button[6].num = 6;
+ button[0].num = 0;
+ button[1].sw = &sw;
+ button[2].sw = &sw;
+ button[3].sw = &sw;
+ button[4].sw = &sw;
+ button[5].sw = &sw;
+ button[6].sw = &sw;
+ button[0].sw = &sw;
+
+ /* Menu loop */
wh = true;
while (wh) {
- /* Menu loop */
- win = newwin(h, w, r, c);
- mvwprintw(win, mnu[4].r, mnu[4].c, "%s (File: \"%s\")", mnu[4].t, saved_name);
- wrefresh(win);
- sw = alx_menu_2(win, N, mnu, "CONTINUE:");
+ /* Text */
+ sprintf(button[4].text, "Change file name (File: \"%s\")", saved_name);
+
+ /* Generate widgets */
+ box = gtk_vbox_new(false, 0);
+ label.ptr = gtk_label_new(label.text);
+ separator[0] = gtk_hseparator_new();
+ button[1].ptr = gtk_button_new_with_label(button[1].text);
+ separator[1] = gtk_hseparator_new();
+ button[2].ptr = gtk_button_new_with_label(button[2].text);
+ button[3].ptr = gtk_button_new_with_label(button[3].text);
+ button[4].ptr = gtk_button_new_with_label(button[4].text);
+ button[5].ptr = gtk_button_new_with_label(button[5].text);
+ separator[2] = gtk_hseparator_new();
+ button[6].ptr = gtk_button_new_with_label(button[6].text);
+ separator[3] = gtk_hseparator_new();
+ button[0].ptr = gtk_button_new_with_label(button[0].text);
+
+ /* Events */
+ g_signal_connect(button[1].ptr, "clicked",
+ G_CALLBACK(callback_button), (void *)&button[1]);
+ g_signal_connect(button[2].ptr, "clicked",
+ G_CALLBACK(callback_button), (void *)&button[2]);
+ g_signal_connect(button[3].ptr, "clicked",
+ G_CALLBACK(callback_button), (void *)&button[3]);
+ g_signal_connect(button[4].ptr, "clicked",
+ G_CALLBACK(callback_button), (void *)&button[4]);
+ g_signal_connect(button[5].ptr, "clicked",
+ G_CALLBACK(callback_button), (void *)&button[5]);
+ g_signal_connect(button[6].ptr, "clicked",
+ G_CALLBACK(callback_button), (void *)&button[6]);
+ g_signal_connect(button[0].ptr, "clicked",
+ G_CALLBACK(callback_button), (void *)&button[0]);
+
+ /* Container */
+ gtk_container_add(GTK_CONTAINER(window_gui), box);
+
+ /* Box */
+ gtk_box_pack_start(GTK_BOX(box), label.ptr, false, false, 0);
+ gtk_box_pack_start(GTK_BOX(box), separator[0], false, false, 5);
+ gtk_box_pack_start(GTK_BOX(box), button[1].ptr, true, true, 0);
+ gtk_box_pack_start(GTK_BOX(box), separator[1], false, false, 5);
+ gtk_box_pack_start(GTK_BOX(box), button[2].ptr, true, true, 0);
+ gtk_box_pack_start(GTK_BOX(box), button[3].ptr, true, true, 0);
+ gtk_box_pack_start(GTK_BOX(box), button[4].ptr, true, true, 0);
+ gtk_box_pack_start(GTK_BOX(box), button[5].ptr, true, true, 0);
+ gtk_box_pack_start(GTK_BOX(box), separator[2], false, false, 5);
+ gtk_box_pack_start(GTK_BOX(box), button[6].ptr, true, true, 0);
+ gtk_box_pack_start(GTK_BOX(box), separator[3], false, false, 5);
+ gtk_box_pack_start(GTK_BOX(box), button[0].ptr, true, true, 0);
+
+ /* Show */
+ gtk_widget_show(label.ptr);
+ gtk_widget_show(separator[0]);
+ gtk_widget_show(button[1].ptr);
+ gtk_widget_show(separator[1]);
+ gtk_widget_show(button[2].ptr);
+ gtk_widget_show(button[3].ptr);
+ gtk_widget_show(button[4].ptr);
+ gtk_widget_show(button[5].ptr);
+ gtk_widget_show(separator[2]);
+ gtk_widget_show(button[6].ptr);
+ gtk_widget_show(separator[3]);
+ gtk_widget_show(button[0].ptr);
+ gtk_widget_show(box);
+ gtk_widget_show(window_gui);
+
+ /* GTK loop */
+ sw = 0;
+ gtk_main();
/* Selection */
switch (sw) {
case 0:
- alx_win_del(win);
+ gtk_widget_destroy(box);
wh = false;
break;
-
case 1:
- alx_win_del(win);
- alx_pause_curses();
+ gtk_widget_destroy(box);
start_switch();
- alx_resume_curses();
break;
-
case 2:
- alx_win_del(win);
- menu_tui_select();
+ gtk_widget_destroy(box);
+ menu_gui_select();
break;
-
case 3:
- alx_win_del(win);
- menu_tui_level();
+ gtk_widget_destroy(box);
+ menu_gui_level();
break;
-
case 4:
save_clr();
- alx_w_getfname(saved_path, saved_name, true, w2, r2,
- txt[0], NULL);
- alx_win_del(win);
+// alx_w_getfname(saved_path, saved_name, true, w2, r2,
+// txt[0], NULL);
+ gtk_widget_destroy(box);
break;
-
case 5:
- alx_win_del(win);
- alx_pause_curses();
+ gtk_widget_destroy(box);
read_scores();
- getchar();
- alx_resume_curses();
break;
-/*
case 6:
- alx_win_del(win);
- menu_tui_devel();
+ gtk_widget_destroy(box);
+ menu_gui_devel();
break;
-*/
}
}
}
-static void menu_tui_select (void)
+static void menu_gui_select (void)
{
- /* Menu dimensions & options */
- WINDOW *win;
- int h;
- int w;
- int r;
- int c;
- h = 9;
- w = 70;
- r = 1;
- c = (80 - w) / 2;
- int N;
- N = 3;
- struct Alx_Menu mnu[3] = {
- {6, 4, "[0] Back"},
- {2, 4, "[1] New map"},
- {4, 4, "[2] Load map"}
- };
+ int sw;
+ GtkWidget *box;
+ GtkWidget *separator[3];
+ struct Label_Data label;
+ struct Button_Data button [3];
+
+ /* Text */
+ sprintf(label.text, "Select map");
+ sprintf(button[1].text, "New map");
+ sprintf(button[2].text, "Load map (File: \"%s\")", saved_name);
+ sprintf(button[0].text, "Back");
+
+ /* Data */
+ button[1].num = 1;
+ button[2].num = 2;
+ button[0].num = 0;
+ button[1].sw = &sw;
+ button[2].sw = &sw;
+ button[0].sw = &sw;
+
+ /* Generate widgets */
+ box = gtk_vbox_new(false, 0);
+ label.ptr = gtk_label_new(label.text);
+ separator[0] = gtk_hseparator_new();
+ button[1].ptr = gtk_button_new_with_label(button[1].text);
+ separator[1] = gtk_hseparator_new();
+ button[2].ptr = gtk_button_new_with_label(button[2].text);
+ separator[2] = gtk_hseparator_new();
+ button[0].ptr = gtk_button_new_with_label(button[0].text);
+
+ /* Events */
+ g_signal_connect(button[1].ptr, "clicked",
+ G_CALLBACK(callback_button), (void *)&button[1]);
+ g_signal_connect(button[2].ptr, "clicked",
+ G_CALLBACK(callback_button), (void *)&button[2]);
+ g_signal_connect(button[0].ptr, "clicked",
+ G_CALLBACK(callback_button), (void *)&button[0]);
+
+ /* Container */
+ gtk_container_add(GTK_CONTAINER(window_gui), box);
+
+ /* Box */
+ gtk_box_pack_start(GTK_BOX(box), label.ptr, false, false, 0);
+ gtk_box_pack_start(GTK_BOX(box), separator[0], false, false, 5);
+ gtk_box_pack_start(GTK_BOX(box), button[1].ptr, true, true, 0);
+ gtk_box_pack_start(GTK_BOX(box), separator[1], false, false, 5);
+ gtk_box_pack_start(GTK_BOX(box), button[2].ptr, true, true, 0);
+ gtk_box_pack_start(GTK_BOX(box), separator[2], false, false, 5);
+ gtk_box_pack_start(GTK_BOX(box), button[0].ptr, true, true, 0);
+
+ /* Show */
+ gtk_widget_show(label.ptr);
+ gtk_widget_show(separator[0]);
+ gtk_widget_show(button[1].ptr);
+ gtk_widget_show(separator[1]);
+ gtk_widget_show(button[2].ptr);
+ gtk_widget_show(separator[2]);
+ gtk_widget_show(button[0].ptr);
+ gtk_widget_show(box);
+ gtk_widget_show(window_gui);
- /* Menu loop */
- int sw;
- win = newwin(h, w, r, c);
- mvwprintw(win, mnu[2].r, mnu[2].c, "%s (File: \"%s\")", mnu[1].t, saved_name);
- wrefresh(win);
- sw = alx_menu_2(win, N, mnu, "SELECT MAP:");
- alx_win_del(win);
+ /* GTK loop */
+ sw = 0;
+ gtk_main();
+
+ /* Clear window */
+ gtk_widget_destroy(box);
/* Selection */
switch (sw) {
+ case 0:
+ break;
case 1:
start_mode = START_RAND;
break;
-
case 2:
start_mode = START_LOAD;
break;
}
-
}
-static void menu_tui_level (void)
+static void menu_gui_level (void)
{
- /* Menu dimensions & options */
- WINDOW *win;
- int h;
- int w;
- h = 10;
- w = 70;
- int N;
- N = 5;
- struct Alx_Menu mnu[5] = {
- {7, 4, "[0] Back"},
- {2, 4, "[1] Beginner"},
- {3, 4, "[2] Intermediate"},
- {4, 4, "[3] Expert"},
- {5, 4, "[4] Custom"}
- };
+ int sw;
+ GtkWidget *box;
+ GtkWidget *separator[3];
+ struct Label_Data label;
+ struct Button_Data button [5];
+
+ /* Text */
+ sprintf(label.text, "Select level");
+ sprintf(button[1].text, "Beginner");
+ sprintf(button[2].text, "Intermediate");
+ sprintf(button[3].text, "Expert");
+ sprintf(button[4].text, "Custom");
+ sprintf(button[0].text, "Back");
+
+ /* Data */
+ button[1].num = 1;
+ button[2].num = 2;
+ button[3].num = 3;
+ button[4].num = 4;
+ button[0].num = 0;
+ button[1].sw = &sw;
+ button[2].sw = &sw;
+ button[3].sw = &sw;
+ button[4].sw = &sw;
+ button[0].sw = &sw;
+
+ /* Generate widgets */
+ box = gtk_vbox_new(false, 0);
+ label.ptr = gtk_label_new(label.text);
+ separator[0] = gtk_hseparator_new();
+ button[1].ptr = gtk_button_new_with_label(button[1].text);
+ button[2].ptr = gtk_button_new_with_label(button[2].text);
+ button[3].ptr = gtk_button_new_with_label(button[3].text);
+ separator[1] = gtk_hseparator_new();
+ button[4].ptr = gtk_button_new_with_label(button[4].text);
+ separator[2] = gtk_hseparator_new();
+ button[0].ptr = gtk_button_new_with_label(button[0].text);
+
+ /* Events */
+ g_signal_connect(button[1].ptr, "clicked",
+ G_CALLBACK(callback_button), (void *)&button[1]);
+ g_signal_connect(button[2].ptr, "clicked",
+ G_CALLBACK(callback_button), (void *)&button[2]);
+ g_signal_connect(button[3].ptr, "clicked",
+ G_CALLBACK(callback_button), (void *)&button[3]);
+ g_signal_connect(button[4].ptr, "clicked",
+ G_CALLBACK(callback_button), (void *)&button[4]);
+ g_signal_connect(button[0].ptr, "clicked",
+ G_CALLBACK(callback_button), (void *)&button[0]);
+
+ /* Container */
+ gtk_container_add(GTK_CONTAINER(window_gui), box);
+
+ /* Box */
+ gtk_box_pack_start(GTK_BOX(box), label.ptr, false, false, 0);
+ gtk_box_pack_start(GTK_BOX(box), separator[0], false, false, 5);
+ gtk_box_pack_start(GTK_BOX(box), button[1].ptr, true, true, 0);
+ gtk_box_pack_start(GTK_BOX(box), button[2].ptr, true, true, 0);
+ gtk_box_pack_start(GTK_BOX(box), button[3].ptr, true, true, 0);
+ gtk_box_pack_start(GTK_BOX(box), separator[1], false, false, 5);
+ gtk_box_pack_start(GTK_BOX(box), button[4].ptr, true, true, 0);
+ gtk_box_pack_start(GTK_BOX(box), separator[2], false, false, 5);
+ gtk_box_pack_start(GTK_BOX(box), button[0].ptr, true, true, 0);
+
+ /* Show */
+ gtk_widget_show(label.ptr);
+ gtk_widget_show(separator[0]);
+ gtk_widget_show(button[1].ptr);
+ gtk_widget_show(button[2].ptr);
+ gtk_widget_show(button[3].ptr);
+ gtk_widget_show(separator[1]);
+ gtk_widget_show(button[4].ptr);
+ gtk_widget_show(separator[2]);
+ gtk_widget_show(button[0].ptr);
+ gtk_widget_show(box);
+ gtk_widget_show(window_gui);
- /* Menu loop */
- int sw;
- sw = alx_menu(h, w, N, mnu, "SELECT LEVEL:");
+ /* GTK loop */
+ sw = 0;
+ gtk_main();
+
+ /* Clear window */
+ gtk_widget_destroy(box);
/* Selection */
switch (sw) {
case 1:
menu_iface_variables.level = GAME_IFACE_LEVEL_BEGINNER;
break;
-
case 2:
menu_iface_variables.level = GAME_IFACE_LEVEL_INTERMEDIATE;
break;
-
case 3:
menu_iface_variables.level = GAME_IFACE_LEVEL_EXPERT;
break;
-
case 4:
menu_iface_variables.level = GAME_IFACE_LEVEL_CUSTOM;
- menu_tui_custom();
+ menu_gui_custom();
break;
}
-
}
-static void menu_tui_custom (void)
+static void menu_gui_custom (void)
{
- /* Menu dimensions & options */
- WINDOW *win;
- int h;
- int w;
- int r;
- int c;
- h = 16;
- w = 76;
- r = 1;
- c = (80 - w) / 2;
- int N;
- N = 4;
- struct Alx_Menu mnu[4] = {
- {8, 4, "[0] Back"},
- {2, 4, "[1] Change rows:"},
- {4, 4, "[2] Change columns:"},
- {6, 4, "[3] Change proportion of mines:"}
- };
-
- /* Input box */
- int w2;
- int r2;
- w2 = w - 8;
- r2 = r + h - 5;
- char *txt[] = {
- "Rows:",
- "Columns:",
- "Proportion:"
- };
-
- /* Menu */
- win = newwin(h, w, r, c);
+ bool wh;
+ int sw;
+ GtkWidget *box;
+ GtkWidget *separator[3];
+ struct Label_Data label;
+ struct Button_Data button [4];
+
+ /* Text */
+ sprintf(label.text, "Custom");
+ sprintf(button[0].text, "Back");
+
+ /* Data */
+ button[1].num = 1;
+ button[2].num = 2;
+ button[3].num = 3;
+ button[0].num = 0;
+ button[1].sw = &sw;
+ button[2].sw = &sw;
+ button[3].sw = &sw;
+ button[0].sw = &sw;
/* Menu loop */
- bool wh;
- int sw;
wh = true;
while (wh) {
- mvwprintw(win, mnu[1].r, mnu[1].c, "%s rows\t\t(%i)", mnu[1].t, menu_iface_variables.rows);
- mvwprintw(win, mnu[2].r, mnu[2].c, "%s cols\t\t(%i)", mnu[2].t, menu_iface_variables.cols);
- mvwprintw(win, mnu[3].r, mnu[3].c, "%s p\t(%lf)", mnu[3].t, menu_iface_variables.p);
- wrefresh(win);
+ /* Text */
+ sprintf(button[1].text, "Change rows: rows\t\t(%i)", menu_iface_variables.rows);
+ sprintf(button[2].text, "Change columns: cols\t(%i)", menu_iface_variables.cols);
+ sprintf(button[3].text, "Change proportion of mines: p\t(%lf)", menu_iface_variables.p);
+
+ /* Generate widgets */
+ box = gtk_vbox_new(false, 0);
+ label.ptr = gtk_label_new(label.text);
+ separator[0] = gtk_hseparator_new();
+ button[1].ptr = gtk_button_new_with_label(button[1].text);
+ button[2].ptr = gtk_button_new_with_label(button[2].text);
+ separator[1] = gtk_hseparator_new();
+ button[3].ptr = gtk_button_new_with_label(button[3].text);
+ separator[2] = gtk_hseparator_new();
+ button[0].ptr = gtk_button_new_with_label(button[0].text);
+
+ /* Events */
+ g_signal_connect(button[1].ptr, "clicked",
+ G_CALLBACK(callback_button), (void *)&button[1]);
+ g_signal_connect(button[2].ptr, "clicked",
+ G_CALLBACK(callback_button), (void *)&button[2]);
+ g_signal_connect(button[3].ptr, "clicked",
+ G_CALLBACK(callback_button), (void *)&button[3]);
+ g_signal_connect(button[0].ptr, "clicked",
+ G_CALLBACK(callback_button), (void *)&button[0]);
+
+ /* Container */
+ gtk_container_add(GTK_CONTAINER(window_gui), box);
+
+ /* Box */
+ gtk_box_pack_start(GTK_BOX(box), label.ptr, false, false, 0);
+ gtk_box_pack_start(GTK_BOX(box), separator[0], false, false, 5);
+ gtk_box_pack_start(GTK_BOX(box), button[1].ptr, true, true, 0);
+ gtk_box_pack_start(GTK_BOX(box), button[2].ptr, true, true, 0);
+ gtk_box_pack_start(GTK_BOX(box), separator[1], false, false, 5);
+ gtk_box_pack_start(GTK_BOX(box), button[3].ptr, true, true, 0);
+ gtk_box_pack_start(GTK_BOX(box), separator[2], false, false, 5);
+ gtk_box_pack_start(GTK_BOX(box), button[0].ptr, true, true, 0);
+
+ /* Show */
+ gtk_widget_show(label.ptr);
+ gtk_widget_show(separator[0]);
+ gtk_widget_show(button[1].ptr);
+ gtk_widget_show(button[2].ptr);
+ gtk_widget_show(separator[1]);
+ gtk_widget_show(button[3].ptr);
+ gtk_widget_show(separator[2]);
+ gtk_widget_show(button[0].ptr);
+ gtk_widget_show(box);
+ gtk_widget_show(window_gui);
+
+ /* GTK loop */
+ sw = 0;
+ gtk_main();
/* Selection */
- sw = alx_menu_2(win, N, mnu, "Custom:");
-
switch (sw) {
case 0:
wh = false;
break;
-
case 1:
- menu_iface_variables.rows = alx_w_getint(w2, r2,
- txt[sw - 1], 2, menu_iface_variables.rows, ROWS_TUI_MAX, NULL);
+// menu_iface_variables.rows = alx_w_getint(w2, r2,
+// txt[sw - 1], 2, menu_iface_variables.rows, ROWS_TUI_MAX, NULL);
break;
-
case 2:
- menu_iface_variables.cols = alx_w_getint(w2, r2,
- txt[sw - 1], 2, menu_iface_variables.cols, COLS_TUI_MAX, NULL);
+// menu_iface_variables.cols = alx_w_getint(w2, r2,
+// txt[sw - 1], 2, menu_iface_variables.cols, COLS_TUI_MAX, NULL);
break;
-
case 3:
- menu_iface_variables.p = alx_w_getdbl(w2, r2,
- txt[sw - 1], 0, menu_iface_variables.p, 1, NULL);
+// menu_iface_variables.p = alx_w_getdbl(w2, r2,
+// txt[sw - 1], 0, menu_iface_variables.p, 1, NULL);
break;
}
+ /* Clear window */
+ gtk_widget_destroy(box);
}
-
- /* Cleanup */
- alx_win_del(win);
}
-static void menu_tui_devel (void)
+static void menu_gui_devel (void)
{
- WINDOW *win;
- int h;
- int w;
- int r;
- int c;
- h = 12;
- w = 50;
- r = 1;
- c = (80 - w) / 2;
- int N;
- N = 2;
- struct Alx_Menu mnu[2] = {
- {5, 4, "[0] Back"},
- {2, 4, "[1] Change seed (srand)"}
- };
-
- /* Input box */
- int w2;
- int r2;
- w2 = w - 8;
- r2 = r + h - 5;
- char *txt[] = {"Seed:"};
-
- /* Menu */
- win = newwin(h, w, r, c);
+ bool wh;
+ int sw;
+ GtkWidget *box;
+ GtkWidget *separator[2];
+ struct Label_Data label;
+ struct Button_Data button [2];
+
+ /* Text */
+ sprintf(label.text, "DEVELOPER OPTIONS");
+ sprintf(button[1].text, "Change seed (srand)");
+ sprintf(button[0].text, "Back");
+
+ /* Data */
+ button[1].num = 1;
+ button[0].num = 0;
+ button[1].sw = &sw;
+ button[0].sw = &sw;
/* Menu loop */
- bool wh;
- int sw;
- wh = true;
int seed;
+ wh = true;
while (wh) {
- /* Selection */
- sw = alx_menu_2(win, N, mnu, "DEVELOPER OPTIONS:");
+ /* Generate widgets */
+ box = gtk_vbox_new(false, 0);
+ label.ptr = gtk_label_new(label.text);
+ separator[0] = gtk_hseparator_new();
+ button[1].ptr = gtk_button_new_with_label(button[1].text);
+ separator[1] = gtk_hseparator_new();
+ button[0].ptr = gtk_button_new_with_label(button[0].text);
+
+ /* Events */
+ g_signal_connect(button[1].ptr, "clicked",
+ G_CALLBACK(callback_button), (void *)&button[1]);
+ g_signal_connect(button[0].ptr, "clicked",
+ G_CALLBACK(callback_button), (void *)&button[0]);
+
+ /* Container */
+ gtk_container_add(GTK_CONTAINER(window_gui), box);
+
+ /* Box */
+ gtk_box_pack_start(GTK_BOX(box), label.ptr, false, false, 0);
+ gtk_box_pack_start(GTK_BOX(box), separator[0], false, false, 5);
+ gtk_box_pack_start(GTK_BOX(box), button[1].ptr, true, true, 0);
+ gtk_box_pack_start(GTK_BOX(box), separator[1], false, false, 5);
+ gtk_box_pack_start(GTK_BOX(box), button[0].ptr, true, true, 0);
+
+ /* Show */
+ gtk_widget_show(label.ptr);
+ gtk_widget_show(separator[0]);
+ gtk_widget_show(button[1].ptr);
+ gtk_widget_show(separator[1]);
+ gtk_widget_show(button[0].ptr);
+ gtk_widget_show(box);
+ gtk_widget_show(window_gui);
+
+ /* GTK loop */
+ sw = 0;
+ gtk_main();
+ /* Selection */
switch (sw) {
case 0:
wh = false;
break;
-
case 1:
- seed = alx_w_getint(w2, r2, txt[0],
- -INFINITY, 1, INFINITY, NULL);
+// seed = alx_w_getint(w2, r2, txt[0],
+// -INFINITY, 1, INFINITY, NULL);
srand(seed);
break;
}
- }
- /* Cleanup */
- alx_win_del(win);
+ /* Clear window */
+ gtk_widget_destroy(box);
+ }
}
-#endif
/******************************************************************************
diff --git a/modules/menu/src/menu_iface.c b/modules/menu/src/menu_iface.c
index 19ce393..5322194 100644
--- a/modules/menu/src/menu_iface.c
+++ b/modules/menu/src/menu_iface.c
@@ -59,6 +59,21 @@ void menu_iface_init_iface (void)
}
}
+void menu_iface_cleanup (void)
+{
+ switch (menu_iface_mode) {
+ case MENU_IFACE_CLUI:
+ break;
+
+ case MENU_IFACE_TUI:
+ break;
+
+ case MENU_IFACE_GUI:
+ menu_gui_cleanup();
+ break;
+ }
+}
+
void menu_iface_board (int *level, int *rows, int *cols, int *mines)
{
*level = menu_iface_variables.level;
diff --git a/modules/player/inc/player_gui.h b/modules/player/inc/player_gui.h
new file mode 100644
index 0000000..5aa15a6
--- /dev/null
+++ b/modules/player/inc/player_gui.h
@@ -0,0 +1,81 @@
+/******************************************************************************
+ * Copyright (C) 2015 Alejandro Colomar Andrés *
+ ******************************************************************************/
+
+
+/******************************************************************************
+ ******* include guard ********************************************************
+ ******************************************************************************/
+# ifndef MSW_PLAYER_GUI_H
+ # define MSW_PLAYER_GUI_H
+
+
+/******************************************************************************
+ ******* headers **************************************************************
+ ******************************************************************************/
+ /* struct Game_Iface_... */
+ #include "game_iface.h"
+
+ #include "player_iface.h"
+
+
+/******************************************************************************
+ ******* enums ****************************************************************
+ ******************************************************************************/
+ enum Player_GUI_Char {
+ PLAYER_GUI_CHAR_KBOOM = '#',
+ PLAYER_GUI_CHAR_HIDDEN_FIELD = '+',
+ PLAYER_GUI_CHAR_HIDDEN_MINE = '*',
+ PLAYER_GUI_CHAR_HIDDEN_SAFE = '-',
+ PLAYER_GUI_CHAR_SAFE_MINE = 'v',
+ PLAYER_GUI_CHAR_0 = ' ',
+ PLAYER_GUI_CHAR_1 = '1',
+ PLAYER_GUI_CHAR_2 = '2',
+ PLAYER_GUI_CHAR_3 = '3',
+ PLAYER_GUI_CHAR_4 = '4',
+ PLAYER_GUI_CHAR_5 = '5',
+ PLAYER_GUI_CHAR_6 = '6',
+ PLAYER_GUI_CHAR_7 = '7',
+ PLAYER_GUI_CHAR_8 = '8',
+ PLAYER_GUI_CHAR_FLAG = '!',
+ PLAYER_GUI_CHAR_FLAG_FALSE = 'F',
+ PLAYER_GUI_CHAR_POSSIBLE = '?',
+ PLAYER_GUI_CHAR_POSSIBLE_FALSE = 'f'
+ };
+
+
+/******************************************************************************
+ ******* variables ************************************************************
+ ******************************************************************************/
+
+
+/******************************************************************************
+ ******* functions ************************************************************
+ ******************************************************************************/
+void player_gui_init (void);
+
+int player_gui_start (struct Player_Iface_Position *position,
+ const char *title,
+ const char *subtitle,
+ int *action);
+
+int player_gui (const struct Game_Iface_Out *board,
+ struct Player_Iface_Position *position,
+ const char *title,
+ const char *subtitle,
+ int *action);
+
+void player_gui_save_name (const char *filepath, char *filename);
+void player_gui_score_name (char *player_name);
+void player_gui_cleanup (void);
+
+
+/******************************************************************************
+ ******* include guard ********************************************************
+ ******************************************************************************/
+# endif /* player_gui.h */
+
+
+/******************************************************************************
+ ******* end of file **********************************************************
+ ******************************************************************************/
diff --git a/modules/player/obj/Makefile b/modules/player/obj/Makefile
index 0af8225..70bce1f 100644
--- a/modules/player/obj/Makefile
+++ b/modules/player/obj/Makefile
@@ -7,17 +7,18 @@
LIBALX_INC_DIR = $(LIBALX_DIR)/inc/
GAME_INC_DIR = $(GAME_DIR)/inc/
+MENU_INC_DIR = $(MENU_DIR)/inc/
INC_DIR = $(PLAY_DIR)/inc/
SRC_DIR = $(PLAY_DIR)/src/
# dependencies
-_ALL = player_iface.o player_clui.o player_tui.o
+_ALL = player_iface.o player_clui.o player_tui.o player_gui.o
ALL = $(_ALL) player_mod.o
PLAYI_INC_GAME = game_iface.h
-PLAYI_INC = player_iface.h player_clui.h player_tui.h
+PLAYI_INC = player_iface.h player_clui.h player_tui.h player_gui.h
PLAYI_DEPS = $(SRC_DIR)/player_iface.c \
$(patsubst %,$(INC_DIR)/%,$(PLAYI_INC)) \
$(patsubst %,$(GAME_INC_DIR)/%,$(PLAYI_INC_GAME))
@@ -38,11 +39,22 @@ PLAYTUI_INC = player_tui.h player_iface.h
PLAYTUI_DEPS = $(SRC_DIR)/player_tui.c \
$(patsubst %,$(INC_DIR)/%,$(PLAYTUI_INC)) \
$(patsubst %,$(LIBALX_INC_DIR)/%,$(PLAYTUI_INC_LIBALX)) \
- $(patsubst %,$(GAME_INC_DIR)/%,$(PLAYCLUI_INC_GAME))
+ $(patsubst %,$(GAME_INC_DIR)/%,$(PLAYTUI_INC_GAME))
PLAYTUI_INC_DIRS = -I $(INC_DIR) \
-I $(LIBALX_INC_DIR) \
-I $(GAME_INC_DIR)
+PLAYGUI_INC_GAME = game_iface.h
+PLAYGUI_INC_MENU = menu_gui.h
+PLAYGUI_INC = player_gui.h player_iface.h
+PLAYGUI_DEPS = $(SRC_DIR)/player_gui.c \
+ $(patsubst %,$(INC_DIR)/%,$(PLAYGUI_INC)) \
+ $(patsubst %,$(GAME_INC_DIR)/%,$(PLAYGUI_INC_GAME)) \
+ $(patsubst %,$(MENU_INC_DIR)/%,$(PLAYGUI_INC_MENU))
+PLAYGUI_INC_DIRS = -I $(INC_DIR) \
+ -I $(GAME_INC_DIR) \
+ -I $(MENU_INC_DIR)
+
# target: dependencies
# action
@@ -67,6 +79,10 @@ player_tui.o: $(PLAYTUI_DEPS)
$(Q)$(CC) $(CFLAGS) $(PLAYTUI_INC_DIRS) -c $< -o $@
@echo "\tCC $@"
+player_gui.o: $(PLAYGUI_DEPS)
+ $(Q)$(CC) $(CFLAGS) $(PLAYGUI_INC_DIRS) -c $< -o $@
+ @echo "\tCC $@"
+
clean:
$(Q)rm -f *.o
diff --git a/modules/player/src/player_gui.c b/modules/player/src/player_gui.c
new file mode 100644
index 0000000..e49e7d2
--- /dev/null
+++ b/modules/player/src/player_gui.c
@@ -0,0 +1,933 @@
+/******************************************************************************
+ * Copyright (C) 2015 Alejandro Colomar Andrés *
+ ******************************************************************************/
+
+
+/******************************************************************************
+ ******* headers **************************************************************
+ ******************************************************************************/
+/* * * * * * * * * *
+ * * * Standard * * * * * *
+ * * * * * * * * * */
+ #include <gtk/gtk.h>
+ /* true & false */
+ #include <stdbool.h>
+ /* strcpy() */
+ #include <string.h>
+
+/* * * * * * * * * *
+ * * * Other * * * * * * *
+ * * * * * * * * * */
+ /* struct Game_Iface_Out */
+ #include "game_iface.h"
+ /* window_gui */
+ #include "menu_gui.h"
+
+ /* struct Player_Iface_Position */
+ #include "player_iface.h"
+
+ #include "player_gui.h"
+
+
+/******************************************************************************
+ ******* macros ***************************************************************
+ ******************************************************************************/
+ # define REFRESH_TIME_MS (100)
+
+
+/******************************************************************************
+ ******* enums ****************************************************************
+ ******************************************************************************/
+enum Buttons {
+ BTN_CH_OFF = 0,
+ BTN_CH_1,
+ BTN_CH_2,
+ BTN_PAUSE,
+ BTN_SAVE,
+ BTN_QUIT,
+ BTN_QTTY
+};
+
+
+/******************************************************************************
+ ******* structs **************************************************************
+ ******************************************************************************/
+struct Field_Data {
+ GtkWidget *ptr;
+ char ch;
+ int r;
+ int c;
+ int *row;
+ int *col;
+ int *act;
+};
+
+struct Button_Data {
+ GtkWidget *ptr;
+ char text [80];
+ int val;
+ int *act;
+};
+
+struct Label_Data {
+ GtkWidget *ptr;
+ char text [80];
+};
+
+
+/******************************************************************************
+ ******* variables ************************************************************
+ ******************************************************************************/
+static struct Field_Data field [ROWS_GUI_MAX] [COLS_GUI_MAX];
+static struct Button_Data button [BTN_QTTY];
+static GtkWidget *box;
+static GtkWidget *box_board;
+static GtkWidget *box_board_in;
+static GtkWidget *box_board_tab;
+static GtkWidget *table_board;
+static GtkWidget *box_help;
+static GtkWidget *box_help_in;
+static int last_help;
+
+
+/******************************************************************************
+ ******* static functions *****************************************************
+ ******************************************************************************/
+ /* Start */
+static void show_board_start(struct Player_Iface_Position *position,
+ const char *title,
+ const char *subtitle,
+ int *action);
+
+static void board_loop_start(struct Player_Iface_Position *position,
+ int *action);
+
+ /* Play */
+static void show_board (const struct Game_Iface_Out *board,
+ struct Player_Iface_Position *position,
+ const char *title,
+ const char *subtitle,
+ int *action);
+
+static void board_loop (const struct Game_Iface_Out *board,
+ struct Player_Iface_Position *position,
+ int *action);
+
+static char set_char (int game_iface_visible);
+static void show_char (struct Field_Data *field);
+ /* Input */
+static gboolean callback_field (GtkWidget *widget,
+ GdkEventButton *event,
+ void *data);
+static void callback_button (GtkWidget *widget,
+ void *data);
+#if 0
+static int usr_input (void);
+#endif
+ /* Help */
+static void show_help (const struct Game_Iface_Out *board,
+ int *action);
+static void show_help_start (int *action);
+static void show_help_play (int *action);
+static void show_help_pause (int *action);
+static void show_help_xyzzy (int *action);
+static void show_help_cheat (int *action);
+static void show_help_safe (int *action);
+static void show_help_gameover (int *action);
+
+
+/******************************************************************************
+ ******* main *****************************************************************
+ ******************************************************************************/
+void player_gui_init (void)
+{
+ GtkWidget *separator;
+
+ box = gtk_hbox_new(false, 0);
+ gtk_container_add(GTK_CONTAINER(window_gui), box);
+
+ /* Text */
+ sprintf(button[BTN_CH_OFF].text, "Cheats off");
+ sprintf(button[BTN_CH_1].text, "Cheat 1");
+ sprintf(button[BTN_CH_2].text, "Cheat 2");
+ sprintf(button[BTN_PAUSE].text, "Pause");
+ sprintf(button[BTN_SAVE].text, "Save");
+ sprintf(button[BTN_QUIT].text, "Quit");
+
+ /* Data */
+ button[BTN_CH_OFF].val = PLAYER_IFACE_ACT_XYZZY_OFF;
+ button[BTN_CH_1].val = PLAYER_IFACE_ACT_XYZZY_LIN;
+ button[BTN_CH_2].val = PLAYER_IFACE_ACT_XYZZY_P;
+ button[BTN_PAUSE].val = PLAYER_IFACE_ACT_PAUSE;
+ button[BTN_SAVE].val = PLAYER_IFACE_ACT_SAVE;
+ button[BTN_QUIT].val = PLAYER_IFACE_ACT_QUIT;
+
+ box_help = gtk_vbox_new(true, 0);
+ box_help_in = gtk_vbox_new(false, 0);
+ separator = gtk_vseparator_new();
+ box_board = gtk_vbox_new(false, 0);
+ box_board_in = gtk_vbox_new(false, 0);
+
+ gtk_box_pack_start(GTK_BOX(box), box_help, false, false, 5);
+ gtk_box_pack_start(GTK_BOX(box_help), box_help_in, false, false, 5);
+ gtk_box_pack_start(GTK_BOX(box), separator, false, false, 5);
+ gtk_box_pack_start(GTK_BOX(box), box_board, true, true, 5);
+ gtk_box_pack_start(GTK_BOX(box_board), box_board_in, true, true, 5);
+
+ /* Refresh */
+ gtk_widget_show_all(window_gui);
+
+
+// wtimeout(win_board, REFRESH_TIME_MS);
+}
+
+int player_gui_start (struct Player_Iface_Position *position,
+ const char *title,
+ const char *subtitle,
+ int *action)
+{
+ show_help_start(action);
+ show_board_start(position, title, subtitle, action);
+
+ /* Refresh */
+ gtk_widget_show_all(window_gui);
+
+ gtk_main();
+
+ return 0;
+}
+
+int player_gui (const struct Game_Iface_Out *board,
+ struct Player_Iface_Position *position,
+ const char *title,
+ const char *subtitle,
+ int *action)
+{
+ show_help(board, action);
+ show_board(board, position, title, subtitle, action);
+
+ /* Refresh */
+ gtk_widget_show_all(window_gui);
+
+ gtk_main();
+
+ return 0;
+}
+
+void player_gui_save_name (const char *filepath, char *filename)
+{
+#if 0
+ /* Input box */
+ int w;
+ int r;
+ w = 60;
+ r = 10;
+
+ /* Request name */
+ alx_w_getfname(filepath, filename, false, w, r, "File name:", NULL);
+#endif
+}
+
+void player_gui_score_name (char *player_name)
+{
+#if 0
+ /* Input box */
+ int w;
+ int r;
+ w = 60;
+ r = 10;
+
+ /* Request name */
+ alx_w_getstr(player_name, w, r, "Your name:", NULL);
+#endif
+}
+
+void player_gui_cleanup (void)
+{
+ /* Del box */
+ gtk_widget_destroy(box);
+}
+
+
+/******************************************************************************
+ ******* static functions *****************************************************
+ ******************************************************************************/
+/* * * * * * * * * *
+ * * * Start * * * * * * *
+ * * * * * * * * * */
+static void show_board_start(struct Player_Iface_Position *position,
+ const char *title,
+ const char *subtitle,
+ int *action)
+{
+ GtkWidget *separator[2];
+ struct Label_Data label[2];
+
+ /* Clear */
+ gtk_widget_destroy(box_board_in);
+
+ /* Box */
+ box_board_in = gtk_vbox_new(false, 0);
+ gtk_box_pack_start(GTK_BOX(box_board), box_board_in, false, false, 5);
+
+ /* Title */
+ strcpy(label[0].text, title);
+ label[0].ptr = gtk_label_new(label[0].text);
+ gtk_box_pack_start(GTK_BOX(box_board_in), label[0].ptr, false, false, 0);
+
+ /* Separator */
+ separator[0] = gtk_hseparator_new();
+ gtk_box_pack_start(GTK_BOX(box_board_in), separator[0], false, false, 5);
+
+ /* Board */
+ table_board = gtk_table_new(position->rows, position->cols, true);
+ gtk_box_pack_start(GTK_BOX(box_board_in), table_board, true, true, 5);
+ board_loop_start(position, action);
+
+ /* Separator */
+ separator[1] = gtk_hseparator_new();
+ gtk_box_pack_start(GTK_BOX(box_board_in), separator[1], false, false, 5);
+
+ /* Subtitle */
+ strcpy(label[1].text, subtitle);
+ label[1].ptr = gtk_label_new(label[1].text);
+ gtk_box_pack_start(GTK_BOX(box_board_in), label[1].ptr, false, false, 0);
+}
+
+static void board_loop_start(struct Player_Iface_Position *position,
+ int *action)
+{
+ int i;
+ int j;
+ char ch;
+
+ ch = PLAYER_GUI_CHAR_HIDDEN_FIELD;
+
+ for (i = 0; i < position->rows; i++) {
+
+ /* hidden */
+ for (j = 0; j < position->cols; j++) {
+ field[i][j].r = i;
+ field[i][j].c = j;
+ field[i][j].row = &(position->row);
+ field[i][j].col = &(position->col);
+ field[i][j].act = action;
+
+ field[i][j].ch = ch;
+
+ /* Show char*/
+ show_char(&field[i][j]);
+ }
+ }
+}
+
+/* * * * * * * * * *
+ * * * Play * * * * * *
+ * * * * * * * * * */
+static void show_board (const struct Game_Iface_Out *board,
+ struct Player_Iface_Position *position,
+ const char *title,
+ const char *subtitle,
+ int *action)
+{
+ GtkWidget *separator[2];
+ struct Label_Data label[2];
+
+ /* Clear */
+ gtk_widget_destroy(box_board_in);
+
+ /* Box */
+ box_board_in = gtk_vbox_new(false, 0);
+ gtk_box_pack_start(GTK_BOX(box_board), box_board_in, false, false, 5);
+
+ /* Title */
+ strcpy(label[0].text, title);
+ label[0].ptr = gtk_label_new(label[0].text);
+ gtk_box_pack_start(GTK_BOX(box_board_in), label[0].ptr, false, false, 0);
+
+ /* Separator */
+ separator[0] = gtk_hseparator_new();
+ gtk_box_pack_start(GTK_BOX(box_board_in), separator[0], false, false, 5);
+
+ /* Board */
+ table_board = gtk_table_new(position->rows, position->cols, true);
+ gtk_box_pack_start(GTK_BOX(box_board_in), table_board, true, true, 5);
+ board_loop(board, position, action);
+
+ /* Separator */
+ separator[1] = gtk_hseparator_new();
+ gtk_box_pack_start(GTK_BOX(box_board_in), separator[1], false, false, 5);
+
+ /* Subtitle */
+ strcpy(label[1].text, subtitle);
+ label[1].ptr = gtk_label_new(label[1].text);
+ gtk_box_pack_start(GTK_BOX(box_board_in), label[1].ptr, false, false, 0);
+}
+
+static void board_loop (const struct Game_Iface_Out *board,
+ struct Player_Iface_Position *position,
+ int *action)
+{
+ int i;
+ int j;
+
+ for (i = 0; i < board->rows; i++) {
+ for (j = 0; j < board->cols; j++) {
+ field[i][j].r = i;
+ field[i][j].c = j;
+ field[i][j].row = &(position->row);
+ field[i][j].col = &(position->col);
+ field[i][j].act = action;
+
+ field[i][j].ch = set_char(board->visible[i][j]);
+
+ show_char(&field[i][j]);
+ }
+ }
+}
+
+static char set_char (int game_iface_visible)
+{
+ char ch;
+ switch (game_iface_visible) {
+ case GAME_IFACE_VIS_KBOOM:
+ ch = PLAYER_GUI_CHAR_KBOOM;
+ break;
+
+ case GAME_IFACE_VIS_HIDDEN_FIELD:
+ ch = PLAYER_GUI_CHAR_HIDDEN_FIELD;
+ break;
+
+ case GAME_IFACE_VIS_HIDDEN_MINE:
+ ch = PLAYER_GUI_CHAR_HIDDEN_MINE;
+ break;
+
+ case GAME_IFACE_VIS_HIDDEN_SAFE:
+ ch = PLAYER_GUI_CHAR_HIDDEN_SAFE;
+ break;
+
+ case GAME_IFACE_VIS_SAFE_MINE:
+ ch = PLAYER_GUI_CHAR_SAFE_MINE;
+ break;
+
+ case GAME_IFACE_VIS_0:
+ ch = PLAYER_GUI_CHAR_0;
+ break;
+
+ case GAME_IFACE_VIS_1:
+ ch = PLAYER_GUI_CHAR_1;
+ break;
+
+ case GAME_IFACE_VIS_2:
+ ch = PLAYER_GUI_CHAR_2;
+ break;
+
+ case GAME_IFACE_VIS_3:
+ ch = PLAYER_GUI_CHAR_3;
+ break;
+
+ case GAME_IFACE_VIS_4:
+ ch = PLAYER_GUI_CHAR_4;
+ break;
+
+ case GAME_IFACE_VIS_5:
+ ch = PLAYER_GUI_CHAR_5;
+ break;
+
+ case GAME_IFACE_VIS_6:
+ ch = PLAYER_GUI_CHAR_6;
+ break;
+
+ case GAME_IFACE_VIS_7:
+ ch = PLAYER_GUI_CHAR_7;
+ break;
+
+ case GAME_IFACE_VIS_8:
+ ch = PLAYER_GUI_CHAR_8;
+ break;
+
+ case GAME_IFACE_VIS_FLAG:
+ ch = PLAYER_GUI_CHAR_FLAG;
+ break;
+
+ case GAME_IFACE_VIS_FLAG_FALSE:
+ ch = PLAYER_GUI_CHAR_FLAG_FALSE;
+ break;
+
+ case GAME_IFACE_VIS_POSSIBLE:
+ ch = PLAYER_GUI_CHAR_POSSIBLE;
+ break;
+
+ case GAME_IFACE_VIS_POSSIBLE_FALSE:
+ ch = PLAYER_GUI_CHAR_POSSIBLE_FALSE;
+ break;
+ }
+
+ return ch;
+}
+
+static void show_char (struct Field_Data *field)
+{
+ char text [2];
+ sprintf(text, "%c", field->ch);
+ field->ptr = gtk_button_new_with_label(text);
+ g_signal_connect(field->ptr, "button-press-event",
+ G_CALLBACK(callback_field), (void *)field);
+ gtk_table_attach_defaults(GTK_TABLE(table_board), field->ptr,
+ field->c, field->c + 1, field->r, field->r + 1);
+}
+
+/* * * * * * * * * *
+ * * * Input * * * * * * *
+ * * * * * * * * * */
+static gboolean callback_field (GtkWidget *widget,
+ GdkEventButton *event,
+ void *data)
+{
+ struct Field_Data *field_ij;
+ field_ij = ((struct Field_Data *)data);
+
+ *(field_ij->row) = field_ij->r;
+ *(field_ij->col) = field_ij->c;
+
+ if (event->type == GDK_BUTTON_PRESS && event->button == 3) {
+ //3 is right mouse btn
+ *(field_ij->act) = PLAYER_IFACE_ACT_FLAG;
+
+ } else if (event->type == GDK_BUTTON_PRESS && event->button == 1) {
+ //1 is left mouse btn
+ *(field_ij->act) = PLAYER_IFACE_ACT_STEP;
+ }
+
+ gtk_main_quit();
+
+ return false;
+}
+
+static void callback_button (GtkWidget *widget,
+ void *data)
+{
+ struct Button_Data *button;
+ button = ((struct Button_Data *)data);
+
+ *(button->act) = button->val;
+
+ gtk_main_quit();
+}
+
+#if 0
+static int usr_input (void)
+{
+ char ch;
+ ch = wgetch(win_board);
+
+ int action;
+
+ switch (ch) {
+ case '+':
+ case '\r':
+ case '\n':
+ action = PLAYER_IFACE_ACT_STEP;
+ break;
+
+ case ' ':
+ action = PLAYER_IFACE_ACT_FLAG;
+ break;
+
+ case 'f':
+ action = PLAYER_IFACE_ACT_FLAG_POSSIBLE;
+ break;
+
+ /* ASCII 0x08 is BS */
+ case KEY_BACKSPACE:
+ case 0x08:
+ action = PLAYER_IFACE_ACT_RM_FLAG;
+ break;
+
+
+ case KEY_BREAK:
+ case 'p':
+ action = PLAYER_IFACE_ACT_PAUSE;
+ break;
+
+ case 's':
+ action = PLAYER_IFACE_ACT_SAVE;
+ break;
+
+ case 'x':
+ /* Wait for special sequence "xyzzy" */
+ wtimeout(win_board, 1000);
+
+ ch = wgetch(win_board);
+ if (ch == 'y') {
+ ch = wgetch(win_board);
+ if (ch == 'z') {
+
+ ch = wgetch(win_board);
+ if (ch == 'z') {
+
+ ch = wgetch(win_board);
+ if (ch == 'y') {
+ action = PLAYER_IFACE_ACT_XYZZY_ON;
+ }
+ }
+ }
+ }
+
+ /* Resume */
+ wtimeout(win_board, REFRESH_TIME_MS);
+ break;
+
+ case '0':
+ action = PLAYER_IFACE_ACT_XYZZY_OFF;
+ break;
+
+ case '1':
+ action = PLAYER_IFACE_ACT_XYZZY_LIN;
+ break;
+
+ case '2':
+ action = PLAYER_IFACE_ACT_XYZZY_P;
+ break;
+
+ case '3':
+ action = PLAYER_IFACE_ACT_XYZZY_NP;
+ break;
+
+ case 'q':
+ action = PLAYER_IFACE_ACT_QUIT;
+ break;
+
+
+ case KEY_LEFT:
+ case 'h':
+ action = PLAYER_IFACE_ACT_MOVE_LEFT;
+ break;
+
+ case KEY_DOWN:
+ case 'j':
+ action = PLAYER_IFACE_ACT_MOVE_DOWN;
+ break;
+
+ case KEY_UP:
+ case 'k':
+ action = PLAYER_IFACE_ACT_MOVE_UP;
+ break;
+
+ case KEY_RIGHT:
+ case 'l':
+ action = PLAYER_IFACE_ACT_MOVE_RIGHT;
+ break;
+
+ case 'c':
+ action = PLAYER_IFACE_ACT_HIGHLIGHT;
+ break;
+
+ default:
+ action = PLAYER_IFACE_ACT_FOO;
+ break;
+ }
+
+ return action;
+}
+#endif
+
+/* * * * * * * * * *
+ * * * Help * * * * * * *
+ * * * * * * * * * */
+static void show_help (const struct Game_Iface_Out *board,
+ int *action)
+{
+ if (last_help != board->state) {
+ /* Clear */
+ gtk_widget_destroy(box_help_in);
+
+ /* Box help */
+ box_help_in = gtk_vbox_new(false, 0);
+ gtk_box_pack_start(GTK_BOX(box_help), box_help_in, false, false, 5);
+
+ switch (board->state) {
+ case GAME_IFACE_STATE_PLAYING:
+ show_help_play(action);
+ break;
+
+ case GAME_IFACE_STATE_PAUSE:
+ show_help_pause(action);
+ break;
+
+ case GAME_IFACE_STATE_XYZZY:
+ show_help_xyzzy(action);
+ break;
+
+ case GAME_IFACE_STATE_CHEATED:
+ show_help_cheat(action);
+ break;
+
+ case GAME_IFACE_STATE_SAFE:
+ show_help_safe(action);
+ break;
+
+ case GAME_IFACE_STATE_GAMEOVER:
+ show_help_gameover(action);
+ break;
+ }
+
+ /* Update last_help */
+ last_help = board->state;
+ }
+}
+
+static void show_help_start (int *action)
+{
+ GtkWidget *separator [5];
+
+ /* Clear */
+ gtk_widget_destroy(box_help_in);
+
+ /* Box help */
+ box_help_in = gtk_vbox_new(false, 0);
+ gtk_box_pack_start(GTK_BOX(box_help), box_help_in, false, false, 5);
+
+ /* Data */
+ button[BTN_QUIT].act = action;
+
+ /* Generate widgets */
+ separator[0] = gtk_hseparator_new();
+ separator[1] = gtk_hseparator_new();
+ separator[2] = gtk_hseparator_new();
+ separator[3] = gtk_hseparator_new();
+ separator[4] = gtk_hseparator_new();
+ button[BTN_QUIT].ptr = gtk_button_new_with_label(button[BTN_QUIT].text);
+
+ /* Events */
+ g_signal_connect(button[BTN_QUIT].ptr, "clicked",
+ G_CALLBACK(callback_button), (void *)&button[BTN_QUIT]);
+
+ /* Box */
+ gtk_box_pack_start(GTK_BOX(box_help_in), separator[0], false, false, 25);
+ gtk_box_pack_start(GTK_BOX(box_help_in), separator[1], false, false, 25);
+ gtk_box_pack_start(GTK_BOX(box_help_in), separator[2], false, false, 25);
+ gtk_box_pack_start(GTK_BOX(box_help_in), separator[3], false, false, 25);
+ gtk_box_pack_start(GTK_BOX(box_help_in), separator[4], false, false, 25);
+ gtk_box_pack_start(GTK_BOX(box_help_in), button[BTN_QUIT].ptr, false, false, 0);
+
+ /* Show */
+ gtk_widget_show(separator[0]);
+ gtk_widget_show(separator[1]);
+ gtk_widget_show(separator[2]);
+ gtk_widget_show(separator[3]);
+ gtk_widget_show(separator[4]);
+ gtk_widget_show(button[BTN_QUIT].ptr);
+
+ /* Update last_help */
+ last_help = GAME_IFACE_STATE_FOO;
+}
+
+static void show_help_play (int *action)
+{
+ GtkWidget *separator [3];
+
+ /* Text */
+ sprintf(button[BTN_PAUSE].text, "Pause");
+
+ /* Data */
+ button[BTN_PAUSE].act = action;
+ button[BTN_SAVE].act = action;
+ button[BTN_QUIT].act = action;
+
+ /* Generate widgets */
+ separator[0] = gtk_hseparator_new();
+ separator[1] = gtk_hseparator_new();
+ separator[2] = gtk_hseparator_new();
+ button[BTN_PAUSE].ptr = gtk_button_new_with_label(button[BTN_PAUSE].text);
+ button[BTN_SAVE].ptr = gtk_button_new_with_label(button[BTN_SAVE].text);
+ button[BTN_QUIT].ptr = gtk_button_new_with_label(button[BTN_QUIT].text);
+
+ /* Events */
+ g_signal_connect(button[BTN_PAUSE].ptr, "clicked",
+ G_CALLBACK(callback_button), (void *)&button[BTN_PAUSE]);
+ g_signal_connect(button[BTN_SAVE].ptr, "clicked",
+ G_CALLBACK(callback_button), (void *)&button[BTN_SAVE]);
+ g_signal_connect(button[BTN_QUIT].ptr, "clicked",
+ G_CALLBACK(callback_button), (void *)&button[BTN_QUIT]);
+
+ /* Box */
+ gtk_box_pack_start(GTK_BOX(box_help_in), separator[0], false, false, 25);
+ gtk_box_pack_start(GTK_BOX(box_help_in), separator[1], false, false, 25);
+ gtk_box_pack_start(GTK_BOX(box_help_in), separator[2], false, false, 25);
+ gtk_box_pack_start(GTK_BOX(box_help_in), button[BTN_PAUSE].ptr, false, false, 0);
+ gtk_box_pack_start(GTK_BOX(box_help_in), button[BTN_SAVE].ptr, false, false, 0);
+ gtk_box_pack_start(GTK_BOX(box_help_in), button[BTN_QUIT].ptr, false, false, 0);
+}
+
+static void show_help_pause (int *action)
+{
+ GtkWidget *separator [3];
+
+ /* Text */
+ sprintf(button[BTN_PAUSE].text, "Continue");
+
+ /* Data */
+ button[BTN_PAUSE].act = action;
+ button[BTN_SAVE].act = action;
+ button[BTN_QUIT].act = action;
+
+ /* Generate widgets */
+ separator[0] = gtk_hseparator_new();
+ separator[1] = gtk_hseparator_new();
+ separator[2] = gtk_hseparator_new();
+ button[BTN_PAUSE].ptr = gtk_button_new_with_label(button[BTN_PAUSE].text);
+ button[BTN_SAVE].ptr = gtk_button_new_with_label(button[BTN_SAVE].text);
+ button[BTN_QUIT].ptr = gtk_button_new_with_label(button[BTN_QUIT].text);
+
+ /* Events */
+ g_signal_connect(button[BTN_PAUSE].ptr, "clicked",
+ G_CALLBACK(callback_button), (void *)&button[BTN_PAUSE]);
+ g_signal_connect(button[BTN_SAVE].ptr, "clicked",
+ G_CALLBACK(callback_button), (void *)&button[BTN_SAVE]);
+ g_signal_connect(button[BTN_QUIT].ptr, "clicked",
+ G_CALLBACK(callback_button), (void *)&button[BTN_QUIT]);
+
+ /* Box */
+ gtk_box_pack_start(GTK_BOX(box_help_in), separator[0], false, false, 25);
+ gtk_box_pack_start(GTK_BOX(box_help_in), separator[1], false, false, 25);
+ gtk_box_pack_start(GTK_BOX(box_help_in), separator[2], false, false, 25);
+ gtk_box_pack_start(GTK_BOX(box_help_in), button[BTN_PAUSE].ptr, false, false, 0);
+ gtk_box_pack_start(GTK_BOX(box_help_in), button[BTN_SAVE].ptr, false, false, 0);
+ gtk_box_pack_start(GTK_BOX(box_help_in), button[BTN_QUIT].ptr, false, false, 0);
+}
+
+static void show_help_xyzzy (int *action)
+{
+ GtkWidget *separator;
+
+ /* Data */
+ button[BTN_CH_OFF].act = action;
+ button[BTN_CH_1].act = action;
+ button[BTN_CH_2].act = action;
+ button[BTN_SAVE].act = action;
+ button[BTN_QUIT].act = action;
+
+ /* Generate widgets */
+ button[BTN_CH_OFF].ptr = gtk_button_new_with_label(button[BTN_CH_OFF].text);
+ button[BTN_CH_1].ptr = gtk_button_new_with_label(button[BTN_CH_1].text);
+ button[BTN_CH_2].ptr = gtk_button_new_with_label(button[BTN_CH_2].text);
+ separator = gtk_hseparator_new();
+ button[BTN_SAVE].ptr = gtk_button_new_with_label(button[BTN_SAVE].text);
+ button[BTN_QUIT].ptr = gtk_button_new_with_label(button[BTN_QUIT].text);
+
+ /* Events */
+ g_signal_connect(button[BTN_CH_OFF].ptr, "clicked",
+ G_CALLBACK(callback_button), (void *)&button[BTN_CH_OFF]);
+ g_signal_connect(button[BTN_CH_1].ptr, "clicked",
+ G_CALLBACK(callback_button), (void *)&button[BTN_CH_1]);
+ g_signal_connect(button[BTN_CH_2].ptr, "clicked",
+ G_CALLBACK(callback_button), (void *)&button[BTN_CH_2]);
+ g_signal_connect(button[BTN_SAVE].ptr, "clicked",
+ G_CALLBACK(callback_button), (void *)&button[BTN_SAVE]);
+ g_signal_connect(button[BTN_QUIT].ptr, "clicked",
+ G_CALLBACK(callback_button), (void *)&button[BTN_QUIT]);
+
+ /* Box */
+ gtk_box_pack_start(GTK_BOX(box_help_in), button[BTN_CH_OFF].ptr, false, false, 0);
+ gtk_box_pack_start(GTK_BOX(box_help_in), button[BTN_CH_1].ptr, false, false, 0);
+ gtk_box_pack_start(GTK_BOX(box_help_in), button[BTN_CH_2].ptr, false, false, 0);
+ gtk_box_pack_start(GTK_BOX(box_help_in), separator, false, false, 25);
+ gtk_box_pack_start(GTK_BOX(box_help_in), button[BTN_SAVE].ptr, false, false, 0);
+ gtk_box_pack_start(GTK_BOX(box_help_in), button[BTN_QUIT].ptr, false, false, 0);
+}
+
+static void show_help_cheat (int *action)
+{
+ GtkWidget *separator [4];
+
+ /* Data */
+ button[BTN_SAVE].act = action;
+ button[BTN_QUIT].act = action;
+
+ /* Generate widgets */
+ separator[0] = gtk_hseparator_new();
+ separator[1] = gtk_hseparator_new();
+ separator[2] = gtk_hseparator_new();
+ separator[3] = gtk_hseparator_new();
+ button[BTN_SAVE].ptr = gtk_button_new_with_label(button[BTN_SAVE].text);
+ button[BTN_QUIT].ptr = gtk_button_new_with_label(button[BTN_QUIT].text);
+
+ /* Events */
+ g_signal_connect(button[BTN_SAVE].ptr, "clicked",
+ G_CALLBACK(callback_button), (void *)&button[BTN_SAVE]);
+ g_signal_connect(button[BTN_QUIT].ptr, "clicked",
+ G_CALLBACK(callback_button), (void *)&button[BTN_QUIT]);
+
+ /* Box */
+ gtk_box_pack_start(GTK_BOX(box_help_in), separator[0], false, false, 25);
+ gtk_box_pack_start(GTK_BOX(box_help_in), separator[1], false, false, 25);
+ gtk_box_pack_start(GTK_BOX(box_help_in), separator[2], false, false, 25);
+ gtk_box_pack_start(GTK_BOX(box_help_in), separator[3], false, false, 25);
+ gtk_box_pack_start(GTK_BOX(box_help_in), button[BTN_SAVE].ptr, false, false, 0);
+ gtk_box_pack_start(GTK_BOX(box_help_in), button[BTN_QUIT].ptr, false, false, 0);
+}
+
+static void show_help_safe (int *action)
+{
+ GtkWidget *separator [4];
+
+ /* Data */
+ button[BTN_SAVE].act = action;
+ button[BTN_QUIT].act = action;
+
+ /* Generate widgets */
+ separator[0] = gtk_hseparator_new();
+ separator[1] = gtk_hseparator_new();
+ separator[2] = gtk_hseparator_new();
+ separator[3] = gtk_hseparator_new();
+ button[BTN_SAVE].ptr = gtk_button_new_with_label(button[BTN_SAVE].text);
+ button[BTN_QUIT].ptr = gtk_button_new_with_label(button[BTN_QUIT].text);
+
+ /* Events */
+ g_signal_connect(button[BTN_SAVE].ptr, "clicked",
+ G_CALLBACK(callback_button), (void *)&button[BTN_SAVE]);
+ g_signal_connect(button[BTN_QUIT].ptr, "clicked",
+ G_CALLBACK(callback_button), (void *)&button[BTN_QUIT]);
+
+ /* Box */
+ gtk_box_pack_start(GTK_BOX(box_help_in), separator[0], false, false, 25);
+ gtk_box_pack_start(GTK_BOX(box_help_in), separator[1], false, false, 25);
+ gtk_box_pack_start(GTK_BOX(box_help_in), separator[2], false, false, 25);
+ gtk_box_pack_start(GTK_BOX(box_help_in), separator[3], false, false, 25);
+ gtk_box_pack_start(GTK_BOX(box_help_in), button[BTN_SAVE].ptr, false, false, 0);
+ gtk_box_pack_start(GTK_BOX(box_help_in), button[BTN_QUIT].ptr, false, false, 0);
+}
+
+static void show_help_gameover (int *action)
+{
+ GtkWidget *separator [5];
+
+ /* Data */
+ button[BTN_QUIT].act = action;
+
+ /* Generate widgets */
+ separator[0] = gtk_hseparator_new();
+ separator[1] = gtk_hseparator_new();
+ separator[2] = gtk_hseparator_new();
+ separator[3] = gtk_hseparator_new();
+ separator[4] = gtk_hseparator_new();
+ button[BTN_QUIT].ptr = gtk_button_new_with_label(button[BTN_QUIT].text);
+
+ /* Events */
+ g_signal_connect(button[BTN_QUIT].ptr, "clicked",
+ G_CALLBACK(callback_button), (void *)&button[BTN_QUIT]);
+
+ /* Box */
+ gtk_box_pack_start(GTK_BOX(box_help_in), separator[0], false, false, 25);
+ gtk_box_pack_start(GTK_BOX(box_help_in), separator[1], false, false, 25);
+ gtk_box_pack_start(GTK_BOX(box_help_in), separator[2], false, false, 25);
+ gtk_box_pack_start(GTK_BOX(box_help_in), separator[3], false, false, 25);
+ gtk_box_pack_start(GTK_BOX(box_help_in), separator[4], false, false, 25);
+ gtk_box_pack_start(GTK_BOX(box_help_in), button[BTN_QUIT].ptr, false, false, 0);
+}
+
+
+/******************************************************************************
+ ******* end of file **********************************************************
+ ******************************************************************************/
diff --git a/modules/player/src/player_iface.c b/modules/player/src/player_iface.c
index 83edc99..6cdc4ad 100644
--- a/modules/player/src/player_iface.c
+++ b/modules/player/src/player_iface.c
@@ -22,6 +22,8 @@
#include "player_clui.h"
/* game_tui() */
#include "player_tui.h"
+ /* game_gui() */
+ #include "player_gui.h"
#include "player_iface.h"
@@ -84,6 +86,10 @@ void player_iface_init (int rows, int cols)
case PLAYER_IFACE_TUI:
player_tui_init(rows, cols);
break;
+
+ case PLAYER_IFACE_GUI:
+ player_gui_init();
+ break;
}
}
@@ -114,6 +120,11 @@ int player_iface_start (int *pos_row, int *pos_col)
player_tui_start(&player_iface_position,
title, subtitle, &player_action);
break;
+
+ case PLAYER_IFACE_GUI:
+ player_gui_start(&player_iface_position,
+ title, subtitle, &player_action);
+ break;
}
player_iface_act_start(player_action);
@@ -189,6 +200,11 @@ void player_iface (const struct Game_Iface_Out *game_iface_out,
player_tui(game_iface_out, &player_iface_position,
title, subtitle, &player_action);
break;
+
+ case PLAYER_IFACE_GUI:
+ player_gui(game_iface_out, &player_iface_position,
+ title, subtitle, &player_action);
+ break;
}
player_iface_act(game_iface_in, player_action);
@@ -204,6 +220,10 @@ void player_iface_save_name (const char *filepath, char *filename)
case PLAYER_IFACE_TUI:
player_tui_save_name(filepath, filename);
break;
+
+ case PLAYER_IFACE_GUI:
+ player_gui_save_name(filepath, filename);
+ break;
}
}
@@ -217,6 +237,10 @@ void player_iface_score_name (char *player_name)
case PLAYER_IFACE_TUI:
player_tui_score_name(player_name);
break;
+
+ case PLAYER_IFACE_GUI:
+ player_gui_score_name(player_name);
+ break;
}
}
@@ -229,6 +253,10 @@ void player_iface_cleanup (void)
case PLAYER_IFACE_TUI:
player_tui_cleanup();
break;
+
+ case PLAYER_IFACE_GUI:
+ player_gui_cleanup();
+ break;
}
fflush(stdout);
}
diff --git a/modules/save/src/score.c b/modules/save/src/score.c
index f2b0062..337cdcf 100644
--- a/modules/save/src/score.c
+++ b/modules/save/src/score.c
@@ -244,7 +244,7 @@ static void read_scores_file (char *file_name)
/* Print */
printf("%s\n\t", name);
printf("%4i/%2i/%2i %i %i:%02i:%02i \t%s\n\n",
- year, mon, day,
+ year, 1 + mon, day,
clicks,
hours, mins, secs,
file);
diff --git a/src/main.c b/src/main.c
index 0698866..edbce96 100644
--- a/src/main.c
+++ b/src/main.c
@@ -91,6 +91,9 @@ void init_all (int *argc, char *(*argv[]))
void cleanup (void)
{
+ /* Clean iface */
+ menu_iface_cleanup();
+
/* End curses */
alx_resume_curses();
alx_end_curses();