Przeglądaj źródła

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.
Ryan C. Gordon 10 lat temu
rodzic
commit
20ec137763
2 zmienionych plików z 7 dodań i 0 usunięć
  1. 6 0
      src/video/x11/SDL_x11events.c
  2. 1 0
      src/video/x11/SDL_x11sym.h

+ 6 - 0
src/video/x11/SDL_x11events.c

@@ -649,9 +649,15 @@ X11_DispatchEvent(_THIS)
             }
             }
         } else if (xevent.type == MappingNotify) {
         } else if (xevent.type == MappingNotify) {
             /* Has the keyboard layout changed? */
             /* Has the keyboard layout changed? */
+            const int request = xevent.xmapping.request;
+
 #ifdef DEBUG_XEVENTS
 #ifdef DEBUG_XEVENTS
             printf("window %p: MappingNotify!\n", data);
             printf("window %p: MappingNotify!\n", data);
 #endif
 #endif
+            if ((request == MappingKeyboard) || (request == MappingModifier)) {
+                X11_XRefreshKeyboardMapping(&xevent.xmapping);
+            }
+
             X11_UpdateKeymap(_this);
             X11_UpdateKeymap(_this);
         }
         }
         return;
         return;

+ 1 - 0
src/video/x11/SDL_x11sym.h

@@ -152,6 +152,7 @@ SDL_X11_SYM(unsigned long,_XSetLastRequestRead,(Display* a,xGenericReply* b),(a,
 SDL_X11_SYM(SDL_X11_XSynchronizeRetType,XSynchronize,(Display* a,Bool b),(a,b),return)
 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_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(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
 #if SDL_VIDEO_DRIVER_X11_SUPPORTS_GENERIC_EVENTS
 SDL_X11_SYM(Bool,XGetEventData,(Display* a,XGenericEventCookie* b),(a,b),return)
 SDL_X11_SYM(Bool,XGetEventData,(Display* a,XGenericEventCookie* b),(a,b),return)