summaryrefslogtreecommitdiff
path: root/gdk/x11
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2011-12-19 12:39:53 +0100
committerBenjamin Otte <otte@redhat.com>2011-12-19 16:17:14 +0100
commitdb4a6040afd3d1cabbb306037e811f37d62e2e76 (patch)
tree9c86d180df0709aa90893da2c84ef8cd0073388e /gdk/x11
parent2ea328dfbc820c32a6f425805e632cd1aef45258 (diff)
downloadgtk+-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.c5
-rw-r--r--gdk/x11/gdkdevicemanager-xi2.c1
-rw-r--r--gdk/x11/gdkdevicemanagerprivate-core.h3
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,