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