diff --git a/gtk/gtkmain.c b/gtk/gtkmain.c index 362800ee6d..9eac06ffde 100644 --- a/gtk/gtkmain.c +++ b/gtk/gtkmain.c @@ -1998,15 +1998,6 @@ gtk_main_do_event (GdkEvent *event) case GDK_KEY_PRESS: case GDK_KEY_RELEASE: - /* make focus visible in a window that receives a key event */ - { - GtkRoot *root; - - root = gtk_widget_get_root (grab_widget); - if (GTK_IS_WINDOW (root)) - gtk_window_set_focus_visible (GTK_WINDOW (root), TRUE); - } - /* Catch alt press to enable auto-mnemonics; * menus are handled elsewhere * FIXME: this does not work with mnemonic modifiers other than Alt diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c index 25b6fc63a5..3b4b8b7bbe 100644 --- a/gtk/gtkwindow.c +++ b/gtk/gtkwindow.c @@ -406,6 +406,7 @@ static void gtk_window_size_allocate (GtkWidget *widget, static gboolean gtk_window_close_request (GtkWindow *window); static void gtk_window_focus_in (GtkWidget *widget); static void gtk_window_focus_out (GtkWidget *widget); +static gboolean gtk_window_key_press (GtkWidget *widget); static void surface_state_changed (GtkWidget *widget); static void surface_size_changed (GtkWidget *widget, @@ -1864,10 +1865,14 @@ gtk_window_init (GtkWindow *window) gtk_widget_add_controller (widget, motion_controller); priv->key_controller = gtk_event_controller_key_new (); + gtk_event_controller_set_name (controller, "window focus"); + gtk_event_controller_set_propagation_phase (controller, GTK_PHASE_CAPTURE); g_signal_connect_swapped (priv->key_controller, "focus-in", G_CALLBACK (gtk_window_focus_in), window); g_signal_connect_swapped (priv->key_controller, "focus-out", G_CALLBACK (gtk_window_focus_out), window); + g_signal_connect_swapped (priv->key_controller, "key-pressed", + G_CALLBACK (gtk_window_key_press), window); gtk_widget_add_controller (widget, priv->key_controller); } @@ -6207,6 +6212,16 @@ gtk_window_focus_out (GtkWidget *widget) gtk_window_set_mnemonics_visible (window, FALSE); } +static gboolean +gtk_window_key_press (GtkWidget *widget) +{ + GtkWindow *window = GTK_WINDOW (widget); + + gtk_window_set_focus_visible (window, TRUE); + + return FALSE; +} + static GtkWindowPopover * _gtk_window_has_popover (GtkWindow *window, GtkWidget *widget)