diff --git a/src/video/x11/SDL_x11events.c b/src/video/x11/SDL_x11events.c index e93fd7945..37c76c5e9 100644 --- a/src/video/x11/SDL_x11events.c +++ b/src/video/x11/SDL_x11events.c @@ -676,6 +676,7 @@ X11_DispatchEvent(_THIS) Display *display; SDL_WindowData *data; XEvent xevent; + XkbEvent* xkbEvent; int orig_event_type; KeyCode orig_keycode; XClientMessageEvent m; @@ -688,6 +689,7 @@ X11_DispatchEvent(_THIS) SDL_zero(xevent); /* valgrind fix. --ryan. */ X11_XNextEvent(display, &xevent); + xkbEvent = (XkbEvent*) &xevent; /* Save the original keycode for dead keys, which are filtered out by the XFilterEvent() call below. @@ -768,7 +770,7 @@ X11_DispatchEvent(_THIS) if (SDL_GetKeyboardFocus() != NULL) { X11_ReconcileKeyboardState(_this); } - } else if (xevent.type == MappingNotify) { + } else if (xevent.type == MappingNotify || xkbEvent->any.xkb_type == XkbStateNotify) { /* Has the keyboard layout changed? */ const int request = xevent.xmapping.request; diff --git a/src/video/x11/SDL_x11sym.h b/src/video/x11/SDL_x11sym.h index f226733ce..a550dc2e9 100644 --- a/src/video/x11/SDL_x11sym.h +++ b/src/video/x11/SDL_x11sym.h @@ -182,6 +182,7 @@ SDL_X11_SYM(XkbDescPtr,XkbGetMap,(Display* a,unsigned int b,unsigned int c),(a,b SDL_X11_SYM(void,XkbFreeClientMap,(XkbDescPtr a,unsigned int b, Bool c),(a,b,c),) SDL_X11_SYM(void,XkbFreeKeyboard,(XkbDescPtr a,unsigned int b, Bool c),(a,b,c),) SDL_X11_SYM(Bool,XkbSetDetectableAutoRepeat,(Display* a, Bool b, Bool* c),(a,b,c),return) +SDL_X11_SYM(Bool,XkbSelectEvents,(Display* a, unsigned int b, unsigned int c, unsigned int d),(a,b,c,d),return) #endif #if NeedWidePrototypes diff --git a/src/video/x11/SDL_x11window.c b/src/video/x11/SDL_x11window.c index 3b090f7d5..71e51076b 100644 --- a/src/video/x11/SDL_x11window.c +++ b/src/video/x11/SDL_x11window.c @@ -668,6 +668,8 @@ X11_CreateWindow(_THIS, SDL_Window * window) PropertyChangeMask | StructureNotifyMask | KeymapStateMask | fevent)); + X11_XkbSelectEvents(display, XkbUseCoreKbd, XkbStateNotifyMask, XkbStateNotifyMask); + X11_XFlush(display); return 0;