Commit 6e3d645d authored by Fabian Vogt's avatar Fabian Vogt
Browse files

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
parent 9eecbbb7
Pipeline #119146 passed with stage
in 1 minute and 32 seconds
......@@ -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;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment