From 35838b23af2d858fd0d6f8bb0cd616c98f993016 Mon Sep 17 00:00:00 2001 From: Kevin Zhang Date: Fri, 3 Dec 2021 13:36:08 -0600 Subject: [PATCH] Revise Hotkey control logic to remove hotkey at focus and add it back at lost focus. --- Flow.Launcher/HotkeyControl.xaml.cs | 18 +++++++----- .../Resources/Pages/WelcomePage2.xaml | 4 ++- .../Resources/Pages/WelcomePage2.xaml.cs | 29 ++++++++++++------- Flow.Launcher/SettingWindow.xaml | 3 +- Flow.Launcher/SettingWindow.xaml.cs | 12 +++++++- 5 files changed, 46 insertions(+), 20 deletions(-) diff --git a/Flow.Launcher/HotkeyControl.xaml.cs b/Flow.Launcher/HotkeyControl.xaml.cs index dd7a138d4..d4836b976 100644 --- a/Flow.Launcher/HotkeyControl.xaml.cs +++ b/Flow.Launcher/HotkeyControl.xaml.cs @@ -8,6 +8,7 @@ using Flow.Launcher.Core.Resource; using Flow.Launcher.Helper; using Flow.Launcher.Infrastructure.Hotkey; using Flow.Launcher.Plugin; +using System.Threading; namespace Flow.Launcher { @@ -25,8 +26,14 @@ namespace Flow.Launcher InitializeComponent(); } + private CancellationTokenSource hotkeyUpdateSource; + void TbHotkey_OnPreviewKeyDown(object sender, KeyEventArgs e) { + hotkeyUpdateSource?.Cancel(); + hotkeyUpdateSource?.Dispose(); + hotkeyUpdateSource = new(); + var token = hotkeyUpdateSource.Token; e.Handled = true; tbMsg.Visibility = Visibility.Hidden; @@ -52,7 +59,8 @@ namespace Flow.Launcher Dispatcher.InvokeAsync(async () => { await Task.Delay(500); - SetHotkey(hotkeyModel); + if (!token.IsCancellationRequested) + SetHotkey(hotkeyModel); }); } @@ -78,7 +86,6 @@ namespace Flow.Launcher } tbMsg.Visibility = Visibility.Visible; OnHotkeyChanged(); - Keyboard.ClearFocus(); } } @@ -89,9 +96,6 @@ namespace Flow.Launcher private bool CheckHotkeyAvailability() => HotKeyMapper.CheckAvailability(CurrentHotkey); - public new bool IsFocused - { - get { return tbHotkey.IsFocused; } - } + public new bool IsFocused => tbHotkey.IsFocused; } -} +} \ No newline at end of file diff --git a/Flow.Launcher/Resources/Pages/WelcomePage2.xaml b/Flow.Launcher/Resources/Pages/WelcomePage2.xaml index f8b30093b..033f9fe66 100644 --- a/Flow.Launcher/Resources/Pages/WelcomePage2.xaml +++ b/Flow.Launcher/Resources/Pages/WelcomePage2.xaml @@ -113,7 +113,9 @@ x:Name="HotkeyControl" Width="300" Height="35" - Margin="-206,10,0,0" /> + Margin="-206,10,0,0" + GotFocus="HotkeyControl_OnGotFocus" + LostFocus="HotkeyControl_OnLostFocus"/> diff --git a/Flow.Launcher/Resources/Pages/WelcomePage2.xaml.cs b/Flow.Launcher/Resources/Pages/WelcomePage2.xaml.cs index 5fad71b74..70c828f47 100644 --- a/Flow.Launcher/Resources/Pages/WelcomePage2.xaml.cs +++ b/Flow.Launcher/Resources/Pages/WelcomePage2.xaml.cs @@ -1,6 +1,8 @@ using Flow.Launcher.Helper; +using Flow.Launcher.Infrastructure.Hotkey; using Flow.Launcher.Infrastructure.UserSettings; using System; +using System.Windows; using System.Windows.Navigation; namespace Flow.Launcher.Resources.Pages @@ -17,16 +19,23 @@ namespace Flow.Launcher.Resources.Pages throw new ArgumentException("Unexpected Parameter setting."); InitializeComponent(); - HotkeyControl.SetHotkey(new Infrastructure.Hotkey.HotkeyModel(Settings.Hotkey)); - HotkeyControl.HotkeyChanged += (_, _) => + HotkeyControl.SetHotkey(new Infrastructure.Hotkey.HotkeyModel(Settings.Hotkey), false); + } + private void HotkeyControl_OnGotFocus(object sender, RoutedEventArgs args) + { + HotKeyMapper.RemoveHotkey(Settings.Hotkey); + } + private void HotkeyControl_OnLostFocus(object sender, RoutedEventArgs args) + { + if (HotkeyControl.CurrentHotkeyAvailable) { - if (HotkeyControl.CurrentHotkeyAvailable) - { - HotKeyMapper.SetHotkey(HotkeyControl.CurrentHotkey, HotKeyMapper.OnToggleHotkey); - HotKeyMapper.RemoveHotkey(Settings.Hotkey); - Settings.Hotkey = HotkeyControl.CurrentHotkey.ToString(); - } - }; + HotKeyMapper.SetHotkey(HotkeyControl.CurrentHotkey, HotKeyMapper.OnToggleHotkey); + Settings.Hotkey = HotkeyControl.CurrentHotkey.ToString(); + } + else + { + HotKeyMapper.SetHotkey(new HotkeyModel(Settings.Hotkey), HotKeyMapper.OnToggleHotkey); + } } } -} +} \ No newline at end of file diff --git a/Flow.Launcher/SettingWindow.xaml b/Flow.Launcher/SettingWindow.xaml index 0bcac919f..981b35f3c 100644 --- a/Flow.Launcher/SettingWindow.xaml +++ b/Flow.Launcher/SettingWindow.xaml @@ -2018,7 +2018,8 @@ Margin="0,0,0,0" HorizontalAlignment="Right" HorizontalContentAlignment="Right" - HotkeyChanged="OnHotkeyChanged" + LostFocus="OnHotkeyControlFocusLost" + GotFocus="OnHotkeyControlFocused" Loaded="OnHotkeyControlLoaded" /> diff --git a/Flow.Launcher/SettingWindow.xaml.cs b/Flow.Launcher/SettingWindow.xaml.cs index db8d14476..896760640 100644 --- a/Flow.Launcher/SettingWindow.xaml.cs +++ b/Flow.Launcher/SettingWindow.xaml.cs @@ -3,6 +3,7 @@ using Flow.Launcher.Core.Plugin; using Flow.Launcher.Core.Resource; using Flow.Launcher.Helper; using Flow.Launcher.Infrastructure; +using Flow.Launcher.Infrastructure.Hotkey; using Flow.Launcher.Infrastructure.UserSettings; using Flow.Launcher.Plugin; using Flow.Launcher.Plugin.SharedCommands; @@ -128,7 +129,12 @@ namespace Flow.Launcher HotkeyControl.SetHotkey(viewModel.Settings.Hotkey, false); } - void OnHotkeyChanged(object sender, EventArgs e) + private void OnHotkeyControlFocused(object sender, EventArgs e) + { + HotKeyMapper.RemoveHotkey(settings.Hotkey); + } + + private void OnHotkeyControlFocusLost(object sender, EventArgs e) { if (HotkeyControl.CurrentHotkeyAvailable) { @@ -136,6 +142,10 @@ namespace Flow.Launcher HotKeyMapper.RemoveHotkey(settings.Hotkey); settings.Hotkey = HotkeyControl.CurrentHotkey.ToString(); } + else + { + HotKeyMapper.SetHotkey(new HotkeyModel(settings.Hotkey), HotKeyMapper.OnToggleHotkey); + } } private void OnDeleteCustomHotkeyClick(object sender, RoutedEventArgs e)