diff --git a/dlls/x11drv/keyboard.c b/dlls/x11drv/keyboard.c index 2dd14ff06de..20b8214af36 100644 --- a/dlls/x11drv/keyboard.c +++ b/dlls/x11drv/keyboard.c @@ -58,9 +58,6 @@ WORD keyc2vkey[256], keyc2scan[256]; 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 @@ X11DRV_KEYBOARD_DetectLayout (void) 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 @@ X11DRV_KEYBOARD_DetectLayout (void) */ 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 @@ void X11DRV_InitKeyboard( BYTE *key_state_table ) 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 @@ void X11DRV_InitKeyboard( BYTE *key_state_table ) 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 688551c41c8..5e4df9d3b7e 100644 --- a/dlls/x11drv/x11drv_main.c +++ b/dlls/x11drv/x11drv_main.c @@ -33,6 +33,9 @@ #endif #include #include "ts_xlib.h" +#ifdef HAVE_XKB +#include +#endif #include "winbase.h" #include "wine/winbase16.h" @@ -59,6 +62,7 @@ unsigned int screen_depth; 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 @@ static void process_attach(void) } 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 @@ struct x11drv_thread_data *x11drv_init_thread_data(void) 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 58d54f4e09a..46048615092 100644 --- a/include/x11drv.h +++ b/include/x11drv.h @@ -358,6 +358,7 @@ extern unsigned int screen_width; 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;