From b43a831cd7761ce7fe49e8900f4fb3eea7f034ff Mon Sep 17 00:00:00 2001 From: Pedro Navarro Date: Fri, 25 Feb 2022 16:34:49 -0800 Subject: [PATCH] Reset the keyboard status after ToUnicodeEx After getting a dead key from `ToUnicodeEx`, add an additional `VK_SPACE` to the keyboard state so we reset the dead key flag and subsequent calls with modifiers, like shift, return the right result (-1) instead of 1. This happened because without reseting the dead key status the new one was attempted to be composed with the old one, which failed and the end result was a single unicode codepoint not marked as a dead key. This opens the door to potentially use the returned unicode from the second call to `ToUnicodeEx` as the key character instead of maintaining the getDeadKey function. This should, hopefully, address issues like https://github.com/debauchee/barrier/issues/1267 or https://github.com/debauchee/barrier/issues/727 https://github.com/debauchee/barrier/issues/1143 or https://github.com/debauchee/barrier/issues/795 I have submitted the same patch to Synergy. --- src/lib/platform/MSWindowsKeyState.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/lib/platform/MSWindowsKeyState.cpp b/src/lib/platform/MSWindowsKeyState.cpp index c723d19e..8d275177 100644 --- a/src/lib/platform/MSWindowsKeyState.cpp +++ b/src/lib/platform/MSWindowsKeyState.cpp @@ -1357,9 +1357,20 @@ MSWindowsKeyState::getIDForKey(barrier::KeyMap::KeyItem& item, KeyID id = static_cast(unicode[0]); switch (n) { - case -1: - return barrier::KeyMap::getDeadKey(id); + case -1: { + // dead key. add an space to the keyboard so we exit + // the dead key mode and future calls to this function + // with different modifiers are not affected. + BYTE emptyState[256] = { }; + n = m_ToUnicodeEx(VK_SPACE, 0, emptyState, unicode, + sizeof(unicode) / sizeof(unicode[0]), 0, hkl); + + // as an alternative, we could use the returned + // buffer in unicode to look at the dead key character + // and not rely on getDeadKey to provide the mapping. + return barrier::KeyMap::getDeadKey(id); + } default: case 0: // unmapped