[gtk/focus-fixes: 2/2] window: Stop duplicating focus change events
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/focus-fixes: 2/2] window: Stop duplicating focus change events
- Date: Sun, 5 May 2019 06:29:03 +0000 (UTC)
commit 32fd55a66db2febcbbbcb386589576f20e948ded
Author: Matthias Clasen <mclasen redhat com>
Date: Sat May 4 15:18:35 2019 +0000
window: Stop duplicating focus change events
We had code in gtkwindow.c that generated duplicate,
and defective, focus-change events, in the following
way:
- gtkmain.c generates a chain of focus-change events
for moving focus from one window to another
- gtkwindow.c catches a focus-in event in the middle
of this chain and sets itself as 'active'
- and then it proceeds to generate focus-change
events towards its own focus widget without a
related target
This is not necessary since we gtkmain.c already
generates a complete sequence of focus-change events.
So stop doing it.
gtk/gtkwindow.c | 72 ++++-----------------------------------------------------
1 file changed, 5 insertions(+), 67 deletions(-)
---
diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c
index 7bcb04a815..d9bcf9ad65 100644
--- a/gtk/gtkwindow.c
+++ b/gtk/gtkwindow.c
@@ -6232,47 +6232,6 @@ get_active_region_type (GtkWindow *window, gint x, gint y)
return GTK_WINDOW_REGION_CONTENT;
}
-static void
-do_focus_change (GtkWidget *widget,
- gboolean in)
-{
- GdkSeat *seat;
- GdkDevice *device;
- GdkEvent *event;
- GtkRoot *root;
- GtkStateFlags flags;
-
- seat = gdk_display_get_default_seat (gtk_widget_get_display (widget));
- device = gdk_seat_get_keyboard (seat);
-
- event = gdk_event_new (GDK_FOCUS_CHANGE);
- gdk_event_set_display (event, gtk_widget_get_display (widget));
- gdk_event_set_device (event, device);
-
- event->any.type = GDK_FOCUS_CHANGE;
- event->any.surface = _gtk_widget_get_surface (widget);
- if (event->any.surface)
- g_object_ref (event->any.surface);
- event->focus_change.in = in;
- event->focus_change.mode = GDK_CROSSING_STATE_CHANGED;
- event->focus_change.detail = GDK_NOTIFY_ANCESTOR;
-
- flags = GTK_STATE_FLAG_FOCUSED;
- root = gtk_widget_get_root (widget);
- if (!GTK_IS_WINDOW (root) || gtk_window_get_focus_visible (GTK_WINDOW (root)))
- flags |= GTK_STATE_FLAG_FOCUS_VISIBLE;
-
- if (in)
- gtk_widget_set_state_flags (widget, flags, FALSE);
- else
- gtk_widget_unset_state_flags (widget, flags);
-
- gtk_widget_set_has_focus (widget, in);
- gtk_widget_event (widget, event);
-
- g_object_unref (event);
-}
-
static gboolean
gtk_window_has_mnemonic_modifier_pressed (GtkWindow *window)
{
@@ -8963,34 +8922,13 @@ _gtk_window_set_is_active (GtkWindow *window,
{
GtkWindowPrivate *priv = gtk_window_get_instance_private (window);
- g_return_if_fail (GTK_IS_WINDOW (window));
-
- is_active = is_active != FALSE;
-
- if (is_active != priv->is_active)
- {
- GtkWidget *widget = GTK_WIDGET (window);
-
- priv->is_active = is_active;
+ if (priv->is_active == is_active)
+ return;
- if (is_active)
- {
- if (priv->focus_widget &&
- priv->focus_widget != widget &&
- !gtk_widget_has_focus (priv->focus_widget))
- do_focus_change (priv->focus_widget, TRUE);
- }
- else
- {
- if (priv->focus_widget &&
- priv->focus_widget != widget &&
- gtk_widget_has_focus (priv->focus_widget))
- do_focus_change (priv->focus_widget, FALSE);
- }
+ priv->is_active = is_active;
- g_object_notify_by_pspec (G_OBJECT (window), window_props[PROP_IS_ACTIVE]);
- _gtk_window_accessible_set_is_active (window, is_active);
- }
+ g_object_notify_by_pspec (G_OBJECT (window), window_props[PROP_IS_ACTIVE]);
+ _gtk_window_accessible_set_is_active (window, is_active);
}
/**
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]