X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/puzzles/blobdiff_plain/6f2d8d7c70f6bbf8bce982ced1fa879e967afbbf..3af70dd4f3397d605fe59bddfd89baf95047ea7d:/gtk.c diff --git a/gtk.c b/gtk.c index 66ee767..1e32c6a 100644 --- a/gtk.c +++ b/gtk.c @@ -321,28 +321,36 @@ static gint key_event(GtkWidget *widget, GdkEventKey *event, gpointer data) if (!fe->pixmap) return TRUE; - if (event->string[0] && !event->string[1]) - keyval = (unsigned char)event->string[0]; - else if (event->keyval == GDK_Up || event->keyval == GDK_KP_Up || - event->keyval == GDK_KP_8) + if (event->keyval == GDK_Up) keyval = CURSOR_UP; - else if (event->keyval == GDK_Down || event->keyval == GDK_KP_Down || - event->keyval == GDK_KP_2) + else if (event->keyval == GDK_KP_Up || event->keyval == GDK_KP_8) + keyval = MOD_NUM_KEYPAD | '8'; + else if (event->keyval == GDK_Down) keyval = CURSOR_DOWN; - else if (event->keyval == GDK_Left || event->keyval == GDK_KP_Left || - event->keyval == GDK_KP_4) + else if (event->keyval == GDK_KP_Down || event->keyval == GDK_KP_2) + keyval = MOD_NUM_KEYPAD | '2'; + else if (event->keyval == GDK_Left) keyval = CURSOR_LEFT; - else if (event->keyval == GDK_Right || event->keyval == GDK_KP_Right || - event->keyval == GDK_KP_6) + else if (event->keyval == GDK_KP_Left || event->keyval == GDK_KP_4) + keyval = MOD_NUM_KEYPAD | '4'; + else if (event->keyval == GDK_Right) keyval = CURSOR_RIGHT; + else if (event->keyval == GDK_KP_Right || event->keyval == GDK_KP_6) + keyval = MOD_NUM_KEYPAD | '6'; else if (event->keyval == GDK_KP_Home || event->keyval == GDK_KP_7) - keyval = CURSOR_UP_LEFT; + keyval = MOD_NUM_KEYPAD | '7'; else if (event->keyval == GDK_KP_End || event->keyval == GDK_KP_1) - keyval = CURSOR_DOWN_LEFT; + keyval = MOD_NUM_KEYPAD | '1'; else if (event->keyval == GDK_KP_Page_Up || event->keyval == GDK_KP_9) - keyval = CURSOR_UP_RIGHT; + keyval = MOD_NUM_KEYPAD | '9'; else if (event->keyval == GDK_KP_Page_Down || event->keyval == GDK_KP_3) - keyval = CURSOR_DOWN_RIGHT; + keyval = MOD_NUM_KEYPAD | '3'; + else if (event->keyval == GDK_KP_Insert || event->keyval == GDK_KP_0) + keyval = MOD_NUM_KEYPAD | '0'; + else if (event->keyval == GDK_KP_Begin || event->keyval == GDK_KP_5) + keyval = MOD_NUM_KEYPAD | '5'; + else if (event->string[0] && !event->string[1]) + keyval = (unsigned char)event->string[0]; else keyval = -1; @@ -517,7 +525,7 @@ static int win_key_press(GtkWidget *widget, GdkEventKey *event, gpointer data) return FALSE; } -void error_box(GtkWidget *parent, char *msg) +void message_box(GtkWidget *parent, char *title, char *msg, int centre) { GtkWidget *window, *hbox, *text, *ok; @@ -530,7 +538,7 @@ void error_box(GtkWidget *parent, char *msg) hbox, FALSE, FALSE, 20); gtk_widget_show(text); gtk_widget_show(hbox); - gtk_window_set_title(GTK_WINDOW(window), "Error"); + gtk_window_set_title(GTK_WINDOW(window), title); gtk_label_set_line_wrap(GTK_LABEL(text), TRUE); ok = gtk_button_new_with_label("OK"); gtk_box_pack_end(GTK_BOX(GTK_DIALOG(window)->action_area), @@ -551,6 +559,11 @@ void error_box(GtkWidget *parent, char *msg) gtk_main(); } +void error_box(GtkWidget *parent, char *msg) +{ + message_box(parent, "Error", msg, FALSE); +} + static void config_ok_button_clicked(GtkButton *button, gpointer data) { frontend *fe = (frontend *)data; @@ -913,6 +926,24 @@ static void menu_copy_event(GtkMenuItem *menuitem, gpointer data) } } +static void menu_solve_event(GtkMenuItem *menuitem, gpointer data) +{ + frontend *fe = (frontend *)data; + char *msg; + + msg = midend_solve(fe->me); + + if (msg) + error_box(fe->window, msg); +} + +static void menu_restart_event(GtkMenuItem *menuitem, gpointer data) +{ + frontend *fe = (frontend *)data; + + midend_restart_game(fe->me); +} + static void menu_config_event(GtkMenuItem *menuitem, gpointer data) { frontend *fe = (frontend *)data; @@ -930,6 +961,21 @@ static void menu_config_event(GtkMenuItem *menuitem, gpointer data) fe->h = y; } +static void menu_about_event(GtkMenuItem *menuitem, gpointer data) +{ + frontend *fe = (frontend *)data; + char titlebuf[256]; + char textbuf[1024]; + + sprintf(titlebuf, "About %.200s", thegame.name); + sprintf(textbuf, + "%.200s\n\n" + "from Simon Tatham's Portable Puzzle Collection\n\n" + "%.500s", thegame.name, ver); + + message_box(fe->window, titlebuf, textbuf, TRUE); +} + static GtkWidget *add_menu_item_with_key(frontend *fe, GtkContainer *cont, char *text, int key) { @@ -961,7 +1007,7 @@ static frontend *new_window(char *game_id, char **error) fe->me = midend_new(fe, &thegame); if (game_id) { - *error = midend_game_id(fe->me, game_id, FALSE); + *error = midend_game_id(fe->me, game_id); if (*error) { midend_free(fe->me); sfree(fe); @@ -993,10 +1039,23 @@ static frontend *new_window(char *game_id, char **error) gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), menu); add_menu_item_with_key(fe, GTK_CONTAINER(menu), "New", 'n'); - add_menu_item_with_key(fe, GTK_CONTAINER(menu), "Restart", 'r'); + + menuitem = gtk_menu_item_new_with_label("Restart"); + gtk_container_add(GTK_CONTAINER(menu), menuitem); + gtk_signal_connect(GTK_OBJECT(menuitem), "activate", + GTK_SIGNAL_FUNC(menu_restart_event), fe); + gtk_widget_show(menuitem); menuitem = gtk_menu_item_new_with_label("Specific..."); gtk_object_set_data(GTK_OBJECT(menuitem), "user-data", + GINT_TO_POINTER(CFG_DESC)); + gtk_container_add(GTK_CONTAINER(menu), menuitem); + gtk_signal_connect(GTK_OBJECT(menuitem), "activate", + GTK_SIGNAL_FUNC(menu_config_event), fe); + gtk_widget_show(menuitem); + + menuitem = gtk_menu_item_new_with_label("Random Seed..."); + gtk_object_set_data(GTK_OBJECT(menuitem), "user-data", GINT_TO_POINTER(CFG_SEED)); gtk_container_add(GTK_CONTAINER(menu), menuitem); gtk_signal_connect(GTK_OBJECT(menuitem), "activate", @@ -1050,9 +1109,30 @@ static frontend *new_window(char *game_id, char **error) GTK_SIGNAL_FUNC(menu_copy_event), fe); gtk_widget_show(menuitem); } + if (thegame.can_solve) { + add_menu_separator(GTK_CONTAINER(menu)); + menuitem = gtk_menu_item_new_with_label("Solve"); + gtk_container_add(GTK_CONTAINER(menu), menuitem); + gtk_signal_connect(GTK_OBJECT(menuitem), "activate", + GTK_SIGNAL_FUNC(menu_solve_event), fe); + gtk_widget_show(menuitem); + } add_menu_separator(GTK_CONTAINER(menu)); add_menu_item_with_key(fe, GTK_CONTAINER(menu), "Exit", 'q'); + menuitem = gtk_menu_item_new_with_label("Help"); + gtk_container_add(GTK_CONTAINER(menubar), menuitem); + gtk_widget_show(menuitem); + + menu = gtk_menu_new(); + gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), menu); + + menuitem = gtk_menu_item_new_with_label("About"); + gtk_container_add(GTK_CONTAINER(menu), menuitem); + gtk_signal_connect(GTK_OBJECT(menuitem), "activate", + GTK_SIGNAL_FUNC(menu_about_event), fe); + gtk_widget_show(menuitem); + { int i, ncolours; float *colours; @@ -1156,6 +1236,12 @@ int main(int argc, char **argv) char *pname = argv[0]; char *error; + if (argc > 1 && !strcmp(argv[1], "--version")) { + printf("%s, from Simon Tatham's Portable Puzzle Collection\n%s\n", + thegame.name, ver); + return 0; + } + /* * Special standalone mode for generating puzzle IDs on the * command line. Useful for generating puzzles to be printed @@ -1179,34 +1265,42 @@ int main(int argc, char **argv) */ if (argc > 1 && !strcmp(argv[1], "--generate")) { int n = 1; - char *params = NULL; + char *params = NULL, *seed = NULL; game_params *par; random_state *rs; char *parstr; - { - void *seed; - int seedlen; - get_random_seed(&seed, &seedlen); - rs = random_init(seed, seedlen); - } - if (argc > 2) n = atoi(argv[2]); if (argc > 3) params = argv[3]; - if (params) - par = thegame.decode_params(params); - else - par = thegame.default_params(); - parstr = thegame.encode_params(par); + par = thegame.default_params(); + if (params) { + if ( (seed = strchr(params, '#')) != NULL ) + *seed++ = '\0'; + thegame.decode_params(par, params); + } else { + } + parstr = thegame.encode_params(par, FALSE); + + { + void *seeddata; + int seedlen; + if (seed) { + seeddata = seed; + seedlen = strlen(seed); + } else { + get_random_seed(&seeddata, &seedlen); + } + rs = random_init(seeddata, seedlen); + } while (n-- > 0) { game_aux_info *aux = NULL; - char *seed = thegame.new_seed(par, rs, &aux); - printf("%s:%s\n", parstr, seed); - sfree(seed); + char *desc = thegame.new_desc(par, rs, &aux); + printf("%s:%s\n", parstr, desc); + sfree(desc); if (aux) thegame.free_aux_info(aux); }