From 6a50a7646694da167cae919c8b58b19dd7ab6bb7 Mon Sep 17 00:00:00 2001 From: Albert Weichselbraun Date: Mon, 16 Dec 2013 09:18:03 +0100 Subject: [PATCH] Track the last remapped keysym in m_currentRemapKeycode to enforce a new computation of m_remapKeycode when the keyboard layout changes. (This fixes a potential problem with AddKeysym overwriting used keysyms after applying a new keyboard layout). --- src/autotype/x11/AutoTypeX11.cpp | 16 +++++++++------- src/autotype/x11/AutoTypeX11.h | 5 +++-- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/autotype/x11/AutoTypeX11.cpp b/src/autotype/x11/AutoTypeX11.cpp index e14629926..c6260fcbf 100644 --- a/src/autotype/x11/AutoTypeX11.cpp +++ b/src/autotype/x11/AutoTypeX11.cpp @@ -46,7 +46,8 @@ AutoTypePlatformX11::AutoTypePlatformX11() m_keysymTable = Q_NULLPTR; m_xkb = Q_NULLPTR; - m_specialCharacterKeycode = 0; + m_remapKeycode = 0; + m_currentRemapKeycode = NoSymbol; m_modifierMask = ControlMask | ShiftMask | Mod1Mask | Mod4Mask; m_loaded = true; @@ -440,11 +441,12 @@ void AutoTypePlatformX11::updateKeymap() &m_keysymPerKeycode); /* determine the keycode to use for remapped keys */ - if (m_specialCharacterKeycode == 0) { + inx = (m_remapKeycode - m_minKeycode) * m_keysymPerKeycode; + if (m_remapKeycode == 0 || m_keysymTable[inx] != m_currentRemapKeycode) { for (keycode = m_minKeycode; keycode <= m_maxKeycode; keycode++) { inx = (keycode - m_minKeycode) * m_keysymPerKeycode; if (m_keysymTable[inx] == NoSymbol) { - m_specialCharacterKeycode = keycode; + m_remapKeycode = keycode; break; } } @@ -505,13 +507,13 @@ int AutoTypePlatformX11::x11ErrorHandler(Display* display, XErrorEvent* error) */ int AutoTypePlatformX11::AddKeysym(KeySym keysym) { - if (m_specialCharacterKeycode == 0) { + if (m_remapKeycode == 0) { return 0; } - int inx = (m_specialCharacterKeycode - m_minKeycode) * m_keysymPerKeycode; + int inx = (m_remapKeycode- m_minKeycode) * m_keysymPerKeycode; m_keysymTable[inx] = keysym; - XChangeKeyboardMapping(m_dpy, m_specialCharacterKeycode, m_keysymPerKeycode, &m_keysymTable[inx], 1); + XChangeKeyboardMapping(m_dpy, m_remapKeycode, m_keysymPerKeycode, &m_keysymTable[inx], 1); XFlush(m_dpy); /* Xlib needs some time until the mapping is distributed to @@ -521,7 +523,7 @@ int AutoTypePlatformX11::AddKeysym(KeySym keysym) ts.tv_nsec = 10 * 1000 * 1000; nanosleep(&ts, Q_NULLPTR); - return m_specialCharacterKeycode; + return m_remapKeycode; } /* diff --git a/src/autotype/x11/AutoTypeX11.h b/src/autotype/x11/AutoTypeX11.h index 55456e849..202257e3f 100644 --- a/src/autotype/x11/AutoTypeX11.h +++ b/src/autotype/x11/AutoTypeX11.h @@ -106,8 +106,9 @@ private: int m_minKeycode; int m_maxKeycode; int m_keysymPerKeycode; - /* dedicated 'special character' keycode */ - int m_specialCharacterKeycode; + /* dedicated keycode for remapped keys */ + unsigned int m_remapKeycode; + KeySym m_currentRemapKeycode; KeyCode m_modifier_keycode[N_MOD_INDICES]; bool m_loaded; };