[gtk/wip/ebassi/shortcut: 41/85] treeview: Redo event forwarding hack
- From: Emmanuele Bassi <ebassi src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/wip/ebassi/shortcut: 41/85] treeview: Redo event forwarding hack
- Date: Fri, 31 Jan 2020 16:03:17 +0000 (UTC)
commit 6ab8feaffd467070ff0188f2e661391bc2cbf5ac
Author: Benjamin Otte <otte redhat com>
Date: Sun Aug 12 21:32:42 2018 +0200
treeview: Redo event forwarding hack
Reorder the event controllers so that key forwarding to the search
entries really happens after shortcut triggering.
gtk/gtktreeview.c | 72 +++++++++++++++++++++++++++----------------------------
1 file changed, 35 insertions(+), 37 deletions(-)
---
diff --git a/gtk/gtktreeview.c b/gtk/gtktreeview.c
index 33b6520d95..471171e537 100644
--- a/gtk/gtktreeview.c
+++ b/gtk/gtktreeview.c
@@ -22,7 +22,6 @@
#include "gtkadjustmentprivate.h"
#include "gtkbox.h"
-#include "gtkbindings.h"
#include "gtkbuildable.h"
#include "gtkbutton.h"
#include "gtkcelllayout.h"
@@ -53,6 +52,7 @@
#include "gtkrendericonprivate.h"
#include "gtkscrollable.h"
#include "gtksettingsprivate.h"
+#include "gtkshortcutcontroller.h"
#include "gtksnapshot.h"
#include "gtkstylecontextprivate.h"
#include "gtktooltip.h"
@@ -657,16 +657,16 @@ static void gtk_tree_view_size_allocate (GtkWidget *widget,
static void gtk_tree_view_snapshot (GtkWidget *widget,
GtkSnapshot *snapshot);
+static gboolean gtk_tree_view_forward_controller_key_pressed (GtkEventControllerKey *key,
+ guint keyval,
+ guint keycode,
+ GdkModifierType state,
+ GtkTreeView *tree_view);
static gboolean gtk_tree_view_key_controller_key_pressed (GtkEventControllerKey *key,
guint keyval,
guint keycode,
GdkModifierType state,
GtkTreeView *tree_view);
-static void gtk_tree_view_key_controller_key_released (GtkEventControllerKey *key,
- guint keyval,
- guint keycode,
- GdkModifierType state,
- GtkTreeView *tree_view);
static void gtk_tree_view_key_controller_focus_out (GtkEventControllerKey *key,
GdkCrossingMode mode,
GdkNotifyType detail,
@@ -1702,6 +1702,7 @@ gtk_tree_view_init (GtkTreeView *tree_view)
GtkCssNode *widget_node;
GtkGesture *gesture;
GtkEventController *controller;
+ GList *list, *controllers;
gtk_widget_set_can_focus (GTK_WIDGET (tree_view), TRUE);
gtk_widget_set_overflow (GTK_WIDGET (tree_view), GTK_OVERFLOW_HIDDEN);
@@ -1779,6 +1780,24 @@ gtk_tree_view_init (GtkTreeView *tree_view)
GTK_PHASE_CAPTURE);
gtk_widget_add_controller (GTK_WIDGET (tree_view), GTK_EVENT_CONTROLLER (gesture));
+ controller = gtk_event_controller_key_new ();
+ g_signal_connect (controller, "key-pressed",
+ G_CALLBACK (gtk_tree_view_forward_controller_key_pressed), tree_view);
+ gtk_widget_add_controller (GTK_WIDGET (tree_view), controller);
+
+ controllers = _gtk_widget_list_controllers (GTK_WIDGET (tree_view), GTK_PHASE_BUBBLE);
+ for (list = controllers; list; list = list->next)
+ {
+ if (GTK_IS_SHORTCUT_CONTROLLER (list->data))
+ {
+ g_object_ref (list->data);
+ gtk_widget_remove_controller (GTK_WIDGET (tree_view), list->data);
+ gtk_widget_add_controller (GTK_WIDGET (tree_view), list->data);
+ break;
+ }
+ }
+ g_list_free (controllers);
+
tree_view->drag_gesture = gtk_gesture_drag_new ();
g_signal_connect (tree_view->drag_gesture, "drag-begin",
G_CALLBACK (gtk_tree_view_drag_gesture_begin), tree_view);
@@ -1811,8 +1830,6 @@ gtk_tree_view_init (GtkTreeView *tree_view)
controller = gtk_event_controller_key_new ();
g_signal_connect (controller, "key-pressed",
G_CALLBACK (gtk_tree_view_key_controller_key_pressed), tree_view);
- g_signal_connect (controller, "key-released",
- G_CALLBACK (gtk_tree_view_key_controller_key_released), tree_view);
g_signal_connect (controller, "focus-out",
G_CALLBACK (gtk_tree_view_key_controller_focus_out), tree_view);
gtk_widget_add_controller (GTK_WIDGET (tree_view), controller);
@@ -5290,7 +5307,6 @@ gtk_tree_view_key_controller_key_pressed (GtkEventControllerKey *key,
{
GtkWidget *widget = GTK_WIDGET (tree_view);
GtkWidget *button;
- GdkEvent *event;
if (tree_view->rubber_band_status)
{
@@ -5410,17 +5426,17 @@ gtk_tree_view_key_controller_key_pressed (GtkEventControllerKey *key,
}
}
- /* Handle the keybindings. */
- event = gtk_get_current_event ();
- if (gtk_bindings_activate_event (G_OBJECT (widget), (GdkEventKey *)event))
- {
- g_object_unref (event);
- return TRUE;
- }
-
- g_object_unref (event);
+ return FALSE;
+}
- if (tree_view->search_entry_avoid_unhandled_binding)
+static gboolean
+gtk_tree_view_forward_controller_key_pressed (GtkEventControllerKey *key,
+ guint keyval,
+ guint keycode,
+ GdkModifierType state,
+ GtkTreeView *tree_view)
+{
+ if (tree_view->priv->search_entry_avoid_unhandled_binding)
{
tree_view->search_entry_avoid_unhandled_binding = FALSE;
return FALSE;
@@ -5458,24 +5474,6 @@ gtk_tree_view_key_controller_key_pressed (GtkEventControllerKey *key,
return FALSE;
}
-static void
-gtk_tree_view_key_controller_key_released (GtkEventControllerKey *key,
- guint keyval,
- guint keycode,
- GdkModifierType state,
- GtkTreeView *tree_view)
-{
- GdkEvent *event;
-
- if (tree_view->rubber_band_status)
- return;
-
- /* Handle the keybindings. */
- event = gtk_get_current_event ();
- gtk_bindings_activate_event (G_OBJECT (tree_view), (GdkEventKey *)event);
- g_object_unref (event);
-}
-
static void
gtk_tree_view_motion_controller_enter (GtkEventControllerMotion *controller,
double x,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]