Turn on detectable autorepeat if the X Keyboard Extension is
detected.
diff --git a/windows/x11drv/keyboard.c b/windows/x11drv/keyboard.c
index 6e73f22..4e2592e 100644
--- a/windows/x11drv/keyboard.c
+++ b/windows/x11drv/keyboard.c
@@ -17,6 +17,9 @@
#include "ts_xlib.h"
#include "ts_xresource.h"
#include "ts_xutil.h"
+#ifdef HAVE_XKB
+#include <X11/XKBlib.h>
+#endif
#include <ctype.h>
#include <string.h>
@@ -46,6 +49,9 @@
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);
@@ -908,6 +914,9 @@
*/
void X11DRV_InitKeyboard(void)
{
+#ifdef HAVE_XKB
+ int xkb_major = XkbMajorVersion, xkb_minor = XkbMinorVersion;
+#endif
KeySym *ksp;
XModifierKeymap *mmp;
KeySym keysym;
@@ -918,6 +927,17 @@
char ckey[4]={0,0,0,0};
const char (*lkey)[MAIN_LEN][4];
+#ifdef HAVE_XKB
+ wine_tsx11_lock();
+ 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);
+ }
+ wine_tsx11_unlock();
+#endif
TSXDisplayKeycodes(display, &min_keycode, &max_keycode);
ksp = TSXGetKeyboardMapping(display, min_keycode,
max_keycode + 1 - min_keycode, &keysyms_per_keycode);