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 reappliesdb4a6040afwhich was backed out in18406b7b04to 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
This commit is contained in:
		| @ -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) | ||||
|  | ||||
| @ -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, | ||||
|  | ||||
| @ -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, | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 Benjamin Otte
					Benjamin Otte