From 6e3d645d444073097e93520f047bb2321673119a Mon Sep 17 00:00:00 2001 From: Fabian Vogt Date: Sun, 2 Jan 2022 23:52:07 +0100 Subject: [PATCH] Avoid XKeycodeToKeysym in KKeyServer::initializeMods Xlib functions which work with keyboard mappings have a (Display) internal cache, which needs to be refreshed on mapping changes by calling X(kb)RefreshKeyboardMapping on change notify events. After Qt switched to XCB, that is no longer happening, and it's also not possible to get to the XEvent needed for triggering the refresh. Switch over to using the XCB equivalent and just load the symbols on every invocation. BUG: 426684 --- src/platforms/xcb/kkeyserver.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/platforms/xcb/kkeyserver.cpp b/src/platforms/xcb/kkeyserver.cpp index 306c63b..bc43dbd 100644 --- a/src/platforms/xcb/kkeyserver.cpp +++ b/src/platforms/xcb/kkeyserver.cpp @@ -496,6 +496,7 @@ bool initializeMods() } checkDisplay(); + xcb_key_symbols_t *symbols = xcb_key_symbols_alloc(QX11Info::connection()); XModifierKeymap *xmk = XGetModifierMapping(QX11Info::display()); int min_keycode; @@ -515,7 +516,7 @@ bool initializeMods() // found fixes the problem. for (int j = 0; j < xmk->max_keypermod; ++j) { for (int k = 0; k < keysyms_per_keycode; ++k) { - keySymX = XKeycodeToKeysym(QX11Info::display(), xmk->modifiermap[xmk->max_keypermod * i + j], k); + keySymX = xcb_key_symbols_get_keysym(symbols, xmk->modifiermap[xmk->max_keypermod * i + j], k); switch (keySymX) { case XK_Alt_L: @@ -628,6 +629,7 @@ bool initializeMods() g_rgX11ModInfo[2].modX = g_alt_mask; g_rgX11ModInfo[3].modX = g_meta_mask; + xcb_key_symbols_free(symbols); XFreeModifiermap(xmk); g_bInitializedMods = true; -- GitLab