The extension is now part of Xlib. It might be disabled through the `XKB_DISABLE=1` environment variable (https://gitlab.freedesktop.org/xorg/lib/libx11/-/blob/master/src/xkb/XKBUse....) but I don't see why we have to support that case.
I think assuming that it is always usable will make the keyboard code simpler, though I have no idea if it exists some environment without it nowadays. All recent desktop environment rely on Xkb to support keyboard layouts, especially when multiple layouts are configured (which are grouped four by four in a single X keyboard mapping, using Xkb groups).
From: Rémi Bernon rbernon@codeweavers.com
--- configure.ac | 7 ------- dlls/winex11.drv/keyboard.c | 36 +++++++++------------------------- dlls/winex11.drv/x11drv.h | 1 - dlls/winex11.drv/x11drv_main.c | 14 +++---------- include/config.h.in | 3 --- 5 files changed, 12 insertions(+), 49 deletions(-)
diff --git a/configure.ac b/configure.ac index 16bada50512..ddf3ad39351 100644 --- a/configure.ac +++ b/configure.ac @@ -1192,13 +1192,6 @@ then # include <X11/Xutil.h> #endif])
- dnl *** Check for X keyboard extension - if test "$ac_cv_header_X11_XKBlib_h" = "yes" - then - AC_CHECK_LIB(X11, XkbQueryExtension, - AC_DEFINE(HAVE_XKB, 1, [Define if you have the XKB extension]),,[$X_LIBS $X_EXTRA_LIBS]) - fi - dnl *** Check for X cursor if test "$ac_cv_header_X11_Xcursor_Xcursor_h" = "yes" then diff --git a/dlls/winex11.drv/keyboard.c b/dlls/winex11.drv/keyboard.c index f1ad4b01669..2aae16b941e 100644 --- a/dlls/winex11.drv/keyboard.c +++ b/dlls/winex11.drv/keyboard.c @@ -34,9 +34,7 @@ #include <X11/Xlib.h> #include <X11/Xresource.h> #include <X11/Xutil.h> -#ifdef HAVE_X11_XKBLIB_H #include <X11/XKBlib.h> -#endif
#include <ctype.h> #include <stdarg.h> @@ -66,7 +64,6 @@ WINE_DECLARE_DEBUG_CHANNEL(key); static const unsigned int ControlMask = 1 << 2;
static int min_keycode, max_keycode, keysyms_per_keycode; -static KeySym *key_mapping; static WORD keyc2vkey[256], keyc2scan[256];
static int NumLockMask, ScrollLockMask, AltGrMask; /* mask in the XKeyEvent state */ @@ -1089,14 +1086,6 @@ static const WORD xfree86_vendor_key_vkey[256] = 0, 0, 0, 0, 0, 0, 0, 0 /* 1008FFF8 */ };
-static inline KeySym keycode_to_keysym( Display *display, KeyCode keycode, int index ) -{ -#ifdef HAVE_XKB - if (use_xkb) return XkbKeycodeToKeysym(display, keycode, 0, index); -#endif - return key_mapping[(keycode - min_keycode) * keysyms_per_keycode + index]; -} - /* Returns the Windows virtual key code associated with the X event <e> */ /* kbd_section must be held */ static WORD EVENT_event_to_vkey( XIC xic, XKeyEvent *e) @@ -1442,13 +1431,11 @@ X11DRV_KEYBOARD_DetectLayout( Display *display ) for (keyc = min_keycode; keyc <= max_keycode; keyc++) { /* get data for keycode from X server */ for (i = 0; i < syms; i++) { - if (!(keysym = keycode_to_keysym (display, keyc, i))) continue; + if (!(keysym = XkbKeycodeToKeysym( display, keyc, 0, i ))) continue; /* Allow both one-byte and two-byte national keysyms */ if ((keysym < 0x8000) && (keysym != ' ')) { -#ifdef HAVE_XKB - if (!use_xkb || !XkbTranslateKeySym(display, &keysym, 0, &ckey[keyc][i], 1, NULL)) -#endif + if (!XkbTranslateKeySym(display, &keysym, 0, &ckey[keyc][i], 1, NULL)) { TRACE("XKB could not translate keysym %04lx\n", keysym); /* FIXME: query what keysym is used as Mode_switch, fill XKeyEvent @@ -1597,9 +1584,6 @@ void X11DRV_InitKeyboard( Display *display )
pthread_mutex_lock( &kbd_mutex ); XDisplayKeycodes(display, &min_keycode, &max_keycode); - if (key_mapping) XFree( key_mapping ); - key_mapping = XGetKeyboardMapping(display, min_keycode, - max_keycode + 1 - min_keycode, &keysyms_per_keycode);
mmp = XGetModifierMapping(display); kcp = mmp->modifiermap; @@ -1613,12 +1597,12 @@ void X11DRV_InitKeyboard( Display *display ) int k;
for (k = 0; k < keysyms_per_keycode; k += 1) - if (keycode_to_keysym(display, *kcp, k) == XK_Num_Lock) + if (XkbKeycodeToKeysym( display, *kcp, 0, k ) == XK_Num_Lock) { NumLockMask = 1 << i; TRACE_(key)("NumLockMask is %x\n", NumLockMask); } - else if (keycode_to_keysym(display, *kcp, k) == XK_Scroll_Lock) + else if (XkbKeycodeToKeysym( display, *kcp, 0, k ) == XK_Scroll_Lock) { ScrollLockMask = 1 << i; TRACE_(key)("ScrollLockMask is %x\n", ScrollLockMask); @@ -1670,12 +1654,10 @@ void X11DRV_InitKeyboard( Display *display ) /* we seem to need to search the layout-dependent scancodes */ int maxlen=0,maxval=-1,ok; for (i=0; i<syms; i++) { - keysym = keycode_to_keysym(display, keyc, i); + keysym = XkbKeycodeToKeysym( display, keyc, 0, i ); if ((keysym<0x8000) && (keysym!=' ')) { -#ifdef HAVE_XKB - if (!use_xkb || !XkbTranslateKeySym(display, &keysym, 0, &ckey[i], 1, NULL)) -#endif + if (!XkbTranslateKeySym(display, &keysym, 0, &ckey[i], 1, NULL)) { /* FIXME: query what keysym is used as Mode_switch, fill XKeyEvent * with appropriate ShiftMask and Mode_switch, use XLookupString @@ -1822,7 +1804,7 @@ void X11DRV_InitKeyboard( Display *display ) for (scan = 0x60, keyc = min_keycode; keyc <= max_keycode; keyc++) if (keyc2vkey[keyc]&&!keyc2scan[keyc]) { const char *ksname; - keysym = keycode_to_keysym(display, keyc, 0); + keysym = XkbKeycodeToKeysym( display, keyc, 0, 0 ); ksname = XKeysymToString(keysym); if (!ksname) ksname = "NoSymbol";
@@ -1949,7 +1931,7 @@ SHORT X11DRV_VkKeyScanEx( WCHAR wChar, HKL hkl ) }
for (index = 0; index < 4; index++) /* find shift state */ - if (keycode_to_keysym(display, keycode, index) == keysym) break; + if (XkbKeycodeToKeysym( display, keycode, 0, index ) == keysym) break;
pthread_mutex_unlock( &kbd_mutex );
@@ -2201,7 +2183,7 @@ INT X11DRV_GetKeyNameText( LONG lParam, LPWSTR lpBuffer, INT nSize ) INT rc;
keyc = (KeyCode) keyi; - keys = keycode_to_keysym(display, keyc, 0); + keys = XkbKeycodeToKeysym( display, keyc, 0, 0 ); name = XKeysymToString(keys);
if (name && (vkey == VK_SHIFT || vkey == VK_CONTROL || vkey == VK_MENU)) diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index 2b0b79e1665..c6328cf3fde 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -433,7 +433,6 @@ extern Window root_window DECLSPEC_HIDDEN; extern BOOL clipping_cursor DECLSPEC_HIDDEN; extern BOOL keyboard_grabbed DECLSPEC_HIDDEN; extern unsigned int screen_bpp DECLSPEC_HIDDEN; -extern BOOL use_xkb DECLSPEC_HIDDEN; extern BOOL usexrandr DECLSPEC_HIDDEN; extern BOOL usexvidmode DECLSPEC_HIDDEN; extern BOOL ximInComposeMode DECLSPEC_HIDDEN; diff --git a/dlls/winex11.drv/x11drv_main.c b/dlls/winex11.drv/x11drv_main.c index 797e4f92d38..46f99e9b83b 100644 --- a/dlls/winex11.drv/x11drv_main.c +++ b/dlls/winex11.drv/x11drv_main.c @@ -36,9 +36,7 @@ #include <dlfcn.h> #include <X11/cursorfont.h> #include <X11/Xlib.h> -#ifdef HAVE_XKB #include <X11/XKBlib.h> -#endif #ifdef HAVE_X11_EXTENSIONS_XRENDER_H #include <X11/extensions/Xrender.h> #endif @@ -72,7 +70,6 @@ Window root_window; BOOL usexvidmode = TRUE; BOOL usexrandr = TRUE; BOOL usexcomposite = TRUE; -BOOL use_xkb = TRUE; BOOL use_take_focus = TRUE; BOOL use_primary_selection = FALSE; BOOL use_system_cursors = TRUE; @@ -708,9 +705,7 @@ static NTSTATUS x11drv_init( void *arg ) #endif X11DRV_XInput2_Init();
-#ifdef HAVE_XKB - if (use_xkb) use_xkb = XkbUseExtension( gdi_display, NULL, NULL ); -#endif + XkbUseExtension( gdi_display, NULL, NULL ); X11DRV_InitKeyboard( gdi_display ); if (use_xim) use_xim = X11DRV_InitXIM( input_style );
@@ -789,11 +784,8 @@ struct x11drv_thread_data *x11drv_init_thread_data(void)
fcntl( ConnectionNumber(data->display), F_SETFD, 1 ); /* set close on exec flag */
-#ifdef HAVE_XKB - if (use_xkb && XkbUseExtension( data->display, NULL, NULL )) - XkbSetDetectableAutoRepeat( data->display, True, NULL ); -#endif - + XkbUseExtension( data->display, NULL, NULL ); + XkbSetDetectableAutoRepeat( data->display, True, NULL ); if (TRACE_ON(synchronous)) XSynchronize( data->display, True );
set_queue_display_fd( data->display ); diff --git a/include/config.h.in b/include/config.h.in index fe2fc36a914..44ea547b7ec 100644 --- a/include/config.h.in +++ b/include/config.h.in @@ -696,9 +696,6 @@ /* Define to 1 if `callback' is a member of `XICCallback'. */ #undef HAVE_XICCALLBACK_CALLBACK
-/* Define if you have the XKB extension */ -#undef HAVE_XKB - /* Define if Xrender has the XRenderCreateLinearGradient function */ #undef HAVE_XRENDERCREATELINEARGRADIENT
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details:
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=130057
Your paranoid android.
=== debian11 (32 bit report) ===
dinput: device8.c:365: Test failed: 0x700: got count 0 device8.c:376: Test failed: 0x700: got count 0 device8.c:384: Test failed: 0x700: keydown for D did not register device8.c:396: Test failed: 0x700: got count 0 device8.c:426: Test failed: 0x700: got count 0 device8.c:437: Test failed: 0x700: got count 0 device8.c:457: Test failed: 0x700: got count 0 device8.c:365: Test failed: 0x800: got count 0 device8.c:376: Test failed: 0x800: got count 0 device8.c:384: Test failed: 0x800: keydown for D did not register device8.c:396: Test failed: 0x800: got count 0 device8.c:426: Test failed: 0x800: got count 0 device8.c:437: Test failed: 0x800: got count 0 device8.c:457: Test failed: 0x800: got count 0 device8.c:1476: Test failed: 0x500: obj[1]: got dwOfs 0xe device8.c:1478: Test failed: 0x500: obj[1]: got dwType 0xe04 device8.c:1476: Test failed: 0x500: obj[2]: got dwOfs 0xf device8.c:1478: Test failed: 0x500: obj[2]: got dwType 0xf04 device8.c:1476: Test failed: 0x500: obj[3]: got dwOfs 0x1c device8.c:1478: Test failed: 0x500: obj[3]: got dwType 0x1c04 device8.c:1476: Test failed: 0x500: obj[4]: got dwOfs 0x1d device8.c:1478: Test failed: 0x500: obj[4]: got dwType 0x1d04 device8.c:2515: Test failed: 0x500: GetObjectInfo returned: 0x80070002 device8.c:2518: Test failed: 0x500: got guidType {00000000-0000-0000-0000-000000000000} device8.c:2519: Test failed: 0x500: got dwOfs 0 device8.c:2520: Test failed: 0x500: got dwType 0 device8.c:2540: Test failed: 0x500: GetObjectInfo returned: 0x80070002 device8.c:2543: Test failed: 0x500: got guidType {00000000-0000-0000-0000-000000000000} device8.c:2544: Test failed: 0x500: got dwOfs 0 device8.c:2545: Test failed: 0x500: got dwType 0 device8.c:2642: Test failed: 0x500: SetDataFormat returned 0x80070057 device8.c:2644: Test failed: 0x500: Acquire returned 0x80070057 device8.c:2646: Test failed: 0x500: GetDeviceState returned 0x8007000c device8.c:2648: Test failed: 0x500: GetDeviceState returned 0x8007000c device8.c:2652: Test failed: 0x500: GetDeviceState returned 0x8007000c device8.c:2653: Test failed: 0x500: got non zero state device8.c:2662: Test failed: 0x500: WaitForSingleObject returned 0x102 device8.c:2666: Test failed: 0x500: GetDeviceState returned 0x8007000c device8.c:2667: Test failed: 0x500: got key_state[0] 3452816845 device8.c:2671: Test failed: 0x500: Unacquire returned 0x1 device8.c:2673: Test failed: 0x500: Acquire returned 0x80070057 device8.c:2675: Test failed: 0x500: GetDeviceState returned 0x8007000c device8.c:2676: Test failed: 0x500: got non zero state device8.c:2681: Test failed: 0x500: Unacquire returned 0x1 device8.c:2178: Test failed: 0x500: lang 0x409: key 0x51, dik 0x10: got state 0 device8.c:2178: Test failed: 0x500: lang 0x409: key 0x57, dik 0x11: got state 0 device8.c:2178: Test failed: 0x500: lang 0x409: key 0x45, dik 0x12: got state 0 device8.c:2178: Test failed: 0x500: lang 0x409: key 0x52, dik 0x13: got state 0 device8.c:2178: Test failed: 0x500: lang 0x409: key 0x54, dik 0x14: got state 0 device8.c:2178: Test failed: 0x500: lang 0x409: key 0x59, dik 0x15: got state 0 device8.c:2178: Test failed: 0x500: lang 0x409: key 0x5b, dik 0x1a: got state 0 device8.c:2178: Test failed: 0x500: lang 0x409: key 0x5d, dik 0x1b: got state 0 device8.c:2178: Test failed: 0x500: lang 0x409: key 0x2e, dik 0x34: got state 0 device8.c:1476: Test failed: 0x700: obj[1]: got dwOfs 0xe device8.c:1478: Test failed: 0x700: obj[1]: got dwType 0xe04 device8.c:1476: Test failed: 0x700: obj[2]: got dwOfs 0xf device8.c:1478: Test failed: 0x700: obj[2]: got dwType 0xf04 device8.c:1476: Test failed: 0x700: obj[3]: got dwOfs 0x1c device8.c:1478: Test failed: 0x700: obj[3]: got dwType 0x1c04 device8.c:1476: Test failed: 0x700: obj[4]: got dwOfs 0x1d device8.c:1478: Test failed: 0x700: obj[4]: got dwType 0x1d04 device8.c:2515: Test failed: 0x700: GetObjectInfo returned: 0x80070002 device8.c:2518: Test failed: 0x700: got guidType {00000000-0000-0000-0000-000000000000} device8.c:2519: Test failed: 0x700: got dwOfs 0 device8.c:2520: Test failed: 0x700: got dwType 0 device8.c:2540: Test failed: 0x700: GetObjectInfo returned: 0x80070002 device8.c:2543: Test failed: 0x700: got guidType {00000000-0000-0000-0000-000000000000} device8.c:2544: Test failed: 0x700: got dwOfs 0 device8.c:2545: Test failed: 0x700: got dwType 0 device8.c:2642: Test failed: 0x700: SetDataFormat returned 0x80070057 device8.c:2644: Test failed: 0x700: Acquire returned 0x80070057 device8.c:2646: Test failed: 0x700: GetDeviceState returned 0x8007000c device8.c:2648: Test failed: 0x700: GetDeviceState returned 0x8007000c device8.c:2652: Test failed: 0x700: GetDeviceState returned 0x8007000c device8.c:2653: Test failed: 0x700: got non zero state device8.c:2662: Test failed: 0x700: WaitForSingleObject returned 0x102 device8.c:2666: Test failed: 0x700: GetDeviceState returned 0x8007000c device8.c:2667: Test failed: 0x700: got key_state[0] 3452816845 device8.c:2671: Test failed: 0x700: Unacquire returned 0x1 device8.c:2673: Test failed: 0x700: Acquire returned 0x80070057 device8.c:2675: Test failed: 0x700: GetDeviceState returned 0x8007000c device8.c:2676: Test failed: 0x700: got non zero state device8.c:2681: Test failed: 0x700: Unacquire returned 0x1 device8.c:2178: Test failed: 0x700: lang 0x409: key 0x51, dik 0x10: got state 0 device8.c:2178: Test failed: 0x700: lang 0x409: key 0x57, dik 0x11: got state 0 device8.c:2178: Test failed: 0x700: lang 0x409: key 0x45, dik 0x12: got state 0 device8.c:2178: Test failed: 0x700: lang 0x409: key 0x52, dik 0x13: got state 0 device8.c:2178: Test failed: 0x700: lang 0x409: key 0x54, dik 0x14: got state 0 device8.c:2178: Test failed: 0x700: lang 0x409: key 0x59, dik 0x15: got state 0 device8.c:2178: Test failed: 0x700: lang 0x409: key 0x5b, dik 0x1a: got state 0 device8.c:2178: Test failed: 0x700: lang 0x409: key 0x5d, dik 0x1b: got state 0 device8.c:2178: Test failed: 0x700: lang 0x409: key 0x2e, dik 0x34: got state 0 device8.c:1476: Test failed: 0x800: obj[1]: got dwOfs 0xe device8.c:1478: Test failed: 0x800: obj[1]: got dwType 0xe04 device8.c:1476: Test failed: 0x800: obj[2]: got dwOfs 0xf device8.c:1478: Test failed: 0x800: obj[2]: got dwType 0xf04 device8.c:1476: Test failed: 0x800: obj[3]: got dwOfs 0x1c device8.c:1478: Test failed: 0x800: obj[3]: got dwType 0x1c04 device8.c:1476: Test failed: 0x800: obj[4]: got dwOfs 0x1d device8.c:1478: Test failed: 0x800: obj[4]: got dwType 0x1d04 device8.c:2515: Test failed: 0x800: GetObjectInfo returned: 0x80070002 device8.c:2518: Test failed: 0x800: got guidType {00000000-0000-0000-0000-000000000000} device8.c:2519: Test failed: 0x800: got dwOfs 0 device8.c:2520: Test failed: 0x800: got dwType 0 device8.c:2540: Test failed: 0x800: GetObjectInfo returned: 0x80070002 device8.c:2543: Test failed: 0x800: got guidType {00000000-0000-0000-0000-000000000000} device8.c:2544: Test failed: 0x800: got dwOfs 0 device8.c:2545: Test failed: 0x800: got dwType 0 device8.c:2642: Test failed: 0x800: SetDataFormat returned 0x80070057 device8.c:2644: Test failed: 0x800: Acquire returned 0x80070057 device8.c:2646: Test failed: 0x800: GetDeviceState returned 0x8007000c device8.c:2648: Test failed: 0x800: GetDeviceState returned 0x8007000c device8.c:2652: Test failed: 0x800: GetDeviceState returned 0x8007000c device8.c:2653: Test failed: 0x800: got non zero state device8.c:2662: Test failed: 0x800: WaitForSingleObject returned 0x102 device8.c:2666: Test failed: 0x800: GetDeviceState returned 0x8007000c device8.c:2667: Test failed: 0x800: got key_state[0] 3452816845 device8.c:2671: Test failed: 0x800: Unacquire returned 0x1 device8.c:2673: Test failed: 0x800: Acquire returned 0x80070057 device8.c:2675: Test failed: 0x800: GetDeviceState returned 0x8007000c device8.c:2676: Test failed: 0x800: got non zero state device8.c:2681: Test failed: 0x800: Unacquire returned 0x1 device8.c:2178: Test failed: 0x800: lang 0x409: key 0x51, dik 0x10: got state 0 device8.c:2178: Test failed: 0x800: lang 0x409: key 0x57, dik 0x11: got state 0 device8.c:2178: Test failed: 0x800: lang 0x409: key 0x45, dik 0x12: got state 0 device8.c:2178: Test failed: 0x800: lang 0x409: key 0x52, dik 0x13: got state 0 device8.c:2178: Test failed: 0x800: lang 0x409: key 0x54, dik 0x14: got state 0 device8.c:2178: Test failed: 0x800: lang 0x409: key 0x59, dik 0x15: got state 0 device8.c:2178: Test failed: 0x800: lang 0x409: key 0x5b, dik 0x1a: got state 0 device8.c:2178: Test failed: 0x800: lang 0x409: key 0x5d, dik 0x1b: got state 0 device8.c:2178: Test failed: 0x800: lang 0x409: key 0x2e, dik 0x34: got state 0 device8.c:756: Test failed: IDirectInputDevice8_SetProperty failed hr=0x80070002 device8.c:520: Test failed: got data size 0, expected 1 device8.c:521: Test failed: got action uAppData 0046BAAF, expected 0000000B device8.c:964: Test failed: Mapped incorrectly expected: 0x0x1e04 got: 0x0 device8.c:967: Test failed: Mapped incorrectly expected: 0x0x3004 got: 0x0 device8.c:987: Test failed: Mapped incorrectly expected: 0x0x1e04 got: 0x0 device8.c:989: Test failed: Action should be mapped to keyboard device8.c:991: Test failed: Mapped incorrectly expected: 0x0x3004 got: 0x0 device8.c:993: Test failed: Action should be mapped to keyboard device8.c:1007: Test failed: Mapped incorrectly expected: 0x0x1e04 got: 0x0 device8.c:1009: Test failed: Action should be mapped to keyboard device8.c:1011: Test failed: Mapped incorrectly expected: 0x0x3004 got: 0x0 device8.c:1013: Test failed: Action should be mapped to keyboard device8.c:520: Test failed: got data size 0, expected 1 device8.c:521: Test failed: got action uAppData 0046BAAF, expected FFFFFFFF device8.c:1417: Test failed: IDirectInputDevice8_SetProperty failed hr=0x80070002 device8.c:1423: Test failed: IDirectInputDevice8_SetProperty failed hr=0x80070002 device8.c:520: Test failed: got data size 0, expected 1 device8.c:521: Test failed: got action uAppData 00000003, expected 00000004 device8.c:520: Test failed: got data size 0, expected 1 device8.c:521: Test failed: got action uAppData 00000003, expected 00000005 device8.c:520: Test failed: got data size 0, expected 1 device8.c:521: Test failed: got action uAppData 00000003, expected FFFFFFFF device8.c:520: Test failed: got data size 0, expected 1 device8.c:521: Test failed: got action uAppData 0046BAAF, expected FFFFFFFF device8.c:520: Test failed: got data size 0, expected 1 device8.c:520: Test failed: got data size 0, expected 1 device8.c:520: Test failed: got data size 0, expected 1
user32: input.c:872: Test failed: 1 (46/0): the msg sequence is not complete: expected 0106 - actual 0000 input.c:872: Test failed: 5 (4f/0): the msg sequence is not complete: expected 0102 - actual 0000 input.c:3209: Test failed: ToUnicode(A) returned L"\n" input.c:3210: Test failed: ToAscii(A) returned char=10, expected 97 input.c:3225: Test failed: ToAscii for CTRL + character 'A' was 10 (expected 1) menu.c:2324: Test failed: test 3