Browse Source

Skip duplicate key events sent by IMEs like uim.

Alex Baines 8 years ago
parent
commit
8eb762769e
2 changed files with 10 additions and 0 deletions
  1. 6 0
      src/video/x11/SDL_x11events.c
  2. 4 0
      src/video/x11/SDL_x11video.h

+ 6 - 0
src/video/x11/SDL_x11events.c

@@ -574,6 +574,9 @@ X11_DispatchEvent(_THIS)
         if (orig_keycode) {
 #if defined(HAVE_IBUS_IBUS_H) || defined(HAVE_FCITX_FRONTEND_H)
             SDL_Scancode scancode = videodata->key_layout[orig_keycode];
+            videodata->filter_code = orig_keycode;
+            videodata->filter_time = xevent.xkey.time;
+
             if (orig_event_type == KeyPress) {
                 SDL_SendKeyboardKey(SDL_PRESSED, scancode);
             } else {
@@ -582,6 +585,9 @@ X11_DispatchEvent(_THIS)
 #endif
         }
         return;
+    } else if (orig_keycode == videodata->filter_code && xevent.xkey.time == videodata->filter_time) {
+        /* This is a duplicate event, resent by an IME - skip it. */
+        return;
     }
 
     /* Send a SDL_SYSWMEVENT if the application wants them */

+ 4 - 0
src/video/x11/SDL_x11video.h

@@ -133,6 +133,10 @@ typedef struct SDL_VideoData
 #if SDL_VIDEO_DRIVER_X11_HAS_XKBKEYCODETOKEYSYM
     XkbDescPtr xkb;
 #endif
+
+    KeyCode filter_code;
+    Time    filter_time;
+
 } SDL_VideoData;
 
 extern SDL_bool X11_UseDirectColorVisuals(void);