diff -r e605ca133ac6 src/video/x11/SDL_x11events.c --- a/src/video/x11/SDL_x11events.c Sat Aug 24 09:43:14 2013 -0400 +++ b/src/video/x11/SDL_x11events.c Sun Aug 25 01:23:34 2013 +0200 @@ -269,10 +269,19 @@ XEvent xevent; int i; XClientMessageEvent m; + KeyCode prefilter_keycode = 0; + int prefilter_type = 0; SDL_zero(xevent); /* valgrind fix. --ryan. */ XNextEvent(display, &xevent); + /* before filtering the event (which will modify it in case of dead + keys), store the original keycode so we can generate a SDL_KEYDOWN/UP + event for it anyway */ + if(xevent.type == KeyPress || xevent.type == KeyRelease) { + prefilter_keycode = xevent.xkey.keycode; + prefilter_type = xevent.type; + } /* filter events catchs XIM events and sends them to the correct handler */ if (XFilterEvent(&xevent, None) == True) { @@ -280,6 +289,14 @@ printf("Filtered event type = %d display = %d window = %d\n", xevent.type, xevent.xany.display, xevent.xany.window); #endif + + /* in case this was a keypress/release event, send it to SDL + anyway, because we want events for dead keys too. */ + if(prefilter_keycode != 0) { + SDL_SendKeyboardKey(prefilter_type == KeyPress ? SDL_PRESSED : SDL_RELEASED, + videodata->key_layout[prefilter_keycode]); + } + return; }