Allow dialog boxes to be cancelled by hitting the Escape key.
[pspp] / src / ui / gui / psppire-buttonbox.c
index 12d474559db95417207618ccd055aead1d0385a2..087c105587f7e2c83b7c237208bd01a8bd8ad0fa 100644 (file)
@@ -301,19 +301,37 @@ on_validity_change (GtkWidget *toplevel, gboolean valid, gpointer data)
   gtk_widget_set_sensitive (GTK_WIDGET (bb->button[PSPPIRE_BUTTON_CONTINUE]), valid);
 }
 
+static gboolean
+on_key_press (GtkWidget *w, GdkEventKey *e, gpointer ud)
+{
+  PsppireButtonbox *bb = PSPPIRE_BUTTONBOX (ud);
+  if (e->keyval == GDK_KEY_Escape)
+    {
+      g_signal_emit_by_name (bb->button[PSPPIRE_BUTTON_CANCEL], "activate");
+      g_signal_emit_by_name (bb->button[PSPPIRE_BUTTON_CLOSE], "activate");
+    }
+  return FALSE;
+}
+
+
 static void
 on_realize (GtkWidget *buttonbox, gpointer data)
 {
   GtkWidget *toplevel = gtk_widget_get_toplevel (buttonbox);
 
-  if ( PSPPIRE_IS_DIALOG (toplevel))
+  if (PSPPIRE_IS_DIALOG (toplevel))
     {
       g_signal_connect (toplevel, "validity-changed",
                        G_CALLBACK (on_validity_change), buttonbox);
+
+      g_signal_connect (toplevel, "key-press-event",
+                       G_CALLBACK (on_key_press), buttonbox);
     }
+
   set_default (PSPPIRE_BUTTONBOX (buttonbox));
 }
 
+
 static void
 psppire_button_box_init (PsppireButtonbox *bb)
 {
@@ -419,7 +437,7 @@ psppire_button_flags_get_type (void)
          { PSPPIRE_BUTTON_PASTE_MASK,   "PSPPIRE_BUTTON_PASTE_MASK",    "Accept dialog and paste syntax" },
          { 0, NULL, NULL }
        };
-      
+
       ftype = g_flags_register_static
        (g_intern_static_string ("PsppireButtonFlags"), values);