summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2018-06-26 19:34:38 +0200
committerCarlos Garnacho <carlosg@gnome.org>2018-07-30 13:14:12 +0200
commit6d3eb185786a6b9ad6118fd30a3c16c00ad57ebc (patch)
tree5ff10c96b764abb10d63f5a2a62b4311eca04cac
parentd301695ba16ab971baf3e13ae99c1183319c0949 (diff)
downloadgtk+-6d3eb185786a6b9ad6118fd30a3c16c00ad57ebc.tar.gz
gtktreeview: Use key controller on search entry handling
Use a distinct key controller so we correctly handle navigation across matches and search cancellation. As the events are forwarded to the search_window, those need to be pushed down the entry manually.
-rw-r--r--gtk/gtktreeview.c59
1 files changed, 32 insertions, 27 deletions
diff --git a/gtk/gtktreeview.c b/gtk/gtktreeview.c
index 32d44fbee5..18d17e406e 100644
--- a/gtk/gtktreeview.c
+++ b/gtk/gtktreeview.c
@@ -815,9 +815,11 @@ static void gtk_tree_view_search_scroll_event (GtkWidget *entry
gdouble dx,
gdouble dy,
GtkTreeView *tree_view);
-static gboolean gtk_tree_view_search_event (GtkWidget *entry,
- GdkEvent *event,
- GtkTreeView *tree_view);
+static gboolean gtk_tree_view_search_key_pressed (GtkEventControllerKey *key,
+ guint keyval,
+ guint keycode,
+ GdkModifierType state,
+ GtkTreeView *tree_view);
static gboolean gtk_tree_view_search_move (GtkWidget *window,
GtkTreeView *tree_view,
gboolean up);
@@ -2106,8 +2108,8 @@ gtk_tree_view_destroy (GtkWidget *widget)
g_signal_handlers_disconnect_by_func (tree_view->priv->search_entry,
G_CALLBACK (gtk_tree_view_search_init),
tree_view);
- g_signal_handlers_disconnect_by_func (tree_view->priv->search_entry,
- G_CALLBACK (gtk_tree_view_search_event),
+ g_signal_handlers_disconnect_by_func (gtk_entry_get_key_controller (GTK_ENTRY (tree_view->priv->search_entry)),
+ G_CALLBACK (gtk_tree_view_search_key_pressed),
tree_view);
g_object_unref (tree_view->priv->search_entry);
@@ -10190,9 +10192,12 @@ gtk_tree_view_ensure_interactive_directory (GtkTreeView *tree_view)
gtk_window_set_transient_for (GTK_WINDOW (tree_view->priv->search_window),
GTK_WINDOW (toplevel));
- g_signal_connect (tree_view->priv->search_window, "event",
- G_CALLBACK (gtk_tree_view_search_event),
+ controller = gtk_event_controller_key_new ();
+ g_signal_connect (controller, "key-pressed",
+ G_CALLBACK (gtk_tree_view_search_key_pressed),
tree_view);
+ gtk_widget_add_controller (tree_view->priv->search_window, controller);
+
gesture = gtk_gesture_multi_press_new ();
g_signal_connect (gesture, "pressed",
G_CALLBACK (gtk_tree_view_search_pressed_cb), tree_view);
@@ -13651,8 +13656,9 @@ gtk_tree_view_set_search_entry (GtkTreeView *tree_view,
tree_view->priv->search_entry_changed_id);
tree_view->priv->search_entry_changed_id = 0;
}
- g_signal_handlers_disconnect_by_func (tree_view->priv->search_entry,
- G_CALLBACK (gtk_tree_view_search_event),
+
+ g_signal_handlers_disconnect_by_func (gtk_entry_get_key_controller (GTK_ENTRY (tree_view->priv->search_entry)),
+ G_CALLBACK (gtk_tree_view_search_key_pressed),
tree_view);
g_object_unref (tree_view->priv->search_entry);
@@ -13674,12 +13680,13 @@ gtk_tree_view_set_search_entry (GtkTreeView *tree_view,
G_CALLBACK (gtk_tree_view_search_init),
tree_view);
}
-
- g_signal_connect (tree_view->priv->search_entry, "event",
- G_CALLBACK (gtk_tree_view_search_event),
- tree_view);
- gtk_tree_view_search_init (tree_view->priv->search_entry, tree_view);
+ g_signal_connect (gtk_entry_get_key_controller (GTK_ENTRY (tree_view->priv->search_entry)),
+ "key-pressed",
+ G_CALLBACK (gtk_tree_view_search_key_pressed),
+ tree_view);
+
+ gtk_tree_view_search_init (tree_view->priv->search_entry, tree_view);
}
else
{
@@ -13936,30 +13943,25 @@ gtk_tree_view_search_scroll_event (GtkWidget *widget,
}
static gboolean
-gtk_tree_view_search_event (GtkWidget *widget,
- GdkEvent *event,
- GtkTreeView *tree_view)
+gtk_tree_view_search_key_pressed (GtkEventControllerKey *key,
+ guint keyval,
+ guint keycode,
+ GdkModifierType state,
+ GtkTreeView *tree_view)
{
+ GtkWidget *widget = tree_view->priv->search_window;
GdkModifierType default_accel;
- gboolean retval = FALSE;
- guint keyval, state;
+ gboolean retval = FALSE;
g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
g_return_val_if_fail (GTK_IS_TREE_VIEW (tree_view), FALSE);
- if (gdk_event_get_event_type (event) != GDK_KEY_PRESS)
- return GDK_EVENT_PROPAGATE;
-
- if (!gdk_event_get_keyval (event, &keyval) ||
- !gdk_event_get_state (event, &state))
- return GDK_EVENT_PROPAGATE;
-
/* close window and cancel the search */
if (!tree_view->priv->search_custom_entry_set
&& gtk_tree_view_search_key_cancels_search (keyval))
{
gtk_tree_view_search_window_hide (widget, tree_view,
- gdk_event_get_device (event));
+ gtk_get_current_event_device ());
return TRUE;
}
@@ -14014,6 +14016,9 @@ gtk_tree_view_search_event (GtkWidget *widget,
g_source_set_name_by_id (tree_view->priv->typeselect_flush_timeout, "[gtk+] gtk_tree_view_search_entry_flush_timeout");
}
+ if (!retval)
+ gtk_event_controller_key_forward (key, tree_view->priv->search_entry);
+
return retval;
}