Make menus accessible from the keyboard in the Gtk front-end.
[sgt/puzzles] / gtk.c
diff --git a/gtk.c b/gtk.c
index 5f2ef22..5761e8d 100644 (file)
--- a/gtk.c
+++ b/gtk.c
 #include "puzzles.h"
 
 #if GTK_CHECK_VERSION(2,0,0)
-#define USE_PANGO
+# define USE_PANGO
+# ifdef PANGO_VERSION_CHECK
+#  if PANGO_VERSION_CHECK(1,8,0)
+#   define HAVE_SENSIBLE_ABSOLUTE_SIZE_FUNCTION
+#  endif
+# endif
+#endif
+#if !GTK_CHECK_VERSION(2,4,0)
+# define OLD_FILESEL
 #endif
 
 #ifdef DEBUGGING
@@ -123,7 +131,9 @@ struct frontend {
     int paste_data_len;
     int pw, ph;                        /* pixmap size (w, h are area size) */
     int ox, oy;                        /* offset of pixmap in drawing area */
+#ifdef OLD_FILESEL
     char *filesel_name;
+#endif
     int npresets;
     GtkWidget **preset_bullets;
     GtkWidget *preset_custom_bullet;
@@ -536,6 +546,10 @@ static gint key_event(GtkWidget *widget, GdkEventKey *event, gpointer data)
         return TRUE;
 #endif
 
+    /* Handle mnemonics. */
+    if (gtk_window_activate_key(GTK_WINDOW(fe->window), event))
+        return TRUE;
+
     if (event->keyval == GDK_Up)
         keyval = shift | ctrl | CURSOR_UP;
     else if (event->keyval == GDK_KP_Up || event->keyval == GDK_KP_8)
@@ -1288,6 +1302,8 @@ static void menu_copy_event(GtkMenuItem *menuitem, gpointer data)
     }
 }
 
+#ifdef OLD_FILESEL
+
 static void filesel_ok(GtkButton *button, gpointer data)
 {
     frontend *fe = (frontend *)data;
@@ -1329,6 +1345,34 @@ static char *file_selector(frontend *fe, char *title, int save)
     return fe->filesel_name;
 }
 
+#else
+
+static char *file_selector(frontend *fe, char *title, int save)
+{
+    char *filesel_name = NULL;
+
+    GtkWidget *filesel =
+        gtk_file_chooser_dialog_new(title,
+                                   GTK_WINDOW(fe->window),
+                                   save ? GTK_FILE_CHOOSER_ACTION_SAVE :
+                                   GTK_FILE_CHOOSER_ACTION_OPEN,
+                                   GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+                                   save ? GTK_STOCK_SAVE : GTK_STOCK_OPEN,
+                                   GTK_RESPONSE_ACCEPT,
+                                   NULL);
+
+    if (gtk_dialog_run(GTK_DIALOG(filesel)) == GTK_RESPONSE_ACCEPT) {
+        const char *name = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(filesel));
+        filesel_name = dupstr(name);
+    }
+
+    gtk_widget_destroy(filesel);
+
+    return filesel_name;
+}
+
+#endif
+
 struct savefile_write_ctx {
     FILE *fp;
     int error;
@@ -1635,7 +1679,7 @@ static frontend *new_window(char *arg, int argtype, char **error)
     gtk_box_pack_start(vbox, menubar, FALSE, FALSE, 0);
     gtk_widget_show(menubar);
 
-    menuitem = gtk_menu_item_new_with_label("Game");
+    menuitem = gtk_menu_item_new_with_mnemonic("_Game");
     gtk_container_add(GTK_CONTAINER(menubar), menuitem);
     gtk_widget_show(menuitem);
 
@@ -1670,7 +1714,7 @@ static frontend *new_window(char *arg, int argtype, char **error)
         GtkWidget *submenu;
         int i;
 
-        menuitem = gtk_menu_item_new_with_label("Type");
+        menuitem = gtk_menu_item_new_with_mnemonic("_Type");
         gtk_container_add(GTK_CONTAINER(menubar), menuitem);
         gtk_widget_show(menuitem);
 
@@ -1750,7 +1794,7 @@ static frontend *new_window(char *arg, int argtype, char **error)
     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");
+    menuitem = gtk_menu_item_new_with_mnemonic("_Help");
     gtk_container_add(GTK_CONTAINER(menubar), menuitem);
     gtk_widget_show(menuitem);