Supply current group when translating X11 Keycodes to Keysyms.
authorJason Wyatt <jwyatt@feralinteractive.com>
Fri, 14 Aug 2015 16:23:31 +0100
changeset 9842 8a89b58895c1
parent 9841 aa1321ce8425
child 9843 13bbc6d4ab12
Supply current group when translating X11 Keycodes to Keysyms.
src/video/x11/SDL_x11keyboard.c
src/video/x11/SDL_x11sym.h
--- a/src/video/x11/SDL_x11keyboard.c	Fri Aug 14 01:20:41 2015 -0400
+++ b/src/video/x11/SDL_x11keyboard.c	Fri Aug 14 16:23:31 2015 +0100
@@ -29,6 +29,7 @@
 #include "../../events/scancodes_xfree86.h"
 
 #include <X11/keysym.h>
+#include <X11/XKBlib.h>
 
 #include "imKStoUCS.h"
 
@@ -177,12 +178,12 @@
 }
 
 static Uint32
-X11_KeyCodeToUcs4(Display *display, KeyCode keycode)
+X11_KeyCodeToUcs4(Display *display, KeyCode keycode, unsigned char group)
 {
     KeySym keysym;
 
 #if SDL_VIDEO_DRIVER_X11_HAS_XKBKEYCODETOKEYSYM
-    keysym = X11_XkbKeycodeToKeysym(display, keycode, 0, 0);
+    keysym = X11_XkbKeycodeToKeysym(display, keycode, group, 0);
 #else
     keysym = X11_XKeycodeToKeysym(display, keycode, 0);
 #endif
@@ -300,8 +301,17 @@
     int i;
     SDL_Scancode scancode;
     SDL_Keycode keymap[SDL_NUM_SCANCODES];
+    unsigned char group = 0;
 
     SDL_GetDefaultKeymap(keymap);
+    
+#if SDL_VIDEO_DRIVER_X11_HAS_XKBKEYCODETOKEYSYM
+    XkbStateRec state;
+    if(0 == X11_XkbGetState(data->display, XkbUseCoreKbd, &state))
+        group = state.group;
+#endif
+
+
     for (i = 0; i < SDL_arraysize(data->key_layout); i++) {
         Uint32 key;
 
@@ -312,7 +322,7 @@
         }
 
         /* See if there is a UCS keycode for this scancode */
-        key = X11_KeyCodeToUcs4(data->display, (KeyCode)i);
+        key = X11_KeyCodeToUcs4(data->display, (KeyCode)i, group);
         if (key) {
             keymap[scancode] = key;
         } else {
--- a/src/video/x11/SDL_x11sym.h	Fri Aug 14 01:20:41 2015 -0400
+++ b/src/video/x11/SDL_x11sym.h	Fri Aug 14 16:23:31 2015 +0100
@@ -165,6 +165,7 @@
 #else
 SDL_X11_SYM(KeySym,XkbKeycodeToKeysym,(Display* a,KeyCode b,int c,int d),(a,b,c,d),return)
 #endif
+SDL_X11_SYM(Status,XkbGetState,(Display* a,unsigned int b,XkbStatePtr c),(a,b,c),return)
 #endif
 
 #if NeedWidePrototypes