From: Matteo Bruni <mbruni@codeweavers.com> --- dlls/winex11.drv/keyboard.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/dlls/winex11.drv/keyboard.c b/dlls/winex11.drv/keyboard.c index e2281bef017..fbccc469a09 100644 --- a/dlls/winex11.drv/keyboard.c +++ b/dlls/winex11.drv/keyboard.c @@ -1561,6 +1561,11 @@ void X11DRV_InitKeyboard( Display *display ) char ckey[4]={0,0,0,0}; const char (*lkey)[MAIN_LEN][4]; char vkey_used[256] = { 0 }; + XkbStateRec xkb_state; + char *xkb_group_names[4]; + unsigned int xkb_group, xkb_group_count; + XkbDescRec *xkb_desc; + Status s; /* Ranges of OEM, function key, and character virtual key codes. * Don't include those handled specially in X11DRV_ToUnicodeEx and @@ -1611,6 +1616,29 @@ void X11DRV_InitKeyboard( Display *display ) } XFreeModifiermap(mmp); + s = XkbGetState( display, XkbUseCoreKbd, &xkb_state ); + xkb_group = s ? 0 : xkb_state.group; + TRACE("s %#x, current Xkb group %u\n", s, xkb_group); + xkb_desc = XkbGetMap( display, XkbAllClientInfoMask, XkbUseCoreKbd ); + if (xkb_desc) + { + XkbGetNames( display, XkbGroupNamesMask, xkb_desc ); + for (i = 0; i < ARRAY_SIZE(xkb_desc->names->groups); i++) + { + if (!xkb_desc->names->groups[i]) + break; + } + xkb_group_count = i; + if (!XGetAtomNames( display, xkb_desc->names->groups, xkb_group_count, xkb_group_names )) + xkb_group_count = 0; + for (i = 0; i < xkb_group_count; i++) + { + TRACE("group %u name %s\n", i, debugstr_a(xkb_group_names[i])); + XFree( xkb_group_names[i] ); + } + XkbFreeKeyboard( xkb_desc, XkbNamesMask, True ); + } + /* Detect the keyboard layout */ X11DRV_KEYBOARD_DetectLayout( display ); lkey = main_key_tab[kbd_layout].key; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10550