From c3aae2e7d9aa901b5b7efa2f36fe636a4903c9ab Mon Sep 17 00:00:00 2001 From: DarkTrick <notebook22312@gmail.com> Date: Tue, 12 May 2020 12:34:23 +0900 Subject: [PATCH] Fix shortcut support for addressbar (Bug #4537 and Bug #13680) - Key events are now handled bottom-up, if the currently focused widget is GTK_IS_EDITABLE. - key-press/-release are both used to remain consistent event order at widgets --- thunar/thunar-window.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/thunar/thunar-window.c b/thunar/thunar-window.c index 7c421cf6f..31e0c395e 100644 --- a/thunar/thunar-window.c +++ b/thunar/thunar-window.c @@ -221,6 +221,9 @@ static void thunar_window_action_about (GtkAction ThunarWindow *window); static void thunar_window_action_show_hidden (GtkToggleAction *action, ThunarWindow *window); +static gboolean thunar_window_propagate_key_event (GtkWindow *window, + GdkEvent *key_event, + gpointer user_data); static void thunar_window_current_directory_changed (ThunarFile *current_directory, ThunarWindow *window); static void thunar_window_connect_proxy (GtkUIManager *manager, @@ -772,6 +775,10 @@ thunar_window_init (ThunarWindow *window) g_closure_sink (window->menu_item_deselected_closure); 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_propagate_key_event), NULL); + g_signal_connect (window, "key-release-event", G_CALLBACK (thunar_window_propagate_key_event), NULL); + G_GNUC_BEGIN_IGNORE_DEPRECATIONS /* setup the action group for this window */ window->action_group = gtk_action_group_new ("ThunarWindow"); @@ -3350,6 +3357,31 @@ G_GNUC_END_IGNORE_DEPRECATIONS +static gboolean +thunar_window_propagate_key_event (GtkWindow* window, + GdkEvent *key_event, + gpointer user_data) +{ + GtkWidget* focused_widget; + + _thunar_return_val_if_fail (THUNAR_IS_WINDOW (window), GDK_EVENT_PROPAGATE); + + focused_widget = gtk_window_get_focus (window); + + /* Turn the accelerator priority around globally, + * so that the focused widget always gets the accels first. + * Implementing this cleanly while maintaining some wanted accels + * (like Ctrl+N and exo accels) is a lot of work. So we resort to + * only priorize GtkEditable, because that is the easiest way to + * fix the right-ahead problem. */ + 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, -- GitLab