mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-04-06 03:07:04 +02:00
[Keyboard Manager] Remove service enable/disable separate from module, fix editor clear shortcut (#46530)
Two changes to shortcuts here: 1) Remove toggling the KBM service with a shortcut or via command palette 2) Ensure that shortcut is disabled for editor when shortcut is cleared
This commit is contained in:
@@ -300,10 +300,6 @@ namespace winrt::PowerToys::Interop::implementation
|
|||||||
{
|
{
|
||||||
return CommonSharedConstants::OPEN_NEW_KEYBOARD_MANAGER_EVENT;
|
return CommonSharedConstants::OPEN_NEW_KEYBOARD_MANAGER_EVENT;
|
||||||
}
|
}
|
||||||
hstring Constants::ToggleKeyboardManagerActiveEvent()
|
|
||||||
{
|
|
||||||
return CommonSharedConstants::TOGGLE_KEYBOARD_MANAGER_ACTIVE_EVENT;
|
|
||||||
}
|
|
||||||
hstring Constants::KeyboardManagerEngineInstanceMutex()
|
hstring Constants::KeyboardManagerEngineInstanceMutex()
|
||||||
{
|
{
|
||||||
return CommonSharedConstants::KEYBOARD_MANAGER_ENGINE_INSTANCE_MUTEX;
|
return CommonSharedConstants::KEYBOARD_MANAGER_ENGINE_INSTANCE_MUTEX;
|
||||||
|
|||||||
@@ -78,7 +78,6 @@ namespace winrt::PowerToys::Interop::implementation
|
|||||||
static hstring MWBToggleEasyMouseEvent();
|
static hstring MWBToggleEasyMouseEvent();
|
||||||
static hstring MWBReconnectEvent();
|
static hstring MWBReconnectEvent();
|
||||||
static hstring OpenNewKeyboardManagerEvent();
|
static hstring OpenNewKeyboardManagerEvent();
|
||||||
static hstring ToggleKeyboardManagerActiveEvent();
|
|
||||||
static hstring KeyboardManagerEngineInstanceMutex();
|
static hstring KeyboardManagerEngineInstanceMutex();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -75,7 +75,6 @@ namespace PowerToys
|
|||||||
static String MWBToggleEasyMouseEvent();
|
static String MWBToggleEasyMouseEvent();
|
||||||
static String MWBReconnectEvent();
|
static String MWBReconnectEvent();
|
||||||
static String OpenNewKeyboardManagerEvent();
|
static String OpenNewKeyboardManagerEvent();
|
||||||
static String ToggleKeyboardManagerActiveEvent();
|
|
||||||
static String KeyboardManagerEngineInstanceMutex();
|
static String KeyboardManagerEngineInstanceMutex();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -173,7 +173,6 @@ namespace CommonSharedConstants
|
|||||||
|
|
||||||
// Path to events used by Keyboard Manager
|
// Path to events used by Keyboard Manager
|
||||||
const wchar_t OPEN_NEW_KEYBOARD_MANAGER_EVENT[] = L"Local\\PowerToysOpenNewKeyboardManagerEvent-9c1d2e3f-4b5a-6c7d-8e9f-0a1b2c3d4e5f";
|
const wchar_t OPEN_NEW_KEYBOARD_MANAGER_EVENT[] = L"Local\\PowerToysOpenNewKeyboardManagerEvent-9c1d2e3f-4b5a-6c7d-8e9f-0a1b2c3d4e5f";
|
||||||
const wchar_t TOGGLE_KEYBOARD_MANAGER_ACTIVE_EVENT[] = L"Local\\PowerToysToggleKeyboardManagerActiveEvent-7f3a1d5c-2e94-4ff4-8b6a-90fd2bc4d2a7";
|
|
||||||
const wchar_t KEYBOARD_MANAGER_ENGINE_INSTANCE_MUTEX[] = L"Local\\PowerToys_KBMEngine_InstanceMutex";
|
const wchar_t KEYBOARD_MANAGER_ENGINE_INSTANCE_MUTEX[] = L"Local\\PowerToys_KBMEngine_InstanceMutex";
|
||||||
|
|
||||||
// used from quick access window
|
// used from quick access window
|
||||||
|
|||||||
@@ -1,24 +0,0 @@
|
|||||||
// Copyright (c) Microsoft Corporation
|
|
||||||
// The Microsoft Corporation licenses this file to you under the MIT license.
|
|
||||||
// See the LICENSE file in the project root for more information.
|
|
||||||
|
|
||||||
using Microsoft.CommandPalette.Extensions.Toolkit;
|
|
||||||
using PowerToysExtension.Helpers;
|
|
||||||
using PowerToysExtension.Properties;
|
|
||||||
|
|
||||||
namespace PowerToysExtension.Commands;
|
|
||||||
|
|
||||||
internal sealed partial class ToggleKeyboardManagerListeningCommand : InvokableCommand
|
|
||||||
{
|
|
||||||
public ToggleKeyboardManagerListeningCommand()
|
|
||||||
{
|
|
||||||
Name = "Toggle Keyboard Manager active state";
|
|
||||||
}
|
|
||||||
|
|
||||||
public override CommandResult Invoke()
|
|
||||||
{
|
|
||||||
return KeyboardManagerStateService.TryToggleListening()
|
|
||||||
? CommandResult.KeepOpen()
|
|
||||||
: CommandResult.ShowToast(Resources.ResourceManager.GetString("KeyboardManager_ToggleListening_Error", Resources.Culture) ?? "Keyboard Manager is unavailable. Try enabling it in PowerToys settings.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -43,21 +43,6 @@ internal static class KeyboardManagerStateService
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static bool TryToggleListening()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
using var evt = EventWaitHandle.OpenExisting(Constants.ToggleKeyboardManagerActiveEvent());
|
|
||||||
var signaled = evt.Set();
|
|
||||||
PollStatus();
|
|
||||||
return signaled;
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void PollStatus()
|
private static void PollStatus()
|
||||||
{
|
{
|
||||||
var isListening = IsListening();
|
var isListening = IsListening();
|
||||||
|
|||||||
@@ -14,11 +14,6 @@ internal static class PowerToysResourcesHelper
|
|||||||
|
|
||||||
internal static IconInfo IconFromSettingsIcon(string fileName) => IconHelpers.FromRelativePath($"{SettingsIconRoot}{fileName}");
|
internal static IconInfo IconFromSettingsIcon(string fileName) => IconHelpers.FromRelativePath($"{SettingsIconRoot}{fileName}");
|
||||||
|
|
||||||
internal static IconInfo KeyboardManagerListeningIcon(bool isListening) => IconHelpers.FromRelativePath(
|
|
||||||
isListening
|
|
||||||
? $"{AssetsRoot}KeyboardManager\\KeyboardManagerListeningOn.svg"
|
|
||||||
: $"{AssetsRoot}KeyboardManager\\KeyboardManagerListeningOff.svg");
|
|
||||||
|
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
public static IconInfo ProviderIcon() => IconFromSettingsIcon("PowerToys.dark.png");
|
public static IconInfo ProviderIcon() => IconFromSettingsIcon("PowerToys.dark.png");
|
||||||
#else
|
#else
|
||||||
|
|||||||
@@ -22,19 +22,6 @@ internal sealed class KeyboardManagerModuleCommandProvider : ModuleCommandProvid
|
|||||||
var title = module.ModuleDisplayName();
|
var title = module.ModuleDisplayName();
|
||||||
var icon = module.ModuleIcon();
|
var icon = module.ModuleIcon();
|
||||||
|
|
||||||
if (ModuleEnablementService.IsModuleEnabled(module))
|
|
||||||
{
|
|
||||||
var isListening = KeyboardManagerStateService.IsListening();
|
|
||||||
yield return new ListItem(new ToggleKeyboardManagerListeningCommand() { Id = "com.microsoft.powertoys.keyboardManager.toggleListening" })
|
|
||||||
{
|
|
||||||
Title = GetResourceString("KeyboardManager_ToggleListening_Title", "Keyboard Manager: Toggle active state"),
|
|
||||||
Subtitle = isListening
|
|
||||||
? GetResourceString("KeyboardManager_ToggleListening_On_Subtitle", "Keyboard Manager is active. Invoke to stop listening.")
|
|
||||||
: GetResourceString("KeyboardManager_ToggleListening_Off_Subtitle", "Keyboard Manager is paused. Invoke to start listening."),
|
|
||||||
Icon = PowerToysResourcesHelper.KeyboardManagerListeningIcon(isListening),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
if (IsUseNewEditorEnabled())
|
if (IsUseNewEditorEnabled())
|
||||||
{
|
{
|
||||||
yield return new ListItem(new OpenNewKeyboardManagerEditorCommand() { Id = "com.microsoft.powertoys.keyboardManager.openNewEditor" })
|
yield return new ListItem(new OpenNewKeyboardManagerEditorCommand() { Id = "com.microsoft.powertoys.keyboardManager.openNewEditor" })
|
||||||
|
|||||||
@@ -414,18 +414,6 @@
|
|||||||
<data name="KeyboardManager_OpenNewEditor_Subtitle" xml:space="preserve">
|
<data name="KeyboardManager_OpenNewEditor_Subtitle" xml:space="preserve">
|
||||||
<value>Open the Keyboard Manager remap editor</value>
|
<value>Open the Keyboard Manager remap editor</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="KeyboardManager_ToggleListening_Title" xml:space="preserve">
|
|
||||||
<value>Keyboard Manager: Toggle active state</value>
|
|
||||||
</data>
|
|
||||||
<data name="KeyboardManager_ToggleListening_On_Subtitle" xml:space="preserve">
|
|
||||||
<value>Keyboard Manager is active. Invoke to stop listening.</value>
|
|
||||||
</data>
|
|
||||||
<data name="KeyboardManager_ToggleListening_Off_Subtitle" xml:space="preserve">
|
|
||||||
<value>Keyboard Manager is paused. Invoke to start listening.</value>
|
|
||||||
</data>
|
|
||||||
<data name="KeyboardManager_ToggleListening_Error" xml:space="preserve">
|
|
||||||
<value>Keyboard Manager is unavailable. Try enabling it in PowerToys settings.</value>
|
|
||||||
</data>
|
|
||||||
<!-- Light Switch Module -->
|
<!-- Light Switch Module -->
|
||||||
<data name="LightSwitch_Toggle_Title" xml:space="preserve">
|
<data name="LightSwitch_Toggle_Title" xml:space="preserve">
|
||||||
<value>Light Switch: Toggle theme</value>
|
<value>Light Switch: Toggle theme</value>
|
||||||
|
|||||||
@@ -38,7 +38,6 @@ namespace
|
|||||||
const wchar_t JSON_KEY_CTRL[] = L"ctrl";
|
const wchar_t JSON_KEY_CTRL[] = L"ctrl";
|
||||||
const wchar_t JSON_KEY_SHIFT[] = L"shift";
|
const wchar_t JSON_KEY_SHIFT[] = L"shift";
|
||||||
const wchar_t JSON_KEY_CODE[] = L"code";
|
const wchar_t JSON_KEY_CODE[] = L"code";
|
||||||
const wchar_t JSON_KEY_ACTIVATION_SHORTCUT[] = L"ToggleShortcut";
|
|
||||||
const wchar_t JSON_KEY_EDITOR_SHORTCUT[] = L"EditorShortcut";
|
const wchar_t JSON_KEY_EDITOR_SHORTCUT[] = L"EditorShortcut";
|
||||||
const wchar_t JSON_KEY_USE_NEW_EDITOR[] = L"useNewEditor";
|
const wchar_t JSON_KEY_USE_NEW_EDITOR[] = L"useNewEditor";
|
||||||
}
|
}
|
||||||
@@ -57,25 +56,21 @@ private:
|
|||||||
//contains the non localized key of the powertoy
|
//contains the non localized key of the powertoy
|
||||||
std::wstring app_key = KeyboardManagerConstants::ModuleName;
|
std::wstring app_key = KeyboardManagerConstants::ModuleName;
|
||||||
|
|
||||||
// Hotkey for toggling the module
|
|
||||||
Hotkey m_hotkey = { .key = 0 };
|
|
||||||
|
|
||||||
// Hotkey for opening the editor
|
// Hotkey for opening the editor
|
||||||
Hotkey m_editorHotkey = { .key = 0 };
|
Hotkey m_editorHotkey = { .key = 0 };
|
||||||
|
|
||||||
// Whether to use the new WinUI3 editor
|
// Whether to use the new WinUI3 editor
|
||||||
bool m_useNewEditor = false;
|
bool m_useNewEditor = false;
|
||||||
|
|
||||||
ULONGLONG m_lastHotkeyToggleTime = 0;
|
ULONGLONG m_lastHotkeyTime = 0;
|
||||||
|
|
||||||
HANDLE m_hProcess = nullptr;
|
HANDLE m_hProcess = nullptr;
|
||||||
HANDLE m_hEditorProcess = nullptr;
|
HANDLE m_hEditorProcess = nullptr;
|
||||||
|
|
||||||
HANDLE m_hTerminateEngineEvent = nullptr;
|
HANDLE m_hTerminateEngineEvent = nullptr;
|
||||||
HANDLE m_open_new_editor_event_handle{ nullptr };
|
HANDLE m_open_new_editor_event_handle{ nullptr };
|
||||||
HANDLE m_toggle_active_event_handle{ nullptr };
|
std::thread m_editor_listener_thread;
|
||||||
std::thread m_toggle_thread;
|
std::atomic<bool> m_editor_listener_running{ false };
|
||||||
std::atomic<bool> m_toggle_thread_running{ false };
|
|
||||||
|
|
||||||
|
|
||||||
void refresh_process_state()
|
void refresh_process_state()
|
||||||
@@ -88,19 +83,6 @@ private:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void toggle_engine()
|
|
||||||
{
|
|
||||||
refresh_process_state();
|
|
||||||
if (m_active)
|
|
||||||
{
|
|
||||||
stop_engine();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
start_engine();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool start_engine()
|
bool start_engine()
|
||||||
{
|
{
|
||||||
refresh_process_state();
|
refresh_process_state();
|
||||||
@@ -176,35 +158,9 @@ private:
|
|||||||
void parse_hotkey(PowerToysSettings::PowerToyValues& settings)
|
void parse_hotkey(PowerToysSettings::PowerToyValues& settings)
|
||||||
{
|
{
|
||||||
auto settingsObject = settings.get_raw_json();
|
auto settingsObject = settings.get_raw_json();
|
||||||
if (settingsObject.GetView().Size())
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
auto jsonHotkeyObject = settingsObject.GetNamedObject(JSON_KEY_PROPERTIES)
|
|
||||||
.GetNamedObject(JSON_KEY_ACTIVATION_SHORTCUT);
|
|
||||||
m_hotkey.win = jsonHotkeyObject.GetNamedBoolean(JSON_KEY_WIN);
|
|
||||||
m_hotkey.alt = jsonHotkeyObject.GetNamedBoolean(JSON_KEY_ALT);
|
|
||||||
m_hotkey.shift = jsonHotkeyObject.GetNamedBoolean(JSON_KEY_SHIFT);
|
|
||||||
m_hotkey.ctrl = jsonHotkeyObject.GetNamedBoolean(JSON_KEY_CTRL);
|
|
||||||
m_hotkey.key = static_cast<unsigned char>(jsonHotkeyObject.GetNamedNumber(JSON_KEY_CODE));
|
|
||||||
}
|
|
||||||
catch (...)
|
|
||||||
{
|
|
||||||
Logger::error("Failed to initialize Keyboard Manager toggle shortcut");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!m_hotkey.key)
|
|
||||||
{
|
|
||||||
// Set default: Win+Shift+K
|
|
||||||
m_hotkey.win = true;
|
|
||||||
m_hotkey.shift = true;
|
|
||||||
m_hotkey.ctrl = false;
|
|
||||||
m_hotkey.alt = false;
|
|
||||||
m_hotkey.key = 'K';
|
|
||||||
}
|
|
||||||
|
|
||||||
// Parse editor shortcut
|
// Parse editor shortcut
|
||||||
|
bool editorShortcutParsed = false;
|
||||||
if (settingsObject.GetView().Size())
|
if (settingsObject.GetView().Size())
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@@ -216,6 +172,7 @@ private:
|
|||||||
m_editorHotkey.shift = jsonEditorHotkeyObject.GetNamedBoolean(JSON_KEY_SHIFT);
|
m_editorHotkey.shift = jsonEditorHotkeyObject.GetNamedBoolean(JSON_KEY_SHIFT);
|
||||||
m_editorHotkey.ctrl = jsonEditorHotkeyObject.GetNamedBoolean(JSON_KEY_CTRL);
|
m_editorHotkey.ctrl = jsonEditorHotkeyObject.GetNamedBoolean(JSON_KEY_CTRL);
|
||||||
m_editorHotkey.key = static_cast<unsigned char>(jsonEditorHotkeyObject.GetNamedNumber(JSON_KEY_CODE));
|
m_editorHotkey.key = static_cast<unsigned char>(jsonEditorHotkeyObject.GetNamedNumber(JSON_KEY_CODE));
|
||||||
|
editorShortcutParsed = true;
|
||||||
}
|
}
|
||||||
catch (...)
|
catch (...)
|
||||||
{
|
{
|
||||||
@@ -223,9 +180,9 @@ private:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!m_editorHotkey.key)
|
if (!editorShortcutParsed && !m_editorHotkey.key)
|
||||||
{
|
{
|
||||||
// Set default: Win+Shift+Q
|
// Set default: Win+Shift+Q (only when no setting exists)
|
||||||
m_editorHotkey.win = true;
|
m_editorHotkey.win = true;
|
||||||
m_editorHotkey.shift = true;
|
m_editorHotkey.shift = true;
|
||||||
m_editorHotkey.ctrl = false;
|
m_editorHotkey.ctrl = false;
|
||||||
@@ -287,7 +244,6 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
m_open_new_editor_event_handle = CreateDefaultEvent(CommonSharedConstants::OPEN_NEW_KEYBOARD_MANAGER_EVENT);
|
m_open_new_editor_event_handle = CreateDefaultEvent(CommonSharedConstants::OPEN_NEW_KEYBOARD_MANAGER_EVENT);
|
||||||
m_toggle_active_event_handle = CreateDefaultEvent(CommonSharedConstants::TOGGLE_KEYBOARD_MANAGER_ACTIVE_EVENT);
|
|
||||||
|
|
||||||
init_settings();
|
init_settings();
|
||||||
};
|
};
|
||||||
@@ -306,11 +262,6 @@ public:
|
|||||||
CloseHandle(m_open_new_editor_event_handle);
|
CloseHandle(m_open_new_editor_event_handle);
|
||||||
m_open_new_editor_event_handle = nullptr;
|
m_open_new_editor_event_handle = nullptr;
|
||||||
}
|
}
|
||||||
if (m_toggle_active_event_handle)
|
|
||||||
{
|
|
||||||
CloseHandle(m_toggle_active_event_handle);
|
|
||||||
m_toggle_active_event_handle = nullptr;
|
|
||||||
}
|
|
||||||
if (m_hEditorProcess)
|
if (m_hEditorProcess)
|
||||||
{
|
{
|
||||||
CloseHandle(m_hEditorProcess);
|
CloseHandle(m_hEditorProcess);
|
||||||
@@ -412,22 +363,12 @@ public:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return the invocation hotkeys for toggling and opening the editor
|
// Return the invocation hotkey for opening the editor
|
||||||
virtual size_t get_hotkeys(Hotkey* hotkeys, size_t buffer_size) override
|
virtual size_t get_hotkeys(Hotkey* hotkeys, size_t buffer_size) override
|
||||||
{
|
{
|
||||||
size_t count = 0;
|
size_t count = 0;
|
||||||
|
|
||||||
// Hotkey 0: toggle engine
|
// Hotkey 0: open editor (only when using new editor)
|
||||||
if (m_hotkey.key)
|
|
||||||
{
|
|
||||||
if (hotkeys && buffer_size > count)
|
|
||||||
{
|
|
||||||
hotkeys[count] = m_hotkey;
|
|
||||||
}
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Hotkey 1: open editor (only when using new editor)
|
|
||||||
if (m_useNewEditor && m_editorHotkey.key)
|
if (m_useNewEditor && m_editorHotkey.key)
|
||||||
{
|
{
|
||||||
if (hotkeys && buffer_size > count)
|
if (hotkeys && buffer_size > count)
|
||||||
@@ -442,69 +383,44 @@ public:
|
|||||||
|
|
||||||
void StartOpenEditorListener()
|
void StartOpenEditorListener()
|
||||||
{
|
{
|
||||||
if (m_toggle_thread_running || (!m_open_new_editor_event_handle && !m_toggle_active_event_handle))
|
if (m_editor_listener_running || !m_open_new_editor_event_handle)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_toggle_thread_running = true;
|
m_editor_listener_running = true;
|
||||||
m_toggle_thread = std::thread([this]() {
|
m_editor_listener_thread = std::thread([this]() {
|
||||||
HANDLE handles[2]{};
|
while (m_editor_listener_running)
|
||||||
DWORD handle_count = 0;
|
|
||||||
DWORD open_editor_index = MAXDWORD;
|
|
||||||
DWORD toggle_active_index = MAXDWORD;
|
|
||||||
|
|
||||||
if (m_open_new_editor_event_handle)
|
|
||||||
{
|
{
|
||||||
open_editor_index = handle_count;
|
const DWORD wait_result = WaitForSingleObject(m_open_new_editor_event_handle, 500);
|
||||||
handles[handle_count++] = m_open_new_editor_event_handle;
|
if (!m_editor_listener_running)
|
||||||
}
|
|
||||||
|
|
||||||
if (m_toggle_active_event_handle)
|
|
||||||
{
|
|
||||||
toggle_active_index = handle_count;
|
|
||||||
handles[handle_count++] = m_toggle_active_event_handle;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (m_toggle_thread_running)
|
|
||||||
{
|
|
||||||
const DWORD wait_result = WaitForMultipleObjects(handle_count, handles, FALSE, 500);
|
|
||||||
if (!m_toggle_thread_running)
|
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (open_editor_index != MAXDWORD && wait_result == (WAIT_OBJECT_0 + open_editor_index))
|
if (wait_result == WAIT_OBJECT_0)
|
||||||
{
|
{
|
||||||
launch_editor();
|
launch_editor();
|
||||||
}
|
}
|
||||||
else if (toggle_active_index != MAXDWORD && wait_result == (WAIT_OBJECT_0 + toggle_active_index))
|
|
||||||
{
|
|
||||||
toggle_engine();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void StopOpenEditorListener()
|
void StopOpenEditorListener()
|
||||||
{
|
{
|
||||||
if (!m_toggle_thread_running)
|
if (!m_editor_listener_running)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_toggle_thread_running = false;
|
m_editor_listener_running = false;
|
||||||
if (m_open_new_editor_event_handle)
|
if (m_open_new_editor_event_handle)
|
||||||
{
|
{
|
||||||
SetEvent(m_open_new_editor_event_handle);
|
SetEvent(m_open_new_editor_event_handle);
|
||||||
}
|
}
|
||||||
if (m_toggle_active_event_handle)
|
if (m_editor_listener_thread.joinable())
|
||||||
{
|
{
|
||||||
SetEvent(m_toggle_active_event_handle);
|
m_editor_listener_thread.join();
|
||||||
}
|
|
||||||
if (m_toggle_thread.joinable())
|
|
||||||
{
|
|
||||||
m_toggle_thread.join();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -584,22 +500,17 @@ public:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr ULONGLONG hotkeyToggleDebounceMs = 500;
|
constexpr ULONGLONG hotkeyDebounceMs = 500;
|
||||||
const auto now = GetTickCount64();
|
const auto now = GetTickCount64();
|
||||||
if (now - m_lastHotkeyToggleTime < hotkeyToggleDebounceMs)
|
if (now - m_lastHotkeyTime < hotkeyDebounceMs)
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
m_lastHotkeyToggleTime = now;
|
m_lastHotkeyTime = now;
|
||||||
|
|
||||||
if (hotkeyId == 0)
|
if (hotkeyId == 0)
|
||||||
{
|
{
|
||||||
// Toggle engine on/off
|
// Open the editor
|
||||||
toggle_engine();
|
|
||||||
}
|
|
||||||
else if (hotkeyId == 1)
|
|
||||||
{
|
|
||||||
// Open the new editor (only in new editor mode)
|
|
||||||
launch_editor();
|
launch_editor();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -21,20 +21,15 @@ namespace Microsoft.PowerToys.Settings.UI.Library
|
|||||||
[CmdConfigureIgnoreAttribute]
|
[CmdConfigureIgnoreAttribute]
|
||||||
public GenericProperty<List<string>> KeyboardConfigurations { get; set; }
|
public GenericProperty<List<string>> KeyboardConfigurations { get; set; }
|
||||||
|
|
||||||
public HotkeySettings DefaultToggleShortcut => new HotkeySettings(true, false, false, true, 0x4B);
|
|
||||||
|
|
||||||
public HotkeySettings DefaultEditorShortcut => new HotkeySettings(true, false, false, true, 0x51);
|
public HotkeySettings DefaultEditorShortcut => new HotkeySettings(true, false, false, true, 0x51);
|
||||||
|
|
||||||
public KeyboardManagerProperties()
|
public KeyboardManagerProperties()
|
||||||
{
|
{
|
||||||
ToggleShortcut = DefaultToggleShortcut;
|
|
||||||
EditorShortcut = DefaultEditorShortcut;
|
EditorShortcut = DefaultEditorShortcut;
|
||||||
KeyboardConfigurations = new GenericProperty<List<string>>(new List<string> { "default", });
|
KeyboardConfigurations = new GenericProperty<List<string>>(new List<string> { "default", });
|
||||||
ActiveConfiguration = new GenericProperty<string>("default");
|
ActiveConfiguration = new GenericProperty<string>("default");
|
||||||
}
|
}
|
||||||
|
|
||||||
public HotkeySettings ToggleShortcut { get; set; }
|
|
||||||
|
|
||||||
public HotkeySettings EditorShortcut { get; set; }
|
public HotkeySettings EditorShortcut { get; set; }
|
||||||
|
|
||||||
[JsonPropertyName("useNewEditor")]
|
[JsonPropertyName("useNewEditor")]
|
||||||
|
|||||||
@@ -38,10 +38,6 @@ namespace Microsoft.PowerToys.Settings.UI.Library
|
|||||||
{
|
{
|
||||||
var hotkeyAccessors = new List<HotkeyAccessor>
|
var hotkeyAccessors = new List<HotkeyAccessor>
|
||||||
{
|
{
|
||||||
new HotkeyAccessor(
|
|
||||||
() => Properties.ToggleShortcut,
|
|
||||||
value => Properties.ToggleShortcut = value ?? Properties.DefaultToggleShortcut,
|
|
||||||
"Toggle_Shortcut"),
|
|
||||||
new HotkeyAccessor(
|
new HotkeyAccessor(
|
||||||
() => Properties.EditorShortcut,
|
() => Properties.EditorShortcut,
|
||||||
value => Properties.EditorShortcut = value ?? Properties.DefaultEditorShortcut,
|
value => Properties.EditorShortcut = value ?? Properties.DefaultEditorShortcut,
|
||||||
|
|||||||
@@ -62,28 +62,12 @@
|
|||||||
<controls:SettingsPageControl.ModuleContent>
|
<controls:SettingsPageControl.ModuleContent>
|
||||||
<StackPanel ChildrenTransitions="{StaticResource SettingsCardsAnimations}" Orientation="Vertical">
|
<StackPanel ChildrenTransitions="{StaticResource SettingsCardsAnimations}" Orientation="Vertical">
|
||||||
<controls:GPOInfoControl ShowWarning="{x:Bind ViewModel.IsEnabledGpoConfigured, Mode=OneWay}">
|
<controls:GPOInfoControl ShowWarning="{x:Bind ViewModel.IsEnabledGpoConfigured, Mode=OneWay}">
|
||||||
<tkcontrols:SettingsExpander
|
<tkcontrols:SettingsCard
|
||||||
Name="KeyboardManagerEnableToggle"
|
Name="KeyboardManagerEnableToggle"
|
||||||
x:Uid="KeyboardManager_EnableToggle"
|
x:Uid="KeyboardManager_EnableToggle"
|
||||||
HeaderIcon="{ui:BitmapIcon Source=/Assets/Settings/Icons/KeyboardManager.png}">
|
HeaderIcon="{ui:BitmapIcon Source=/Assets/Settings/Icons/KeyboardManager.png}">
|
||||||
<ToggleSwitch x:Uid="ToggleSwitch" IsOn="{x:Bind ViewModel.Enabled, Mode=TwoWay}" />
|
<ToggleSwitch x:Uid="ToggleSwitch" IsOn="{x:Bind ViewModel.Enabled, Mode=TwoWay}" />
|
||||||
<tkcontrols:SettingsExpander.Description>
|
</tkcontrols:SettingsCard>
|
||||||
<HyperlinkButton NavigateUri="https://aka.ms/powerToysCannotRemapKeys">
|
|
||||||
<TextBlock x:Uid="KBM_KeysCannotBeRemapped" FontWeight="SemiBold" />
|
|
||||||
</HyperlinkButton>
|
|
||||||
</tkcontrols:SettingsExpander.Description>
|
|
||||||
<tkcontrols:SettingsExpander.Items>
|
|
||||||
<tkcontrols:SettingsCard
|
|
||||||
Name="ToggleShortcut"
|
|
||||||
x:Uid="KeyboardManager_Toggle_Shortcut"
|
|
||||||
IsEnabled="{x:Bind ViewModel.Enabled, Mode=OneWay}">
|
|
||||||
<controls:ShortcutControl
|
|
||||||
MinWidth="{StaticResource SettingActionControlMinWidth}"
|
|
||||||
AllowDisable="True"
|
|
||||||
HotkeySettings="{x:Bind Path=ViewModel.ToggleShortcut, Mode=TwoWay}" />
|
|
||||||
</tkcontrols:SettingsCard>
|
|
||||||
</tkcontrols:SettingsExpander.Items>
|
|
||||||
</tkcontrols:SettingsExpander>
|
|
||||||
</controls:GPOInfoControl>
|
</controls:GPOInfoControl>
|
||||||
|
|
||||||
<tkcontrols:SwitchPresenter TargetType="x:Boolean" Value="{x:Bind ViewModel.UseNewEditor, Mode=OneWay}">
|
<tkcontrols:SwitchPresenter TargetType="x:Boolean" Value="{x:Bind ViewModel.UseNewEditor, Mode=OneWay}">
|
||||||
|
|||||||
@@ -1909,12 +1909,6 @@ Made with 💗 by Microsoft and the PowerToys community.</value>
|
|||||||
</data>
|
</data>
|
||||||
<data name="Activation_Shortcut.Description" xml:space="preserve">
|
<data name="Activation_Shortcut.Description" xml:space="preserve">
|
||||||
<value>Customize the shortcut to activate this module</value>
|
<value>Customize the shortcut to activate this module</value>
|
||||||
</data>
|
|
||||||
<data name="KeyboardManager_Toggle_Shortcut.Header" xml:space="preserve">
|
|
||||||
<value>Shortcut</value>
|
|
||||||
</data>
|
|
||||||
<data name="KeyboardManager_Toggle_Shortcut.Description" xml:space="preserve">
|
|
||||||
<value>Enable or disable this module (Note: the Settings UI will not update)</value>
|
|
||||||
</data>
|
</data>
|
||||||
<data name="KeyboardManager_Editor_Shortcut.Header" xml:space="preserve">
|
<data name="KeyboardManager_Editor_Shortcut.Header" xml:space="preserve">
|
||||||
<value>Editor shortcut</value>
|
<value>Editor shortcut</value>
|
||||||
|
|||||||
@@ -181,34 +181,12 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels
|
|||||||
{
|
{
|
||||||
var hotkeysDict = new Dictionary<string, HotkeySettings[]>
|
var hotkeysDict = new Dictionary<string, HotkeySettings[]>
|
||||||
{
|
{
|
||||||
[ModuleName] = [ToggleShortcut, EditorShortcut],
|
[ModuleName] = [EditorShortcut],
|
||||||
};
|
};
|
||||||
|
|
||||||
return hotkeysDict;
|
return hotkeysDict;
|
||||||
}
|
}
|
||||||
|
|
||||||
public HotkeySettings ToggleShortcut
|
|
||||||
{
|
|
||||||
get => Settings.Properties.ToggleShortcut;
|
|
||||||
set
|
|
||||||
{
|
|
||||||
if (value != Settings.Properties.ToggleShortcut)
|
|
||||||
{
|
|
||||||
Settings.Properties.ToggleShortcut = value == null ? Settings.Properties.DefaultToggleShortcut : value;
|
|
||||||
|
|
||||||
OnPropertyChanged(nameof(ToggleShortcut));
|
|
||||||
NotifySettingsChanged();
|
|
||||||
|
|
||||||
SendConfigMSG(
|
|
||||||
string.Format(
|
|
||||||
CultureInfo.InvariantCulture,
|
|
||||||
"{{ \"powertoys\": {{ \"{0}\": {1} }} }}",
|
|
||||||
KeyboardManagerSettings.ModuleName,
|
|
||||||
JsonSerializer.Serialize(Settings, SourceGenerationContextContext.Default.KeyboardManagerSettings)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool UseNewEditor
|
public bool UseNewEditor
|
||||||
{
|
{
|
||||||
get => Settings.Properties.UseNewEditor;
|
get => Settings.Properties.UseNewEditor;
|
||||||
|
|||||||
Reference in New Issue
Block a user