xi2: Handle XIM modules that replace events

Fixes Bug 645993 - XIM has wierd behaviors. Some XIM modules
filter every key event, possibly replacing it with their own
one. These events usually have serial=0, so make
GdkDeviceManagerXI2 also listen on these.
This commit is contained in:
Carlos Garnacho 2011-04-02 11:46:42 +02:00 committed by Matthias Clasen
parent 2ce9ff2d6a
commit d3274e8e06

View File

@ -938,13 +938,18 @@ gdk_x11_device_manager_xi2_translate_core_event (GdkEventTranslator *translator,
gboolean keyboard = FALSE; gboolean keyboard = FALSE;
GdkDevice *device; GdkDevice *device;
if (xevent->type == KeyPress && xevent->xkey.keycode == 0) if ((xevent->type == KeyPress || xevent->type == KeyRelease) &&
(xevent->xkey.keycode == 0 || xevent->xkey.serial == 0))
{ {
/* The X input methods (when triggered via XFilterEvent) /* The X input methods (when triggered via XFilterEvent)
* generate a core key press event with keycode 0 to signal the * generate a core key press event with keycode 0 to signal the
* end of a key sequence. We use the core translate_event * end of a key sequence. We use the core translate_event
* implementation to translate this event. * implementation to translate this event.
* *
* Other less educated IM modules like to filter every keypress,
* only to have these replaced by their own homegrown events,
* these events oddly have serial=0, so we try to catch these.
*
* This is just a bandaid fix to keep xim working with a single * This is just a bandaid fix to keep xim working with a single
* keyboard until XFilterEvent learns about XI2. * keyboard until XFilterEvent learns about XI2.
*/ */