diff options
author | Benjamin Otte <otte@redhat.com> | 2011-12-19 12:39:53 +0100 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2011-12-19 16:17:14 +0100 |
commit | db4a6040afd3d1cabbb306037e811f37d62e2e76 (patch) | |
tree | 9c86d180df0709aa90893da2c84ef8cd0073388e /gdk/x11 | |
parent | 2ea328dfbc820c32a6f425805e632cd1aef45258 (diff) | |
download | gtk+-db4a6040afd3d1cabbb306037e811f37d62e2e76.tar.gz |
x11: Avoid spurious focus events on grabs
We want to avoid handling focus events for the private focus window,
otherwise the keyboard grab taken by for example buttons will cause a
spurious FOCUS_OUT/FOCUS_IN on the toplevel.
The code that did this seems to have been lost in the XI2 transition for
GTK3.
https://bugzilla.gnome.org/show_bug.cgi?id=657578
Diffstat (limited to 'gdk/x11')
-rw-r--r-- | gdk/x11/gdkdevicemanager-core-x11.c | 5 | ||||
-rw-r--r-- | gdk/x11/gdkdevicemanager-xi2.c | 1 | ||||
-rw-r--r-- | gdk/x11/gdkdevicemanagerprivate-core.h | 3 |
3 files changed, 9 insertions, 0 deletions
diff --git a/gdk/x11/gdkdevicemanager-core-x11.c b/gdk/x11/gdkdevicemanager-core-x11.c index 156ba8bfd8..503ad5489c 100644 --- a/gdk/x11/gdkdevicemanager-core-x11.c +++ b/gdk/x11/gdkdevicemanager-core-x11.c @@ -665,6 +665,7 @@ gdk_x11_device_manager_core_translate_event (GdkEventTranslator *translator, case FocusIn: case FocusOut: _gdk_device_manager_core_handle_focus (window, + xevent->xfocus.window, device_manager->core_keyboard, NULL, xevent->type == FocusIn, @@ -795,6 +796,7 @@ _gdk_x11_event_translate_keyboard_string (GdkEventKey *event) */ void _gdk_device_manager_core_handle_focus (GdkWindow *window, + Window original, GdkDevice *device, GdkDevice *source_device, gboolean focus_in, @@ -819,6 +821,9 @@ _gdk_device_manager_core_handle_focus (GdkWindow *window, if (!toplevel) return; + if (toplevel->focus_window == original) + return; + had_focus = HAS_FOCUS (toplevel); switch (detail) diff --git a/gdk/x11/gdkdevicemanager-xi2.c b/gdk/x11/gdkdevicemanager-xi2.c index 273ca7dfb9..f9e4d110f0 100644 --- a/gdk/x11/gdkdevicemanager-xi2.c +++ b/gdk/x11/gdkdevicemanager-xi2.c @@ -1228,6 +1228,7 @@ gdk_x11_device_manager_xi2_translate_event (GdkEventTranslator *translator, GUINT_TO_POINTER (xev->sourceid)); _gdk_device_manager_core_handle_focus (window, + xev->event, device, source_device, (ev->evtype == XI_FocusIn) ? TRUE : FALSE, diff --git a/gdk/x11/gdkdevicemanagerprivate-core.h b/gdk/x11/gdkdevicemanagerprivate-core.h index 428b34fdd1..54463bb2fa 100644 --- a/gdk/x11/gdkdevicemanagerprivate-core.h +++ b/gdk/x11/gdkdevicemanagerprivate-core.h @@ -20,6 +20,8 @@ #ifndef __GDK_DEVICE_MANAGER_PRIVATE_CORE_H__ #define __GDK_DEVICE_MANAGER_PRIVATE_CORE_H__ +#include <X11/Xlib.h> + #include "gdkx11devicemanager-core.h" #include "gdkdevicemanagerprivate.h" @@ -38,6 +40,7 @@ struct _GdkX11DeviceManagerCoreClass }; void _gdk_device_manager_core_handle_focus (GdkWindow *window, + Window original, GdkDevice *device, GdkDevice *source_device, gboolean focus_in, |