diff --git a/src/x11_init.c b/src/x11_init.c index 77f543cb..f00080d6 100644 --- a/src/x11_init.c +++ b/src/x11_init.c @@ -54,7 +54,7 @@ static int translateKeyCode(int scancode) // Note: This way we always force "NumLock = ON", which is intentional // since the returned key code should correspond to a physical // location. - keySym = XkbKeycodeToKeysym(_glfw.x11.display, scancode, 0, 1); + keySym = XkbKeycodeToKeysym(_glfw.x11.display, scancode, _glfw.x11.xkb.group, 1); switch (keySym) { case XK_KP_0: return GLFW_KEY_KP_0; @@ -76,7 +76,7 @@ static int translateKeyCode(int scancode) // Now try primary keysym for function keys (non-printable keys) // These should not depend on the current keyboard layout - keySym = XkbKeycodeToKeysym(_glfw.x11.display, scancode, 0, 0); + keySym = XkbKeycodeToKeysym(_glfw.x11.display, scancode, _glfw.x11.xkb.group, 0); } else { @@ -659,6 +659,14 @@ static GLFWbool initExtensions(void) if (supported) _glfw.x11.xkb.detectable = GLFW_TRUE; } + + _glfw.x11.xkb.group = 0; + XkbStateRec state; + if (XkbGetState(_glfw.x11.display, XkbUseCoreKbd, &state) == Success) + { + XkbSelectEventDetails(_glfw.x11.display, XkbUseCoreKbd, XkbStateNotify, XkbAllStateComponentsMask, XkbGroupStateMask); + _glfw.x11.xkb.group = (unsigned int)state.group; + } } #if defined(__CYGWIN__) diff --git a/src/x11_platform.h b/src/x11_platform.h index 9fffa78e..5b365241 100644 --- a/src/x11_platform.h +++ b/src/x11_platform.h @@ -323,13 +323,14 @@ typedef struct _GLFWlibraryX11 } randr; struct { - GLFWbool available; - GLFWbool detectable; - int majorOpcode; - int eventBase; - int errorBase; - int major; - int minor; + GLFWbool available; + GLFWbool detectable; + int majorOpcode; + int eventBase; + int errorBase; + int major; + int minor; + unsigned int group; } xkb; struct { diff --git a/src/x11_window.c b/src/x11_window.c index 2eeaf572..47e7a40e 100644 --- a/src/x11_window.c +++ b/src/x11_window.c @@ -1180,6 +1180,15 @@ static void processEvent(XEvent *event) } } + if (_glfw.x11.xkb.available && event->type == _glfw.x11.xkb.eventBase) + { + if (((XkbEvent *)event)->any.xkb_type == XkbStateNotify && + ((XkbEvent *)event)->state.changed & XkbGroupStateMask) + { + _glfw.x11.xkb.group = ((XkbEvent *)event)->state.group; + } + } + if (event->type == GenericEvent) { if (_glfw.x11.xi.available) @@ -2780,7 +2789,7 @@ const char* _glfwPlatformGetScancodeName(int scancode) if (!_glfw.x11.xkb.available) return NULL; - const KeySym keysym = XkbKeycodeToKeysym(_glfw.x11.display, scancode, 0, 0); + const KeySym keysym = XkbKeycodeToKeysym(_glfw.x11.display, scancode, _glfw.x11.xkb.group, 0); if (keysym == NoSymbol) return NULL;