mirror of
https://github.com/Flow-Launcher/Flow.Launcher.git
synced 2026-03-11 08:54:32 +00:00
Enable the use of Win hotkey to trigger flow (#3262)
This commit is contained in:
parent
c13709134b
commit
54a49d68f3
4 changed files with 77 additions and 3 deletions
|
|
@ -83,6 +83,7 @@
|
|||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="ChefKeys" Version="0.1.2" />
|
||||
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.4.0" />
|
||||
<PackageReference Include="Fody" Version="6.5.4">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
|
|
|
|||
|
|
@ -6,6 +6,8 @@ using NHotkey.Wpf;
|
|||
using Flow.Launcher.Core.Resource;
|
||||
using Flow.Launcher.ViewModel;
|
||||
using Flow.Launcher.Core;
|
||||
using ChefKeys;
|
||||
using System.Globalization;
|
||||
|
||||
namespace Flow.Launcher.Helper;
|
||||
|
||||
|
|
@ -29,15 +31,40 @@ internal static class HotKeyMapper
|
|||
_mainViewModel.ToggleFlowLauncher();
|
||||
}
|
||||
|
||||
internal static void OnToggleHotkeyWithChefKeys()
|
||||
{
|
||||
if (!_mainViewModel.ShouldIgnoreHotkeys())
|
||||
_mainViewModel.ToggleFlowLauncher();
|
||||
}
|
||||
|
||||
private static void SetHotkey(string hotkeyStr, EventHandler<HotkeyEventArgs> action)
|
||||
{
|
||||
if (hotkeyStr == "LWin" || hotkeyStr == "RWin")
|
||||
{
|
||||
SetWithChefKeys(hotkeyStr);
|
||||
return;
|
||||
}
|
||||
|
||||
var hotkey = new HotkeyModel(hotkeyStr);
|
||||
SetHotkey(hotkey, action);
|
||||
}
|
||||
|
||||
private static void SetWithChefKeys(string hotkeyStr)
|
||||
{
|
||||
ChefKeysManager.RegisterHotkey(hotkeyStr, hotkeyStr, OnToggleHotkeyWithChefKeys);
|
||||
ChefKeysManager.Start();
|
||||
}
|
||||
|
||||
internal static void SetHotkey(HotkeyModel hotkey, EventHandler<HotkeyEventArgs> action)
|
||||
{
|
||||
string hotkeyStr = hotkey.ToString();
|
||||
|
||||
if (hotkeyStr == "LWin" || hotkeyStr == "RWin")
|
||||
{
|
||||
SetWithChefKeys(hotkeyStr);
|
||||
return;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
HotkeyManager.Current.AddOrReplace(hotkeyStr, hotkey.CharKey, hotkey.ModifierKeys, action);
|
||||
|
|
@ -52,12 +79,24 @@ internal static class HotKeyMapper
|
|||
|
||||
internal static void RemoveHotkey(string hotkeyStr)
|
||||
{
|
||||
if (hotkeyStr == "LWin" || hotkeyStr == "RWin")
|
||||
{
|
||||
RemoveWithChefKeys(hotkeyStr);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!string.IsNullOrEmpty(hotkeyStr))
|
||||
{
|
||||
HotkeyManager.Current.Remove(hotkeyStr);
|
||||
}
|
||||
}
|
||||
|
||||
private static void RemoveWithChefKeys(string hotkeyStr)
|
||||
{
|
||||
ChefKeysManager.UnregisterHotkey(hotkeyStr);
|
||||
ChefKeysManager.Stop();
|
||||
}
|
||||
|
||||
internal static void LoadCustomPluginHotkey()
|
||||
{
|
||||
if (_settings.CustomPluginHotkeys == null)
|
||||
|
|
|
|||
|
|
@ -154,7 +154,16 @@ namespace Flow.Launcher
|
|||
{
|
||||
if (triggerValidate)
|
||||
{
|
||||
bool hotkeyAvailable = CheckHotkeyAvailability(keyModel, ValidateKeyGesture);
|
||||
bool hotkeyAvailable = false;
|
||||
// TODO: This is a temporary way to enforce changing only the open flow hotkey to Win, and will be removed by PR #3157
|
||||
if (keyModel.ToString() == "LWin" || keyModel.ToString() == "RWin")
|
||||
{
|
||||
hotkeyAvailable = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
hotkeyAvailable = CheckHotkeyAvailability(keyModel, ValidateKeyGesture);
|
||||
}
|
||||
|
||||
if (!hotkeyAvailable)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ using System.Collections.ObjectModel;
|
|||
using System.Linq;
|
||||
using System.Windows;
|
||||
using System.Windows.Input;
|
||||
using ChefKeys;
|
||||
using Flow.Launcher.Core.Resource;
|
||||
using Flow.Launcher.Helper;
|
||||
using Flow.Launcher.Infrastructure.Hotkey;
|
||||
|
|
@ -33,6 +34,8 @@ public partial class HotkeyControlDialog : ContentDialog
|
|||
public string ResultValue { get; private set; } = string.Empty;
|
||||
public static string EmptyHotkey => InternationalizationManager.Instance.GetTranslation("none");
|
||||
|
||||
private static bool isOpenFlowHotkey;
|
||||
|
||||
public HotkeyControlDialog(string hotkey, string defaultHotkey, IHotkeySettings hotkeySettings, string windowTitle = "")
|
||||
{
|
||||
WindowTitle = windowTitle switch
|
||||
|
|
@ -46,6 +49,14 @@ public partial class HotkeyControlDialog : ContentDialog
|
|||
SetKeysToDisplay(CurrentHotkey);
|
||||
|
||||
InitializeComponent();
|
||||
|
||||
// TODO: This is a temporary way to enforce changing only the open flow hotkey to Win, and will be removed by PR #3157
|
||||
isOpenFlowHotkey = _hotkeySettings.RegisteredHotkeys
|
||||
.Any(x => x.DescriptionResourceKey == "flowlauncherHotkey"
|
||||
&& x.Hotkey.ToString() == hotkey);
|
||||
|
||||
ChefKeysManager.StartMenuEnableBlocking = true;
|
||||
ChefKeysManager.Start();
|
||||
}
|
||||
|
||||
private void Reset(object sender, RoutedEventArgs routedEventArgs)
|
||||
|
|
@ -61,12 +72,18 @@ public partial class HotkeyControlDialog : ContentDialog
|
|||
|
||||
private void Cancel(object sender, RoutedEventArgs routedEventArgs)
|
||||
{
|
||||
ChefKeysManager.StartMenuEnableBlocking = false;
|
||||
ChefKeysManager.Stop();
|
||||
|
||||
ResultType = EResultType.Cancel;
|
||||
Hide();
|
||||
}
|
||||
|
||||
private void Save(object sender, RoutedEventArgs routedEventArgs)
|
||||
{
|
||||
ChefKeysManager.StartMenuEnableBlocking = false;
|
||||
ChefKeysManager.Stop();
|
||||
|
||||
if (KeysToDisplay.Count == 1 && KeysToDisplay[0] == EmptyHotkey)
|
||||
{
|
||||
ResultType = EResultType.Delete;
|
||||
|
|
@ -85,6 +102,9 @@ public partial class HotkeyControlDialog : ContentDialog
|
|||
//when alt is pressed, the real key should be e.SystemKey
|
||||
Key key = e.Key == Key.System ? e.SystemKey : e.Key;
|
||||
|
||||
if (ChefKeysManager.StartMenuBlocked && key.ToString() == ChefKeysManager.StartMenuSimulatedKey)
|
||||
return;
|
||||
|
||||
SpecialKeyState specialKeyState = GlobalHotkey.CheckModifiers();
|
||||
|
||||
var hotkeyModel = new HotkeyModel(
|
||||
|
|
@ -168,8 +188,13 @@ public partial class HotkeyControlDialog : ContentDialog
|
|||
}
|
||||
}
|
||||
|
||||
private static bool CheckHotkeyAvailability(HotkeyModel hotkey, bool validateKeyGesture) =>
|
||||
hotkey.Validate(validateKeyGesture) && HotKeyMapper.CheckAvailability(hotkey);
|
||||
private static bool CheckHotkeyAvailability(HotkeyModel hotkey, bool validateKeyGesture)
|
||||
{
|
||||
if (isOpenFlowHotkey && (hotkey.ToString() == "LWin" || hotkey.ToString() == "RWin"))
|
||||
return true;
|
||||
|
||||
return hotkey.Validate(validateKeyGesture) && HotKeyMapper.CheckAvailability(hotkey);
|
||||
}
|
||||
|
||||
private void Overwrite(object sender, RoutedEventArgs e)
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in a new issue