[gtk/matthiasc/for-master: 13/13] window: Fix setting :is-active
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/matthiasc/for-master: 13/13] window: Fix setting :is-active
- Date: Wed, 15 Apr 2020 18:44:49 +0000 (UTC)
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]