From c64f338f477cc8c31f58dfb50d94114466408800 Mon Sep 17 00:00:00 2001 From: DarkTrick Date: Wed, 6 May 2020 15:11:54 +0900 Subject: [PATCH] With this change key events are handled bottom-up, if the currently focused widget is GTK_IS_EDITABLE. That means, accelerators only get executed, if the focused widget (or it's parent) did not consume the accelerator. This solves the bug below: https://bugzilla.xfce.org/show_bug.cgi?id=4537 This mitigates the bug below: https://bugzilla.xfce.org/show_bug.cgi?id=13680 --- thunar/thunar-window.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/thunar/thunar-window.c b/thunar/thunar-window.c index 1d52e11e..49dd6b24 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 (); + /* Make key events propagate from the focused widget up */ + 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,29 @@ 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