summaryrefslogtreecommitdiff
path: root/kde-frameworks/kwindowsystem/files/kwindowsystem-5.90.0-avoid-XKeycodeToKeysym.patch
blob: a9f47883e6e81ea6686bbd60730d7834f6ec8367 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
From 6e3d645d444073097e93520f047bb2321673119a Mon Sep 17 00:00:00 2001
From: Fabian Vogt <fabian@ritter-vogt.de>
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