X11: Call XRefreshKeyboardMapping() when we get various MappingNotify events.
authorRyan C. Gordon <icculus@icculus.org>
Tue, 30 Jun 2015 14:41:17 -0400
changeset 9788 ecda7d71342e
parent 9787 08b2895a935a
child 9789 137993bad5c7
X11: Call XRefreshKeyboardMapping() when we get various MappingNotify events. According to the Xlib docs, you need to do this or Xlib's internal state gets out of sync.
src/video/x11/SDL_x11events.c
src/video/x11/SDL_x11sym.h
--- a/src/video/x11/SDL_x11events.c	Tue Jun 30 14:39:39 2015 -0400
+++ b/src/video/x11/SDL_x11events.c	Tue Jun 30 14:41:17 2015 -0400
@@ -649,9 +649,15 @@
             }
         } else if (xevent.type == MappingNotify) {
             /* Has the keyboard layout changed? */
+            const int request = xevent.xmapping.request;
+
 #ifdef DEBUG_XEVENTS
             printf("window %p: MappingNotify!\n", data);
 #endif
+            if ((request == MappingKeyboard) || (request == MappingModifier)) {
+                X11_XRefreshKeyboardMapping(&xevent.xmapping);
+            }
+
             X11_UpdateKeymap(_this);
         }
         return;
--- a/src/video/x11/SDL_x11sym.h	Tue Jun 30 14:39:39 2015 -0400
+++ b/src/video/x11/SDL_x11sym.h	Tue Jun 30 14:41:17 2015 -0400
@@ -152,6 +152,7 @@
 SDL_X11_SYM(SDL_X11_XSynchronizeRetType,XSynchronize,(Display* a,Bool b),(a,b),return)
 SDL_X11_SYM(SDL_X11_XESetWireToEventRetType,XESetWireToEvent,(Display* a,int b,SDL_X11_XESetWireToEventRetType c),(a,b,c),return)
 SDL_X11_SYM(SDL_X11_XESetEventToWireRetType,XESetEventToWire,(Display* a,int b,SDL_X11_XESetEventToWireRetType c),(a,b,c),return)
+SDL_X11_SYM(void,XRefreshKeyboardMapping,(XMappingEvent *a),(a),)
 
 #if SDL_VIDEO_DRIVER_X11_SUPPORTS_GENERIC_EVENTS
 SDL_X11_SYM(Bool,XGetEventData,(Display* a,XGenericEventCookie* b),(a,b),return)