Unregister key delays on closing KBM windows (#6583)

This commit is contained in:
Arjun Balgovind
2020-09-11 15:16:34 -07:00
committed by GitHub
parent 1dec80902d
commit bfbd7b53a1
6 changed files with 15 additions and 9 deletions

View File

@@ -240,7 +240,6 @@ void KeyboardManagerState::UpdateDetectShortcutUI()
auto detectedShortcutCopy = detectedShortcut; auto detectedShortcutCopy = detectedShortcut;
currentShortcut_lock.unlock(); currentShortcut_lock.unlock();
detectedShortcut_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. // Since this function is invoked from the back-end thread, in order to update the UI the dispatcher must be used.
currentShortcutUI1.as<StackPanel>().Dispatcher().RunAsync(Windows::UI::Core::CoreDispatcherPriority::Normal, [this, detectedShortcutCopy]() { currentShortcutUI1.as<StackPanel>().Dispatcher().RunAsync(Windows::UI::Core::CoreDispatcherPriority::Normal, [this, detectedShortcutCopy]() {
std::vector<hstring> shortcut = detectedShortcutCopy.GetKeyVector(keyboardMap); std::vector<hstring> shortcut = detectedShortcutCopy.GetKeyVector(keyboardMap);
@@ -419,6 +418,7 @@ void KeyboardManagerState::RegisterKeyDelay(
{ {
throw std::invalid_argument("This key was already registered."); throw std::invalid_argument("This key was already registered.");
} }
keyDelays[key] = std::make_unique<KeyDelay>(key, onShortPress, onLongPressDetected, onLongPressReleased); keyDelays[key] = std::make_unique<KeyDelay>(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) bool KeyboardManagerState::HandleKeyDelayEvent(LowlevelKeyboardEvent* ev)
{ {
if (currentUIWindow != GetForegroundWindow()) if (currentUIWindow != GetForegroundWindow())

View File

@@ -185,6 +185,9 @@ public:
// NOTE*: the virtual key should represent the original, unmapped virtual key. // NOTE*: the virtual key should represent the original, unmapped virtual key.
void UnregisterKeyDelay(DWORD key); void UnregisterKeyDelay(DWORD key);
// Function to clear all the registered key delays
void ClearRegisteredKeyDelays();
// Handle a key event, for a delayed key. // Handle a key event, for a delayed key.
bool HandleKeyDelayEvent(LowlevelKeyboardEvent* ev); bool HandleKeyDelayEvent(LowlevelKeyboardEvent* ev);

View File

@@ -338,6 +338,7 @@ void createEditKeyboardWindow(HINSTANCE hInst, KeyboardManagerState& keyboardMan
hwndLock.lock(); hwndLock.lock();
hwndEditKeyboardNativeWindow = nullptr; hwndEditKeyboardNativeWindow = nullptr;
keyboardManagerState.ResetUIState(); keyboardManagerState.ResetUIState();
keyboardManagerState.ClearRegisteredKeyDelays();
// Cannot be done in WM_DESTROY because that causes crashes due to fatal app exit // Cannot be done in WM_DESTROY because that causes crashes due to fatal app exit
xamlBridge.ClearXamlIslands(); xamlBridge.ClearXamlIslands();

View File

@@ -322,6 +322,7 @@ void createEditShortcutsWindow(HINSTANCE hInst, KeyboardManagerState& keyboardMa
hwndLock.lock(); hwndLock.lock();
hwndEditShortcutsNativeWindow = nullptr; hwndEditShortcutsNativeWindow = nullptr;
keyboardManagerState.ResetUIState(); keyboardManagerState.ResetUIState();
keyboardManagerState.ClearRegisteredKeyDelays();
// Cannot be done in WM_DESTROY because that causes crashes due to fatal app exit // Cannot be done in WM_DESTROY because that causes crashes due to fatal app exit
xamlBridge.ClearXamlIslands(); xamlBridge.ClearXamlIslands();

View File

@@ -264,10 +264,7 @@ void ShortcutControl::createDetectShortcutWindow(winrt::Windows::Foundation::IIn
StackPanel linkedShortcutStackPanel = KeyboardManagerHelper::getSiblingElement(sender).as<StackPanel>(); StackPanel linkedShortcutStackPanel = KeyboardManagerHelper::getSiblingElement(sender).as<StackPanel>();
auto unregisterKeys = [&keyboardManagerState]() { auto unregisterKeys = [&keyboardManagerState]() {
std::thread t1(&KeyboardManagerState::UnregisterKeyDelay, &keyboardManagerState, VK_ESCAPE); keyboardManagerState.ClearRegisteredKeyDelays();
std::thread t2(&KeyboardManagerState::UnregisterKeyDelay, &keyboardManagerState, VK_RETURN);
t1.detach();
t2.detach();
}; };
auto selectDetectedShortcutAndResetKeys = [&keyboardManagerState](DWORD key) { auto selectDetectedShortcutAndResetKeys = [&keyboardManagerState](DWORD key) {

View File

@@ -198,10 +198,7 @@ void SingleKeyRemapControl::createDetectKeyWindow(winrt::Windows::Foundation::II
ComboBox linkedRemapDropDown = KeyboardManagerHelper::getSiblingElement(sender).as<ComboBox>(); ComboBox linkedRemapDropDown = KeyboardManagerHelper::getSiblingElement(sender).as<ComboBox>();
auto unregisterKeys = [&keyboardManagerState]() { auto unregisterKeys = [&keyboardManagerState]() {
std::thread t1(&KeyboardManagerState::UnregisterKeyDelay, &keyboardManagerState, VK_ESCAPE); keyboardManagerState.ClearRegisteredKeyDelays();
std::thread t2(&KeyboardManagerState::UnregisterKeyDelay, &keyboardManagerState, VK_RETURN);
t1.detach();
t2.detach();
}; };
auto onPressEnter = [linkedRemapDropDown, auto onPressEnter = [linkedRemapDropDown,