From 1b46a68d145ee36ecd817cbbd15d1773be8dc3c9 Mon Sep 17 00:00:00 2001 From: DarkTrick Date: Wed, 6 May 2020 23:39:49 +0900 Subject: [PATCH] Fix: Bug 4537 ( https://bugzilla.xfce.org/show_bug.cgi?id=4537 ) Half-Fix: Bug 13680 ( https://bugzilla.xfce.org/show_bug.cgi?id=13680 ) Details: Key events are now handled bottom-up, if the currently focused widget is GTK_IS_EDITABLE. That means, accelerators only get executed, if the focused editable widget (or its parents) did not consume it. - g_signal_connect is used, to reduce complexity of calling parent class method - key-press/-release are both used to remain consistent event order at widgets --- thunar/thunar-window.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/thunar/thunar-window.c b/thunar/thunar-window.c index 1d52e11e..a503746b 100644 --- a/thunar/thunar-window.c +++ b/thunar/thunar-window.c @@ -189,6 +189,9 @@ static void thunar_window_action_contents (ThunarWindow static void thunar_window_action_about (ThunarWindow *window); static void thunar_window_action_show_hidden (ThunarWindow *window); static void thunar_window_action_open_file_menu (ThunarWindow *window); +static gboolean thunar_window_key_press_event (GtkWidget *widget, + GdkEvent *key_event, + gpointer user_data); static void thunar_window_current_directory_changed (ThunarFile *current_directory, ThunarWindow *window); static void thunar_window_menu_item_selected (ThunarWindow *window, @@ -613,6 +616,10 @@ thunar_window_init (ThunarWindow *window) window->icon_factory = thunar_icon_factory_get_default (); + /* Catch key events before accelerators get processed */ + g_signal_connect (window, "key-press-event", G_CALLBACK (thunar_window_key_press_event), NULL); + g_signal_connect (window, "key-release-event", G_CALLBACK (thunar_window_key_press_event), NULL); + window->select_files_closure = g_cclosure_new_swap (G_CALLBACK (thunar_window_select_files), window, NULL); g_closure_ref (window->select_files_closure); g_closure_sink (window->select_files_closure); @@ -3110,6 +3117,28 @@ thunar_window_action_open_network (ThunarWindow *window) +static gboolean +thunar_window_key_press_event (GtkWidget *widget, + GdkEvent *key_event, + gpointer user_data) +{ + GtkWindow* window; + GtkWidget* focused_widget; + + /* Check, if GTK_IS_EDITABLE, because if it's not, we don't want accelerators + of other widgets to be priorized over global accelerators. (E.g. Ctrl+N + is implemented as "next element" within the `list view`)*/ + window = GTK_WINDOW (widget); + focused_widget = gtk_window_get_focus (window); + + if (focused_widget != NULL && GTK_IS_EDITABLE (focused_widget)) + return gtk_window_propagate_key_event (window, (GdkEventKey *) key_event); + + return GDK_EVENT_PROPAGATE; +} + + + static void thunar_window_poke_location_finish (ThunarBrowser *browser, GFile *location, -- 2.20.1