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