From: Rémi Bernon <rbernon@codeweavers.com> --- dlls/winex11.drv/keyboard.c | 71 ++++++++++++++++------------------ dlls/winex11.drv/x11drv.h | 2 +- dlls/winex11.drv/x11drv_main.c | 3 +- 3 files changed, 36 insertions(+), 40 deletions(-) diff --git a/dlls/winex11.drv/keyboard.c b/dlls/winex11.drv/keyboard.c index e2281bef017..bf962d656c6 100644 --- a/dlls/winex11.drv/keyboard.c +++ b/dlls/winex11.drv/keyboard.c @@ -1435,16 +1435,8 @@ BOOL X11DRV_KeyEvent( HWND hwnd, XEvent *xev ) return TRUE; } -/********************************************************************** - * X11DRV_KEYBOARD_DetectLayout - * - * Called from X11DRV_InitKeyboard - * This routine walks through the defined keyboard layouts and selects - * whichever matches most closely. - * kbd_section must be held. - */ -static void -X11DRV_KEYBOARD_DetectLayout( Display *display ) +/* fuzzy layout detection through keysym / keycode matching, kbd_section must be held */ +static void detect_keyboard_layout( Display *display ) { unsigned current, match, mismatch, seq, i, syms; int score, keyc, key, pkey, ok; @@ -1547,10 +1539,8 @@ X11DRV_KEYBOARD_DetectLayout( Display *display ) } -/********************************************************************** - * X11DRV_InitKeyboard - */ -void X11DRV_InitKeyboard( Display *display ) +/* initialize or update keyboard layouts */ +static void init_keyboard_layouts( Display *display ) { XModifierKeymap *mmp; KeySym keysym; @@ -1582,37 +1572,34 @@ void X11DRV_InitKeyboard( Display *display ) int vkey_range; pthread_mutex_lock( &kbd_mutex ); - XDisplayKeycodes(display, &min_keycode, &max_keycode); + XDisplayKeycodes( display, &min_keycode, &max_keycode ); XFree( XGetKeyboardMapping( display, min_keycode, max_keycode + 1 - min_keycode, &keysyms_per_keycode ) ); - mmp = XGetModifierMapping(display); + mmp = XGetModifierMapping( display ); kcp = mmp->modifiermap; - for (i = 0; i < 8; i += 1) /* There are 8 modifier keys */ + for (int i = 0; i < 8; i += 1) /* There are 8 modifier keys */ { - int j; - - for (j = 0; j < mmp->max_keypermod; j += 1, kcp += 1) - if (*kcp) + for (int j = 0; j < mmp->max_keypermod; j += 1, kcp += 1) + { + for (int k = 0; *kcp && k < keysyms_per_keycode; k += 1) { - int k; - - for (k = 0; k < keysyms_per_keycode; k += 1) - if (XkbKeycodeToKeysym( display, *kcp, 0, k ) == XK_Num_Lock) - { - NumLockMask = 1 << i; - TRACE_(key)("NumLockMask is %x\n", NumLockMask); - } - else if (XkbKeycodeToKeysym( display, *kcp, 0, k ) == XK_Scroll_Lock) - { - ScrollLockMask = 1 << i; - TRACE_(key)("ScrollLockMask is %x\n", ScrollLockMask); - } + if (XkbKeycodeToKeysym( display, *kcp, 0, k ) == XK_Num_Lock) + { + NumLockMask = 1 << i; + TRACE_ ( key )("NumLockMask is %x\n", NumLockMask); + } + else if (XkbKeycodeToKeysym( display, *kcp, 0, k ) == XK_Scroll_Lock) + { + ScrollLockMask = 1 << i; + TRACE_ ( key )("ScrollLockMask is %x\n", ScrollLockMask); + } } + } } - XFreeModifiermap(mmp); + XFreeModifiermap( mmp ); /* Detect the keyboard layout */ - X11DRV_KEYBOARD_DetectLayout( display ); + detect_keyboard_layout( display ); lkey = main_key_tab[kbd_layout].key; syms = (keysyms_per_keycode > 4) ? 4 : keysyms_per_keycode; @@ -1844,7 +1831,7 @@ BOOL X11DRV_MappingNotify( HWND dummy, XEvent *event ) HWND hwnd; XRefreshKeyboardMapping(&event->xmapping); - X11DRV_InitKeyboard( event->xmapping.display ); + init_keyboard_layouts( event->xmapping.display ); hwnd = get_focus(); if (!hwnd) hwnd = get_active_window(); @@ -1854,6 +1841,16 @@ BOOL X11DRV_MappingNotify( HWND dummy, XEvent *event ) } +/*********************************************************************** + * x11drv_init_keyboard + */ +void x11drv_init_keyboard( Display *display ) +{ + XkbUseExtension( display, NULL, NULL ); + init_keyboard_layouts( display ); +} + + /*********************************************************************** * VkKeyScanEx (X11DRV.@) * diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index 8b0c0a62f91..e69ac5a8ae0 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -753,7 +753,7 @@ extern void X11DRV_ActivateWindow( HWND hwnd, HWND previous ); extern void reapply_cursor_clipping(void); extern void ungrab_clipping_window(void); extern void move_resize_window( HWND hwnd, int dir, POINT pos ); -extern void X11DRV_InitKeyboard( Display *display ); +extern void x11drv_init_keyboard( Display *display ); extern BOOL X11DRV_ProcessEvents( DWORD mask ); typedef int (*x11drv_error_callback)( Display *display, XErrorEvent *event, void *arg ); diff --git a/dlls/winex11.drv/x11drv_main.c b/dlls/winex11.drv/x11drv_main.c index 1bdcd282f2e..1c8002e263c 100644 --- a/dlls/winex11.drv/x11drv_main.c +++ b/dlls/winex11.drv/x11drv_main.c @@ -672,8 +672,7 @@ NTSTATUS __wine_unix_lib_init(void) #endif x11drv_xinput2_load(); - XkbUseExtension( gdi_display, NULL, NULL ); - X11DRV_InitKeyboard( gdi_display ); + x11drv_init_keyboard( gdi_display ); if (use_xim) use_xim = xim_init( input_style ); init_icm_profile(); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10689