summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoralex <alex@ASUS>2018-09-16 13:50:17 +0200
committeralex <alex@ASUS>2018-09-16 13:50:17 +0200
commit6a4e8192c2859dbc43ac523966db6bc703ba4a78 (patch)
tree2def2537133dbedcbffb4d91a1ecc28c2c576ef1
parent237978cacde5eb4bdd84181c3b93547412c1a61e (diff)
Add player GUI
-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.h14
-rw-r--r--modules/menu/src/menu_gui.c73
-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
10 files changed, 1128 insertions, 63 deletions
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 1689659..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;
diff --git a/modules/menu/src/menu_gui.c b/modules/menu/src/menu_gui.c
index b71458d..cec54f5 100644
--- a/modules/menu/src/menu_gui.c
+++ b/modules/menu/src/menu_gui.c
@@ -34,20 +34,6 @@
/******************************************************************************
- ******* macros ***************************************************************
- ******************************************************************************/
- # define ROWS_GUI_MAX (22)
-#if (ROWS_GUI_MAX > ROWS_MAX)
-# error "rows max (tui)"
-#endif
-
- # define COLS_GUI_MAX (33)
-#if (COLS_GUI_MAX > COLS_MAX)
-# error "cols max (tui)"
-#endif
-
-
-/******************************************************************************
******* structs **************************************************************
******************************************************************************/
struct Button_Data {
@@ -67,26 +53,27 @@ struct Label_Data {
******* variables ************************************************************
******************************************************************************/
GtkWidget *window_gui;
-bool gui_is_open;
/******************************************************************************
******* static functions *****************************************************
******************************************************************************/
/* Init & cleanup */
-static gboolean delete_event (GtkWidget *widget,
- GdkEvent *event,
- void *data);
+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);
+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);
+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);
/******************************************************************************
@@ -96,10 +83,10 @@ void menu_gui_init (void)
{
/* Window */
window_gui = gtk_window_new(GTK_WINDOW_TOPLEVEL);
- gui_is_open = true;
/* Quit */
- g_signal_connect(window_gui, "delete-event", G_CALLBACK(delete_event), NULL);
+ 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];
@@ -144,7 +131,7 @@ void menu_gui (void)
/* Menu loop */
wh = true;
- while (wh && gui_is_open) {
+ while (wh) {
/* Generate widgets */
box = gtk_vbox_new(false, 0);
@@ -224,20 +211,24 @@ void menu_gui (void)
/* * * * * * * * * *
* * Cleanup * * * * * *
* * * * * * * * * */
-static gboolean delete_event (GtkWidget *widget,
+static gboolean delete_window (GtkWidget *widget,
GdkEvent *event,
void *data)
{
- gui_is_open = false;
g_print ("delete event occurred\n");
gtk_main_quit();
- /*
- * true to block closing
- * the window will be closed by menu_gui_cleanup()
- */
- return true;
+ /* false: send destroy signal */
+ return false;
+}
+
+static void destroy_window (GtkWidget *widget,
+ void *data)
+{
+ g_print ("destroy event occurred\n");
+
+ exit(EXIT_SUCCESS);
}
/* * * * * * * * * *
@@ -249,7 +240,7 @@ static void callback_button (GtkWidget *widget,
struct Button_Data *button;
button = ((struct Button_Data *)data);
-
+
*(button->sw) = button->num;
gtk_main_quit();
@@ -294,7 +285,7 @@ static void menu_gui_continue (void)
/* Menu loop */
wh = true;
- while (wh && gui_is_open) {
+ while (wh) {
/* Text */
sprintf(button[4].text, "Change file name (File: \"%s\")", saved_name);
@@ -374,7 +365,7 @@ static void menu_gui_continue (void)
break;
case 1:
gtk_widget_destroy(box);
-// start_switch();
+ start_switch();
break;
case 2:
gtk_widget_destroy(box);
@@ -614,7 +605,7 @@ static void menu_gui_custom (void)
/* Menu loop */
wh = true;
- while (wh && gui_is_open) {
+ while (wh) {
/* 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);
@@ -717,7 +708,7 @@ static void menu_gui_devel (void)
/* Menu loop */
int seed;
wh = true;
- while (wh && gui_is_open) {
+ while (wh) {
/* Generate widgets */
box = gtk_vbox_new(false, 0);
label.ptr = gtk_label_new(label.text);
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);