]> Pileus Git - ~andy/gtk/commitdiff
x11: Avoid spurious focus events on grabs
authorBenjamin Otte <otte@redhat.com>
Mon, 19 Dec 2011 11:39:53 +0000 (12:39 +0100)
committerBenjamin Otte <otte@redhat.com>
Mon, 19 Dec 2011 15:17:14 +0000 (16:17 +0100)
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

gdk/x11/gdkdevicemanager-core-x11.c
gdk/x11/gdkdevicemanager-xi2.c
gdk/x11/gdkdevicemanagerprivate-core.h

index 156ba8bfd8c163c12546a475f7822dd8667e2161..503ad5489c4cc187b8cfb35ef5722735e35f4a18 100644 (file)
@@ -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)
index 273ca7dfb920e429caca47c98fe5118662e78a32..f9e4d110f023eb305b7b13a967b9837d2dc3003d 100644 (file)
@@ -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,
index 428b34fdd1c56d0c6ae5d2d2f02b69c581b624dc..54463bb2fa89eaff4aaf90b48145b33dfd1cccb0 100644 (file)
@@ -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,