diff --git a/src/modules/keyboardmanager/common/KeyboardManagerState.cpp b/src/modules/keyboardmanager/common/KeyboardManagerState.cpp index dae82d5446..cad7247299 100644 --- a/src/modules/keyboardmanager/common/KeyboardManagerState.cpp +++ b/src/modules/keyboardmanager/common/KeyboardManagerState.cpp @@ -240,7 +240,6 @@ void KeyboardManagerState::UpdateDetectShortcutUI() auto detectedShortcutCopy = detectedShortcut; currentShortcut_lock.unlock(); detectedShortcut_lock.unlock(); - // Since this function is invoked from the back-end thread, in order to update the UI the dispatcher must be used. currentShortcutUI1.as().Dispatcher().RunAsync(Windows::UI::Core::CoreDispatcherPriority::Normal, [this, detectedShortcutCopy]() { std::vector shortcut = detectedShortcutCopy.GetKeyVector(keyboardMap); @@ -419,6 +418,7 @@ void KeyboardManagerState::RegisterKeyDelay( { throw std::invalid_argument("This key was already registered."); } + keyDelays[key] = std::make_unique(key, onShortPress, onLongPressDetected, onLongPressReleased); } @@ -433,6 +433,13 @@ void KeyboardManagerState::UnregisterKeyDelay(DWORD key) } } +// Function to clear all the registered key delays +void KeyboardManagerState::ClearRegisteredKeyDelays() +{ + std::lock_guard l(keyDelays_mutex); + keyDelays.clear(); +} + bool KeyboardManagerState::HandleKeyDelayEvent(LowlevelKeyboardEvent* ev) { if (currentUIWindow != GetForegroundWindow()) diff --git a/src/modules/keyboardmanager/common/KeyboardManagerState.h b/src/modules/keyboardmanager/common/KeyboardManagerState.h index 4caba6e6a9..6a4f4f4482 100644 --- a/src/modules/keyboardmanager/common/KeyboardManagerState.h +++ b/src/modules/keyboardmanager/common/KeyboardManagerState.h @@ -185,6 +185,9 @@ public: // NOTE*: the virtual key should represent the original, unmapped virtual key. void UnregisterKeyDelay(DWORD key); + // Function to clear all the registered key delays + void ClearRegisteredKeyDelays(); + // Handle a key event, for a delayed key. bool HandleKeyDelayEvent(LowlevelKeyboardEvent* ev); diff --git a/src/modules/keyboardmanager/ui/EditKeyboardWindow.cpp b/src/modules/keyboardmanager/ui/EditKeyboardWindow.cpp index 917568fbab..3facc45432 100644 --- a/src/modules/keyboardmanager/ui/EditKeyboardWindow.cpp +++ b/src/modules/keyboardmanager/ui/EditKeyboardWindow.cpp @@ -338,6 +338,7 @@ void createEditKeyboardWindow(HINSTANCE hInst, KeyboardManagerState& keyboardMan hwndLock.lock(); hwndEditKeyboardNativeWindow = nullptr; keyboardManagerState.ResetUIState(); + keyboardManagerState.ClearRegisteredKeyDelays(); // Cannot be done in WM_DESTROY because that causes crashes due to fatal app exit xamlBridge.ClearXamlIslands(); diff --git a/src/modules/keyboardmanager/ui/EditShortcutsWindow.cpp b/src/modules/keyboardmanager/ui/EditShortcutsWindow.cpp index 9cda98723b..f8c9f99982 100644 --- a/src/modules/keyboardmanager/ui/EditShortcutsWindow.cpp +++ b/src/modules/keyboardmanager/ui/EditShortcutsWindow.cpp @@ -322,6 +322,7 @@ void createEditShortcutsWindow(HINSTANCE hInst, KeyboardManagerState& keyboardMa hwndLock.lock(); hwndEditShortcutsNativeWindow = nullptr; keyboardManagerState.ResetUIState(); + keyboardManagerState.ClearRegisteredKeyDelays(); // Cannot be done in WM_DESTROY because that causes crashes due to fatal app exit xamlBridge.ClearXamlIslands(); diff --git a/src/modules/keyboardmanager/ui/ShortcutControl.cpp b/src/modules/keyboardmanager/ui/ShortcutControl.cpp index f49372ffa6..f2e0c480e0 100644 --- a/src/modules/keyboardmanager/ui/ShortcutControl.cpp +++ b/src/modules/keyboardmanager/ui/ShortcutControl.cpp @@ -264,10 +264,7 @@ void ShortcutControl::createDetectShortcutWindow(winrt::Windows::Foundation::IIn StackPanel linkedShortcutStackPanel = KeyboardManagerHelper::getSiblingElement(sender).as(); auto unregisterKeys = [&keyboardManagerState]() { - std::thread t1(&KeyboardManagerState::UnregisterKeyDelay, &keyboardManagerState, VK_ESCAPE); - std::thread t2(&KeyboardManagerState::UnregisterKeyDelay, &keyboardManagerState, VK_RETURN); - t1.detach(); - t2.detach(); + keyboardManagerState.ClearRegisteredKeyDelays(); }; auto selectDetectedShortcutAndResetKeys = [&keyboardManagerState](DWORD key) { diff --git a/src/modules/keyboardmanager/ui/SingleKeyRemapControl.cpp b/src/modules/keyboardmanager/ui/SingleKeyRemapControl.cpp index d057bb8e3e..a643149107 100644 --- a/src/modules/keyboardmanager/ui/SingleKeyRemapControl.cpp +++ b/src/modules/keyboardmanager/ui/SingleKeyRemapControl.cpp @@ -198,10 +198,7 @@ void SingleKeyRemapControl::createDetectKeyWindow(winrt::Windows::Foundation::II ComboBox linkedRemapDropDown = KeyboardManagerHelper::getSiblingElement(sender).as(); auto unregisterKeys = [&keyboardManagerState]() { - std::thread t1(&KeyboardManagerState::UnregisterKeyDelay, &keyboardManagerState, VK_ESCAPE); - std::thread t2(&KeyboardManagerState::UnregisterKeyDelay, &keyboardManagerState, VK_RETURN); - t1.detach(); - t2.detach(); + keyboardManagerState.ClearRegisteredKeyDelays(); }; auto onPressEnter = [linkedRemapDropDown,