Skip to content

Commit

Permalink
Supply current group when translating X11 Keycodes to Keysyms.
Browse files Browse the repository at this point in the history
  • Loading branch information
jwyatt-feral committed Aug 14, 2015
1 parent 9e2b90e commit fb37956
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 3 deletions.
16 changes: 13 additions & 3 deletions src/video/x11/SDL_x11keyboard.c
Expand Up @@ -29,6 +29,7 @@
#include "../../events/scancodes_xfree86.h"

#include <X11/keysym.h>
#include <X11/XKBlib.h>

#include "imKStoUCS.h"

Expand Down Expand Up @@ -177,12 +178,12 @@ X11_KeyCodeToSDLScancode(Display *display, KeyCode keycode)
}

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
Expand Down Expand Up @@ -300,8 +301,17 @@ X11_UpdateKeymap(_THIS)
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;

Expand All @@ -312,7 +322,7 @@ X11_UpdateKeymap(_THIS)
}

/* 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 {
Expand Down
1 change: 1 addition & 0 deletions src/video/x11/SDL_x11sym.h
Expand Up @@ -165,6 +165,7 @@ SDL_X11_SYM(KeySym,XkbKeycodeToKeysym,(Display* a,unsigned int b,int c,int d),(a
#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
Expand Down

0 comments on commit fb37956

Please sign in to comment.