[gtk/matthiasc/for-master: 13/13] window: Fix setting :is-active



commit 031b248c2093e1b99435080e6c5da2c33a67f510
Author: Matthias Clasen <mclasen redhat com>
Date:   Wed Apr 15 14:43:00 2020 -0400

    window: Fix setting :is-active
    
    We want to listen to focus events from the windowing
    system here, relying on crossing events for this doesn't
    work.
    
    Fixes: https://gitlab.gnome.org/GNOME/gtk/-/issues/2612

 gtk/gtkwindow.c | 50 +++++++++++++++++++++++++-------------------------
 1 file changed, 25 insertions(+), 25 deletions(-)
---
diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c
index 69e3e7a399..68ed529105 100644
--- a/gtk/gtkwindow.c
+++ b/gtk/gtkwindow.c
@@ -40,7 +40,7 @@
 #include "gtkcssshadowvalueprivate.h"
 #include "gtkcssstylepropertyprivate.h"
 #include "gtkdroptargetasync.h"
-#include "gtkeventcontrollerfocus.h"
+#include "gtkeventcontrollerlegacy.h"
 #include "gtkeventcontrollerkey.h"
 #include "gtkeventcontrollermotion.h"
 #include "gtkgesturedrag.h"
@@ -370,8 +370,10 @@ static void gtk_window_size_allocate      (GtkWidget         *widget,
                                            int                height,
                                            int                  baseline);
 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_handle_focus   (GtkWidget         *widget,
+                                           GdkEvent          *event,
+                                           double             x,
+                                           double             y);
 static gboolean gtk_window_key_pressed    (GtkWidget         *widget,
                                            guint              keyval,
                                            guint              keycode,
@@ -1748,11 +1750,11 @@ gtk_window_init (GtkWindow *window)
   g_signal_connect_swapped (priv->key_controller, "key-released",
                             G_CALLBACK (gtk_window_key_released), window);
   gtk_widget_add_controller (widget, priv->key_controller);
-  controller = gtk_event_controller_focus_new ();
-  g_signal_connect_swapped (controller, "enter",
-                            G_CALLBACK (gtk_window_focus_in), window);
-  g_signal_connect_swapped (controller, "leave",
-                            G_CALLBACK (gtk_window_focus_out), window);
+
+  controller = gtk_event_controller_legacy_new ();
+  gtk_event_controller_set_name (controller, "gtk-window-toplevel-focus");
+  g_signal_connect_swapped (controller, "event",
+                            G_CALLBACK (gtk_window_handle_focus), window);
   gtk_widget_add_controller (widget, controller);
 
   /* Shared constraint solver */
@@ -5317,34 +5319,32 @@ gtk_window_has_mnemonic_modifier_pressed (GtkWindow *window)
   return retval;
 }
 
-static void
-gtk_window_focus_in (GtkWidget *widget)
+static gboolean
+gtk_window_handle_focus (GtkWidget *widget,
+                         GdkEvent  *event,
+                         double     x,
+                         double     y)
 {
   GtkWindow *window = GTK_WINDOW (widget);
 
-  /* It appears spurious focus in events can occur when
-   * the window is hidden. So we'll just check to see if
-   * the window is visible before actually handling the
-   * event
-   */
-  if (gtk_widget_get_visible (widget))
+  if (gdk_event_get_event_type (event) != GDK_FOCUS_CHANGE)
+    return FALSE;
+
+  if (gdk_focus_event_get_in (event))
     {
       _gtk_window_set_is_active (window, TRUE);
 
       if (gtk_window_has_mnemonic_modifier_pressed (window))
         _gtk_window_schedule_mnemonics_visible (window);
     }
-}
-
-static void
-gtk_window_focus_out (GtkWidget *widget)
-{
-  GtkWindow *window = GTK_WINDOW (widget);
+  else
+    {
+      _gtk_window_set_is_active (window, FALSE);
 
-  _gtk_window_set_is_active (window, FALSE);
+      gtk_window_set_mnemonics_visible (window, FALSE);
+    }
 
-  /* set the mnemonic-visible property to false */
-  gtk_window_set_mnemonics_visible (window, FALSE);
+  return TRUE;
 }
 
 static void


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]