From ad5cb8305f4ebc10992113f8f6a724d5f33a6bf8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?R=C3=A9mi=20Bernon?= <rbernon@codeweavers.com>
Date: Mon, 27 Feb 2023 10:57:58 +0100
Subject: [PATCH] winex11: Assume that Xkb extension is available.

---
 configure                      | 46 ----------------------------------
 configure.ac                   |  7 ------
 dlls/winex11.drv/keyboard.c    | 37 ++++++++-------------------
 dlls/winex11.drv/x11drv.h      |  1 -
 dlls/winex11.drv/x11drv_main.c | 14 +++--------
 include/config.h.in            |  3 ---
 6 files changed, 13 insertions(+), 95 deletions(-)

diff --git a/configure b/configure
index 375ed1d6e5f..80f0acd1f78 100755
--- a/configure
+++ b/configure
@@ -14465,52 +14465,6 @@ then :
 fi
 
 
-                if test "$ac_cv_header_X11_XKBlib_h" = "yes"
-        then
-              { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for XkbQueryExtension in -lX11" >&5
-printf %s "checking for XkbQueryExtension in -lX11... " >&6; }
-if test ${ac_cv_lib_X11_XkbQueryExtension+y}
-then :
-  printf %s "(cached) " >&6
-else $as_nop
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lX11 $X_LIBS $X_EXTRA_LIBS $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-char XkbQueryExtension ();
-int
-main (void)
-{
-return XkbQueryExtension ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"
-then :
-  ac_cv_lib_X11_XkbQueryExtension=yes
-else $as_nop
-  ac_cv_lib_X11_XkbQueryExtension=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_X11_XkbQueryExtension" >&5
-printf "%s\n" "$ac_cv_lib_X11_XkbQueryExtension" >&6; }
-if test "x$ac_cv_lib_X11_XkbQueryExtension" = xyes
-then :
-
-printf "%s\n" "#define HAVE_XKB 1" >>confdefs.h
-
-fi
-
-        fi
-
                 if test "$ac_cv_header_X11_Xcursor_Xcursor_h" = "yes"
         then
             { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -lXcursor" >&5
diff --git a/configure.ac b/configure.ac
index 4feaa969e71..140f26aec16 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1174,13 +1174,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..616728be621 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,7 @@ 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);
+    XFree( XGetKeyboardMapping( display, min_keycode, max_keycode + 1 - min_keycode, &keysyms_per_keycode ) );
 
     mmp = XGetModifierMapping(display);
     kcp = mmp->modifiermap;
@@ -1613,12 +1598,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 +1655,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 +1805,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 +1932,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 +2184,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