Properly initialize keyboard auto-repeat for all X connections.
diff --git a/dlls/x11drv/keyboard.c b/dlls/x11drv/keyboard.c
index 2dd14ff..20b8214 100644
--- a/dlls/x11drv/keyboard.c
+++ b/dlls/x11drv/keyboard.c
@@ -58,9 +58,6 @@
static LPBYTE pKeyStateTable;
static int NumLockMask, AltGrMask; /* mask in the XKeyEvent state */
static int kcControl, kcAlt, kcShift, kcNumLock, kcCapsLock; /* keycodes */
-#ifdef HAVE_XKB
-static int is_xkb, xkb_opcode, xkb_event, xkb_error;
-#endif
static char KEYBOARD_MapDeadKeysym(KeySym keysym);
@@ -1124,7 +1121,7 @@
if ((keysym < 0x8000) && (keysym != ' '))
{
#ifdef HAVE_XKB
- if (!is_xkb || !XkbTranslateKeySym(display, &keysym, 0, &ckey[i], 1, NULL))
+ if (!use_xkb || !XkbTranslateKeySym(display, &keysym, 0, &ckey[i], 1, NULL))
#endif
{
TRACE("XKB could not translate keysym %ld\n", keysym);
@@ -1200,9 +1197,6 @@
*/
void X11DRV_InitKeyboard( BYTE *key_state_table )
{
-#ifdef HAVE_XKB
- int xkb_major = XkbMajorVersion, xkb_minor = XkbMinorVersion;
-#endif
Display *display = thread_display();
KeySym *ksp;
XModifierKeymap *mmp;
@@ -1217,15 +1211,6 @@
pKeyStateTable = key_state_table;
wine_tsx11_lock();
-#ifdef HAVE_XKB
- is_xkb = XkbQueryExtension(display,
- &xkb_opcode, &xkb_event, &xkb_error,
- &xkb_major, &xkb_minor);
- if (is_xkb) {
- /* we have XKB, approximate Windows behaviour */
- XkbSetDetectableAutoRepeat(display, True, NULL);
- }
-#endif
XDisplayKeycodes(display, &min_keycode, &max_keycode);
ksp = XGetKeyboardMapping(display, min_keycode,
max_keycode + 1 - min_keycode, &keysyms_per_keycode);
@@ -1291,7 +1276,7 @@
if ((keysym<0x8000) && (keysym!=' '))
{
#ifdef HAVE_XKB
- if (!is_xkb || !XkbTranslateKeySym(display, &keysym, 0, &ckey[i], 1, NULL))
+ if (!use_xkb || !XkbTranslateKeySym(display, &keysym, 0, &ckey[i], 1, NULL))
#endif
{
/* FIXME: query what keysym is used as Mode_switch, fill XKeyEvent
diff --git a/dlls/x11drv/x11drv_main.c b/dlls/x11drv/x11drv_main.c
index 688551c..5e4df9d 100644
--- a/dlls/x11drv/x11drv_main.c
+++ b/dlls/x11drv/x11drv_main.c
@@ -33,6 +33,9 @@
#endif
#include <X11/cursorfont.h>
#include "ts_xlib.h"
+#ifdef HAVE_XKB
+#include <X11/XKBlib.h>
+#endif
#include "winbase.h"
#include "wine/winbase16.h"
@@ -59,6 +62,7 @@
Window root_window;
DWORD desktop_tid = 0;
int dxgrab, usedga, usexvidmode;
+int use_xkb = 1;
int use_take_focus = 1;
int managed_mode = 1;
int client_side_with_core = 1;
@@ -318,6 +322,20 @@
}
else screen_depth = DefaultDepthOfScreen( screen );
+ /* check for Xkb extension */
+#ifdef HAVE_XKB
+ if (use_xkb)
+ {
+ int xkb_opcode, xkb_event, xkb_error;
+ int xkb_major = XkbMajorVersion, xkb_minor = XkbMinorVersion;
+
+ use_xkb = XkbQueryExtension(display, &xkb_opcode, &xkb_event, &xkb_error,
+ &xkb_major, &xkb_minor);
+ if (use_xkb) /* we have XKB, approximate Windows behaviour */
+ XkbSetDetectableAutoRepeat(display, True, NULL);
+ }
+#endif
+
/* Initialize OpenGL */
X11DRV_OpenGL_Init(display);
@@ -427,6 +445,10 @@
if (!(data->xim = XOpenIM( data->display, NULL, NULL, NULL )))
WARN("Can't open input method\n");
+#ifdef HAVE_XKB
+ if (use_xkb) XkbSetDetectableAutoRepeat( data->display, True, NULL );
+#endif
+
if (synchronous) XSynchronize( data->display, True );
wine_tsx11_unlock();
if (wine_server_fd_to_handle( ConnectionNumber(data->display), GENERIC_READ | SYNCHRONIZE,
diff --git a/include/x11drv.h b/include/x11drv.h
index 58d54f4..4604861 100644
--- a/include/x11drv.h
+++ b/include/x11drv.h
@@ -358,6 +358,7 @@
extern unsigned int screen_height;
extern unsigned int screen_depth;
extern unsigned int text_caps;
+extern int use_xkb;
extern int use_take_focus;
extern int managed_mode;