[gtk+] GtkAssistant: Make Escape cancel the assistant



commit ffe0ec6883d41241c4966584efa95688ae7ace85
Author: Matthias Clasen <mclasen redhat com>
Date:   Mon Sep 8 00:08:01 2014 -0400

    GtkAssistant: Make Escape cancel the assistant
    
    This is an expected keybinding, and it is not hard to support.
    Note that we use a private ::escape signal instead of using
    ::cancel directly, since we want to be able to suppress the
    cancellation when we are on a progress page.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=579625

 gtk/gtkassistant.c |   29 +++++++++++++++++++++++++++++
 1 files changed, 29 insertions(+), 0 deletions(-)
---
diff --git a/gtk/gtkassistant.c b/gtk/gtkassistant.c
index 0e3f7cb..64a8089 100644
--- a/gtk/gtkassistant.c
+++ b/gtk/gtkassistant.c
@@ -205,6 +205,7 @@ enum
   PREPARE,
   APPLY,
   CLOSE,
+  ESCAPE,
   LAST_SIGNAL
 };
 
@@ -363,11 +364,27 @@ gtk_assistant_constructed (GObject *object)
 }
 
 static void
+escape_cb (GtkAssistant *assistant)
+{
+  GtkAssistantPrivate *priv = assistant->priv;
+
+  /* Do not allow cancelling in the middle of a progress page */
+  if (priv->current_page &&
+      (priv->current_page->type != GTK_ASSISTANT_PAGE_PROGRESS ||
+       priv->current_page->complete))
+    g_signal_emit (assistant, signals [CANCEL], 0, NULL);
+
+  /* don't run any user handlers - this is not a public signal */
+  g_signal_stop_emission (assistant, signals[ESCAPE], 0);
+}
+
+static void
 gtk_assistant_class_init (GtkAssistantClass *class)
 {
   GObjectClass *gobject_class;
   GtkWidgetClass *widget_class;
   GtkContainerClass *container_class;
+  GtkBindingSet *binding_set;
 
   gobject_class   = (GObjectClass *) class;
   widget_class    = (GtkWidgetClass *) class;
@@ -474,6 +491,18 @@ gtk_assistant_class_init (GtkAssistantClass *class)
                   g_cclosure_marshal_VOID__VOID,
                   G_TYPE_NONE, 0);
 
+  signals[ESCAPE] =
+    g_signal_new_class_handler (I_("escape"),
+                                G_TYPE_FROM_CLASS (gobject_class),
+                                G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
+                                G_CALLBACK (escape_cb),
+                                NULL, NULL,
+                                g_cclosure_marshal_VOID__VOID,
+                                G_TYPE_NONE, 0);
+
+  binding_set = gtk_binding_set_by_class (class);
+  gtk_binding_entry_add_signal (binding_set, GDK_KEY_Escape, 0, "escape", 0);
+
   /**
    * GtkAssistant:use-header-bar:
    *


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]