From 21b0f233c7b62da546c55722d6875a28e175a291 Mon Sep 17 00:00:00 2001 From: Pedro Navarro Date: Mon, 2 May 2022 11:13:15 -0700 Subject: [PATCH] Address issues with modifiers and dead keys (#7149) * 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 as the key character instead of maintaining the getDeadKey function. * Update ChangeLog Co-authored-by: Pedro Navarro Co-authored-by: Serhii Hadzhilov Co-authored-by: Serhii Hadzhilov <71632867+SerhiiGadzhilov@users.noreply.github.com> --- ChangeLog | 1 + src/lib/platform/MSWindowsKeyState.cpp | 15 +++++++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index ab6abbdae..724affde2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -6,6 +6,7 @@ Enhancements: Bug fixes: - #7144 Fix double lines when pasting text from Linux to Windows +- #7149 Address issues with modifiers and dead keys Github Actions: - #7148 Fix unstable build for windows core diff --git a/src/lib/platform/MSWindowsKeyState.cpp b/src/lib/platform/MSWindowsKeyState.cpp index e24788e44..838f47428 100644 --- a/src/lib/platform/MSWindowsKeyState.cpp +++ b/src/lib/platform/MSWindowsKeyState.cpp @@ -1367,9 +1367,20 @@ MSWindowsKeyState::getIDForKey(synergy::KeyMap::KeyItem& item, KeyID id = static_cast(unicode[0]); switch (n) { - case -1: - return synergy::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 synergy::KeyMap::getDeadKey(id); + } default: case 0: // unmapped