diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2018-06-26 17:13:44 +0200 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2018-06-26 17:13:44 +0200 |
commit | 5ed6392f7f20316cd64168f351dabd00c15eb051 (patch) | |
tree | 2b55c6e5fdf0553032090acde58a185d5001ad0b | |
parent | bd5324834e999d66dc655251c2b12be76494d62c (diff) | |
download | gtk+-5ed6392f7f20316cd64168f351dabd00c15eb051.tar.gz |
gtktreeview: Replace event vmethod with key controller
-rw-r--r-- | gtk/gtktreeview.c | 132 |
1 files changed, 61 insertions, 71 deletions
diff --git a/gtk/gtktreeview.c b/gtk/gtktreeview.c index f77f60d3a8..7b9b88b9d3 100644 --- a/gtk/gtktreeview.c +++ b/gtk/gtktreeview.c @@ -34,6 +34,7 @@ #include "gtkdragdest.h" #include "gtkdragsource.h" #include "gtkentryprivate.h" +#include "gtkeventcontrollerkey.h" #include "gtkeventcontrollermotion.h" #include "gtkeventcontrollerscroll.h" #include "gtkframe.h" @@ -602,8 +603,19 @@ static void gtk_tree_view_snapshot (GtkWidget *widget, static void gtk_tree_view_set_focus_child (GtkContainer *container, GtkWidget *child); -static gboolean gtk_tree_view_event (GtkWidget *widget, - GdkEvent *event); +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, + GtkTreeView *tree_view); + static gint gtk_tree_view_focus (GtkWidget *widget, GtkDirectionType direction); static void gtk_tree_view_grab_focus (GtkWidget *widget); @@ -963,7 +975,6 @@ gtk_tree_view_class_init (GtkTreeViewClass *class) widget_class->measure = gtk_tree_view_measure; widget_class->size_allocate = gtk_tree_view_size_allocate; widget_class->snapshot = gtk_tree_view_snapshot; - widget_class->event = gtk_tree_view_event; widget_class->drag_begin = gtk_tree_view_drag_begin; widget_class->drag_end = gtk_tree_view_drag_end; widget_class->drag_data_get = gtk_tree_view_drag_data_get; @@ -1747,6 +1758,15 @@ gtk_tree_view_init (GtkTreeView *tree_view) g_signal_connect (controller, "motion", G_CALLBACK (gtk_tree_view_motion_controller_motion), tree_view); gtk_widget_add_controller (GTK_WIDGET (tree_view), controller); + + 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); } @@ -5452,16 +5472,15 @@ no_popup (void) } static gboolean -gtk_tree_view_key_press (GtkWidget *widget, - GdkEventKey *event) +gtk_tree_view_key_controller_key_pressed (GtkEventControllerKey *key, + guint keyval, + guint keycode, + GdkModifierType state, + GtkTreeView *tree_view) { - GtkTreeView *tree_view = (GtkTreeView *) widget; - GtkWidget *button; - guint keyval, state; - - if (!gdk_event_get_keyval ((GdkEvent *) event, &keyval) || - !gdk_event_get_state ((GdkEvent *) event, &state)) - return GDK_EVENT_PROPAGATE; + GtkWidget *widget = GTK_WIDGET (tree_view); + GtkWidget *button; + GdkEvent *event; if (tree_view->priv->rubber_band_status) { @@ -5581,13 +5600,16 @@ gtk_tree_view_key_press (GtkWidget *widget, } } - /* Chain up to the parent class. It handles the keybindings. */ - if (GTK_WIDGET_CLASS (gtk_tree_view_parent_class)->event) + /* Handle the keybindings. */ + event = gtk_get_current_event (); + if (gtk_bindings_activate_event (G_OBJECT (widget), (GdkEventKey *)event)) { - if (GTK_WIDGET_CLASS (gtk_tree_view_parent_class)->event (widget, (GdkEvent *)event)) - return TRUE; + g_object_unref (event); + return TRUE; } + g_object_unref (event); + if (tree_view->priv->search_entry_avoid_unhandled_binding) { tree_view->priv->search_entry_avoid_unhandled_binding = FALSE; @@ -5612,17 +5634,14 @@ gtk_tree_view_key_press (GtkWidget *widget, search_window = tree_view->priv->search_window; if (!gtk_widget_is_visible (search_window)) { - GtkIMContext *im_context = - _gtk_entry_get_im_context (GTK_ENTRY (tree_view->priv->search_entry)); - tree_view->priv->imcontext_changed = FALSE; - gtk_im_context_filter_keypress (im_context, event); + gtk_event_controller_key_forward (key, tree_view->priv->search_entry); if (tree_view->priv->imcontext_changed) { GdkDevice *device; - device = gdk_event_get_device ((GdkEvent *) event); + device = gtk_get_current_event_device (); if (gtk_tree_view_real_start_interactive_search (tree_view, device, FALSE)) @@ -5639,23 +5658,15 @@ gtk_tree_view_key_press (GtkWidget *widget, } else { - GdkEvent *new_event; gulong popup_menu_id; - new_event = gdk_event_copy ((GdkEvent *) event); - g_object_unref (((GdkEventKey *) new_event)->any.surface); - ((GdkEventKey *) new_event)->any.surface = - g_object_ref (gtk_widget_get_surface (search_window)); - gtk_widget_realize (search_window); - popup_menu_id = g_signal_connect (tree_view->priv->search_entry, "popup-menu", G_CALLBACK (no_popup), NULL); /* Because we keep the focus on the treeview, we need to forward the * key events to the entry, when it is visible. */ - gtk_widget_event (search_window, new_event); - g_object_unref (new_event); + gtk_event_controller_key_forward (key, search_window); g_signal_handler_disconnect (tree_view->priv->search_entry, popup_menu_id); @@ -5665,20 +5676,22 @@ gtk_tree_view_key_press (GtkWidget *widget, return FALSE; } -static gboolean -gtk_tree_view_key_release (GtkWidget *widget, - GdkEventKey *event) +static void +gtk_tree_view_key_controller_key_released (GtkEventControllerKey *key, + guint keyval, + guint keycode, + GdkModifierType state, + GtkTreeView *tree_view) { - GtkTreeView *tree_view = GTK_TREE_VIEW (widget); + GdkEvent *event; if (tree_view->priv->rubber_band_status) - return GDK_EVENT_STOP; - - /* Chain up to the parent class. It handles the keybindings. */ - if (GTK_WIDGET_CLASS (gtk_tree_view_parent_class)->event) - return GTK_WIDGET_CLASS (gtk_tree_view_parent_class)->event (widget, (GdkEvent *)event); + return; - return GDK_EVENT_PROPAGATE; + /* Handle the keybindings. */ + event = gtk_get_current_event (); + gtk_bindings_activate_event (G_OBJECT (tree_view), (GdkEventKey *)event); + g_object_unref (event); } static void @@ -5723,41 +5736,18 @@ gtk_tree_view_motion_controller_leave (GtkEventControllerMotion *controller, -1000, -1000); /* coords not possibly over an arrow */ } - -static gboolean -gtk_tree_view_event (GtkWidget *widget, - GdkEvent *event) +static void +gtk_tree_view_key_controller_focus_out (GtkEventControllerKey *key, + GtkTreeView *tree_view) { - GtkTreeView *tree_view; - - tree_view = GTK_TREE_VIEW (widget); - - if (gdk_event_get_event_type (event) == GDK_KEY_PRESS) - return gtk_tree_view_key_press (widget, (GdkEventKey *)event); - else if (gdk_event_get_event_type (event) == GDK_KEY_RELEASE) - return gtk_tree_view_key_release (widget, (GdkEventKey *)event); - else if (gdk_event_get_event_type (event) == GDK_FOCUS_CHANGE) - { - gboolean focus_in; - - gdk_event_get_focus_in (event, &focus_in); - if (!focus_in) - { - gtk_widget_queue_draw (widget); - - /* destroy interactive search dialog */ - if (tree_view->priv->search_window) - gtk_tree_view_search_window_hide (tree_view->priv->search_window, tree_view, - gdk_event_get_device ((GdkEvent *) event)); - } - - return GDK_EVENT_PROPAGATE; - } + gtk_widget_queue_draw (GTK_WIDGET (tree_view)); - return GDK_EVENT_PROPAGATE; + /* destroy interactive search dialog */ + if (tree_view->priv->search_window) + gtk_tree_view_search_window_hide (tree_view->priv->search_window, tree_view, + gtk_get_current_event_device ()); } - /* Incremental Reflow */ |