Pārlūkot izejas kodu

Fix keymap updating for X11 backend

ReNoM 4 gadi atpakaļ
vecāks
revīzija
de6d290266

+ 3 - 1
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;
 

+ 1 - 0
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

+ 2 - 0
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;