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 db4a6040af which was
backed out in 18406b7b04 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
This commit is contained in:
Benjamin Otte 2011-12-19 12:39:53 +01:00
parent f9b23d70ef
commit 858a654676
3 changed files with 9 additions and 0 deletions

View File

@ -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)

View File

@ -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,

View File

@ -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,