gtkentrycompletion: Perform event handling on popup through controllers
authorCarlos Garnacho <carlosg@gnome.org>
Fri, 8 Jun 2018 11:18:34 +0000 (13:18 +0200)
committerCarlos Garnacho <carlosg@gnome.org>
Thu, 21 Jun 2018 10:54:03 +0000 (12:54 +0200)
Instead of a ::event signal handler.

gtk/gtkentrycompletion.c

index a47d3cdaa66f908e1e719bc96c435d7a5a0012e4..8493bb3880f4a34ae67a3f71ee75603753cb43bd 100644 (file)
@@ -83,6 +83,8 @@
 #include "gtkentry.h"
 #include "gtkmain.h"
 #include "gtkmarshalers.h"
+#include "gtkgesturemultipress.h"
+#include "gtkeventcontrollerkey.h"
 
 #include "gtkprivate.h"
 #include "gtkwindowprivate.h"
@@ -139,9 +141,6 @@ static void     gtk_entry_completion_dispose             (GObject      *object);
 static gboolean gtk_entry_completion_visible_func        (GtkTreeModel       *model,
                                                           GtkTreeIter        *iter,
                                                           gpointer            data);
-static gboolean gtk_entry_completion_popup_event         (GtkWidget          *widget,
-                                                          GdkEvent           *event,
-                                                          gpointer            user_data);
 static void     gtk_entry_completion_list_activated      (GtkTreeView        *treeview,
                                                           GtkTreePath        *path,
                                                           GtkTreeViewColumn  *column,
@@ -489,6 +488,18 @@ gtk_entry_completion_init (GtkEntryCompletion *completion)
   priv->filter_model = NULL;
 }
 
+static gboolean
+propagate_to_entry (GtkEventControllerKey *key,
+                    guint                  keyval,
+                    guint                  keycode,
+                    GdkModifierType        modifiers,
+                    GtkEntryCompletion    *completion)
+{
+  GtkEntryCompletionPrivate *priv = completion->priv;
+
+  return gtk_event_controller_key_forward (key, priv->entry);
+}
+
 static void
 gtk_entry_completion_constructed (GObject *object)
 {
@@ -497,6 +508,7 @@ gtk_entry_completion_constructed (GObject *object)
   GtkCellRenderer           *cell;
   GtkTreeSelection          *sel;
   GtkWidget                 *popup_frame;
+  GtkEventController        *controller;
 
   G_OBJECT_CLASS (gtk_entry_completion_parent_class)->constructed (object);
 
@@ -570,9 +582,18 @@ gtk_entry_completion_constructed (GObject *object)
   gtk_window_set_type_hint (GTK_WINDOW(priv->popup_window),
                             GDK_SURFACE_TYPE_HINT_COMBO);
 
-  g_signal_connect (priv->popup_window, "event",
-                    G_CALLBACK (gtk_entry_completion_popup_event),
-                    completion);
+  controller = gtk_event_controller_key_new ();
+  g_signal_connect (controller, "key-pressed",
+                    G_CALLBACK (propagate_to_entry), completion);
+  g_signal_connect (controller, "key-released",
+                    G_CALLBACK (propagate_to_entry), completion);
+  gtk_widget_add_controller (priv->popup_window, controller);
+
+  controller = GTK_EVENT_CONTROLLER (gtk_gesture_multi_press_new ());
+  g_signal_connect_swapped (controller, "released",
+                            G_CALLBACK (_gtk_entry_completion_popdown),
+                            completion);
+  gtk_widget_add_controller (priv->popup_window, controller);
 
   popup_frame = gtk_frame_new (NULL);
   gtk_frame_set_shadow_type (GTK_FRAME (popup_frame),
@@ -864,37 +885,6 @@ gtk_entry_completion_visible_func (GtkTreeModel *model,
   return ret;
 }
 
-static gboolean
-gtk_entry_completion_popup_event (GtkWidget *widget,
-                                  GdkEvent  *event,
-                                  gpointer   user_data)
-{
-  GtkEntryCompletion *completion = GTK_ENTRY_COMPLETION (user_data);
-
-  if (gdk_event_get_event_type (event) == GDK_KEY_PRESS ||
-      gdk_event_get_event_type (event) == GDK_KEY_RELEASE)
-    {
-      if (!gtk_widget_get_mapped (completion->priv->popup_window))
-        return GDK_EVENT_PROPAGATE;
-
-      /* propagate event to the entry */
-      gtk_widget_event (completion->priv->entry, (GdkEvent *)event);
-
-      return GDK_EVENT_STOP;
-    }
-
-  if (gdk_event_get_event_type (event) != GDK_BUTTON_PRESS)
-    return GDK_EVENT_PROPAGATE;
-
-  if (!gtk_widget_get_mapped (completion->priv->popup_window))
-    return GDK_EVENT_PROPAGATE;
-
-  /* if we come here, it's usually time to popdown */
-  _gtk_entry_completion_popdown (completion);
-
-  return GDK_EVENT_STOP;
-}
-
 static void
 gtk_entry_completion_list_activated (GtkTreeView       *treeview,
                                      GtkTreePath       *path,