[gtk+] x11: Avoid spurious focus events on grabs



commit 858a6546768e5745b0b1d86b52c175efa5480f65
Author: Benjamin Otte <otte redhat com>
Date:   Mon Dec 19 12:39:53 2011 +0100

    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.
    
    This patch reapplies db4a6040afd3d1cabbb306037e811f37d62e2e76 which was
    backed out in 18406b7b04da088f8a3efe7cca5ac1647080dc0b to give
    developers a chance to get their X servers fixed. As we want to get this
    bugfix in for 3.4, we need to commit it now.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=657578

 gdk/x11/gdkdevicemanager-core-x11.c    |    5 +++++
 gdk/x11/gdkdevicemanager-xi2.c         |    1 +
 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 90630de..38a225c 100644
--- a/gdk/x11/gdkdevicemanager-core-x11.c
+++ b/gdk/x11/gdkdevicemanager-core-x11.c
@@ -663,6 +663,7 @@ gdk_x11_device_manager_core_translate_event (GdkEventTranslator *translator,
     case FocusOut:
       if (window)
         _gdk_device_manager_core_handle_focus (window,
+                                               xevent->xfocus.window,
                                                device_manager->core_keyboard,
                                                NULL,
                                                xevent->type == FocusIn,
@@ -794,6 +795,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,
@@ -818,6 +820,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 6f93fd2..0b9dc19 100644
--- a/gdk/x11/gdkdevicemanager-xi2.c
+++ b/gdk/x11/gdkdevicemanager-xi2.c
@@ -1561,6 +1561,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 470a98a..4de19d1 100644
--- a/gdk/x11/gdkdevicemanagerprivate-core.h
+++ b/gdk/x11/gdkdevicemanagerprivate-core.h
@@ -18,6 +18,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"
 
@@ -36,6 +38,7 @@ struct _GdkX11DeviceManagerCoreClass
 };
 
 void            _gdk_device_manager_core_handle_focus           (GdkWindow   *window,
+                                                                 Window       original,
                                                                  GdkDevice   *device,
                                                                  GdkDevice   *source_device,
                                                                  gboolean     focus_in,



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]