]> Pileus Git - ~andy/gtk/commitdiff
xi2: Handle XIM modules that replace events
authorCarlos Garnacho <carlosg@gnome.org>
Sat, 2 Apr 2011 09:46:42 +0000 (11:46 +0200)
committerMatthias Clasen <mclasen@redhat.com>
Mon, 13 Jun 2011 11:16:16 +0000 (07:16 -0400)
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.

gdk/x11/gdkdevicemanager-xi2.c

index 64d0f59e7f45238569a3861aed7dd4cf14eaa262..1953b48185665b576b9a07003d0bdbae5801f68a 100644 (file)
@@ -938,13 +938,18 @@ gdk_x11_device_manager_xi2_translate_core_event (GdkEventTranslator *translator,
   gboolean keyboard = FALSE;
   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)
        * generate a core key press event with keycode 0 to signal the
        * end of a key sequence. We use the core translate_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
        * keyboard until XFilterEvent learns about XI2.
        */