Просмотр исходного кода

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 лет назад
Родитель
Сommit
20ec137763
2 измененных файлов с 7 добавлено и 0 удалено
  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) {
             /* 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;

+ 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_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)