Fixed issue with dead key press/release events being filtered out.

main
Sam Lantinga 2013-11-10 14:48:44 -08:00
parent 0d39d09076
commit 9228c84576
1 changed files with 23 additions and 3 deletions

View File

@ -280,19 +280,39 @@ X11_DispatchEvent(_THIS)
Display *display = videodata->display; Display *display = videodata->display;
SDL_WindowData *data; SDL_WindowData *data;
XEvent xevent; XEvent xevent;
int i; int orig_event_type;
KeyCode orig_keycode;
XClientMessageEvent m; XClientMessageEvent m;
int i;
SDL_zero(xevent); /* valgrind fix. --ryan. */ SDL_zero(xevent); /* valgrind fix. --ryan. */
X11_XNextEvent(display, &xevent); X11_XNextEvent(display, &xevent);
/* filter events catchs XIM events and sends them to the correct /* Save the original keycode for dead keys, which are filtered out by
handler */ the XFilterEvent() call below.
*/
orig_event_type = xevent.type;
if (orig_event_type == KeyPress || orig_event_type == KeyRelease) {
orig_keycode = xevent.xkey.keycode;
} else {
orig_keycode = 0;
}
/* filter events catchs XIM events and sends them to the correct handler */
if (X11_XFilterEvent(&xevent, None) == True) { if (X11_XFilterEvent(&xevent, None) == True) {
#if 0 #if 0
printf("Filtered event type = %d display = %d window = %d\n", printf("Filtered event type = %d display = %d window = %d\n",
xevent.type, xevent.xany.display, xevent.xany.window); xevent.type, xevent.xany.display, xevent.xany.window);
#endif #endif
if (orig_keycode) {
/* Make sure dead key press/release events are sent */
SDL_Scancode scancode = videodata->key_layout[orig_keycode];
if (orig_event_type == KeyPress) {
SDL_SendKeyboardKey(SDL_PRESSED, scancode);
} else {
SDL_SendKeyboardKey(SDL_RELEASED, scancode);
}
}
return; return;
} }