mirror of
https://github.com/microsoft/PowerToys.git
synced 2025-12-16 03:37:59 +01:00
* Move KBM engine into separate process (#10672) * [KBM] Migrate KBM UI out of the runner (#10709) * Clean up keyboard hook handles (#10817) * [C++ common] Unhandled exception handler (#10821) * [KBM] Use icon in the KeyboardManagerEditor (#10845) * [KBM] Move resources from the Common project to the Editor. (#10844) * KBM Editor tests (#10858) * Rename engine executable (#10868) * clean up (#10870) * [KBM] Changed Editor and libraries output folders (#10871) * [KBM] New logs structure (#10872) * Add unhandled exception handling to the editor (#10874) * [KBM] Trace for edit keyboard window * Logging for XamlBridge message loop * [KBM] Added Editor and Engine to the installer (#10876) * Fix spelling * Interprocess communication logs, remove unnecessary windows message logs * [KBM] Separated telemetry for the engine and editor. (#10889) * [KBM] Editor test project (#10891) * Versions for the engine and the editor (#10897) * Add the editor's and the engine's executables to signing process (#10900) * [KBM editor] Run only one instance, exit when parent process exits (#10890) * [KBM] Force kill editor process to avoid XAML crash (#10907) * [KBM] Force kill editor process to avoid XAML crash * Fix event releasing Co-authored-by: mykhailopylyp <17161067+mykhailopylyp@users.noreply.github.com> * Make the editor dpi aware (#10908) * [KBM] KeyboardManagerCommon refactoring (#10909) * Do not start the process if it is already started (#10910) * logs * Update src/modules/keyboardmanager/KeyboardManagerEditorLibrary/EditKeyboardWindow.cpp * Update src/modules/keyboardmanager/KeyboardManagerEditorLibrary/EditKeyboardWindow.cpp * [KBM] Rename InitUnhandledExceptionHandler to make it explicit that is for x64 only. We will fix it properly when adding support for ARM64 and add a header with the proper conditional building. * [KBM] rename file/class/variables using camel case * [KBM] Rename "event_locker" -> "EventLocker" * [KBM] rename process_waiter Add a TODO comment * [KBM] rename methods Add TODO comment * [KBM] use uppercase for function names * [KBM] use uppercase for methos, lowercase for properties * [KBM] rename method, make methods private, formatting * [KBM] rename private variables * [KBM] use uppercase for function names * [KBM] Added support to run the editor stand-alone when built in debug mode * Update src/modules/keyboardmanager/KeyboardManagerEditor/KeyboardManagerEditor.cpp * Check success of event creation, comment (#10947) * [KBM] code formatting (#10951) * [KBM] code formatting * Update src/modules/keyboardmanager/KeyboardManagerEditorLibrary/BufferValidationHelpers.cpp * [KBM] tracing * [KBM] Remappings not showing fix. (#10954) * removed mutex * retry loop for reading * retry on reading config once * log error Co-authored-by: Enrico Giordani <enricogior@users.noreply.github.com> Co-authored-by: Enrico Giordani <enricogior@users.noreply.github.com> Co-authored-by: Seraphima Zykova <zykovas91@gmail.com> Co-authored-by: Enrico Giordani <enricogior@users.noreply.github.com> Co-authored-by: Enrico Giordani <enrico.giordani@gmail.com>
195 lines
7.0 KiB
C++
195 lines
7.0 KiB
C++
#include "pch.h"
|
|
#include "SettingsHelper.h"
|
|
|
|
#include <common/SettingsAPI/settings_objects.h>
|
|
#include <common/SettingsAPI/settings_helpers.h>
|
|
#include <common/logger/logger.h>
|
|
|
|
#include <common/KeyboardManagerConstants.h>
|
|
|
|
bool LoadSingleKeyRemaps(KeyboardManagerState& keyboardManagerState, const json::JsonObject& jsonData)
|
|
{
|
|
bool result = true;
|
|
|
|
try
|
|
{
|
|
auto remapKeysData = jsonData.GetNamedObject(KeyboardManagerConstants::RemapKeysSettingName);
|
|
keyboardManagerState.ClearSingleKeyRemaps();
|
|
|
|
if (remapKeysData)
|
|
{
|
|
auto inProcessRemapKeys = remapKeysData.GetNamedArray(KeyboardManagerConstants::InProcessRemapKeysSettingName);
|
|
for (const auto& it : inProcessRemapKeys)
|
|
{
|
|
try
|
|
{
|
|
auto originalKey = it.GetObjectW().GetNamedString(KeyboardManagerConstants::OriginalKeysSettingName);
|
|
auto newRemapKey = it.GetObjectW().GetNamedString(KeyboardManagerConstants::NewRemapKeysSettingName);
|
|
|
|
// If remapped to a shortcut
|
|
if (std::wstring(newRemapKey).find(L";") != std::string::npos)
|
|
{
|
|
keyboardManagerState.AddSingleKeyRemap(std::stoul(originalKey.c_str()), Shortcut(newRemapKey.c_str()));
|
|
}
|
|
|
|
// If remapped to a key
|
|
else
|
|
{
|
|
keyboardManagerState.AddSingleKeyRemap(std::stoul(originalKey.c_str()), std::stoul(newRemapKey.c_str()));
|
|
}
|
|
}
|
|
catch (...)
|
|
{
|
|
Logger::error(L"Improper Key Data JSON. Try the next remap.");
|
|
result = false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
catch (...)
|
|
{
|
|
Logger::error(L"Improper JSON format for single key remaps. Skip to next remap type");
|
|
result = false;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
bool LoadAppSpecificShortcutRemaps(KeyboardManagerState& keyboardManagerState, const json::JsonObject& remapShortcutsData)
|
|
{
|
|
bool result = true;
|
|
|
|
try
|
|
{
|
|
auto appSpecificRemapShortcuts = remapShortcutsData.GetNamedArray(KeyboardManagerConstants::AppSpecificRemapShortcutsSettingName);
|
|
for (const auto& it : appSpecificRemapShortcuts)
|
|
{
|
|
try
|
|
{
|
|
auto originalKeys = it.GetObjectW().GetNamedString(KeyboardManagerConstants::OriginalKeysSettingName);
|
|
auto newRemapKeys = it.GetObjectW().GetNamedString(KeyboardManagerConstants::NewRemapKeysSettingName);
|
|
auto targetApp = it.GetObjectW().GetNamedString(KeyboardManagerConstants::TargetAppSettingName);
|
|
|
|
// If remapped to a shortcut
|
|
if (std::wstring(newRemapKeys).find(L";") != std::string::npos)
|
|
{
|
|
keyboardManagerState.AddAppSpecificShortcut(targetApp.c_str(), Shortcut(originalKeys.c_str()), Shortcut(newRemapKeys.c_str()));
|
|
}
|
|
|
|
// If remapped to a key
|
|
else
|
|
{
|
|
keyboardManagerState.AddAppSpecificShortcut(targetApp.c_str(), Shortcut(originalKeys.c_str()), std::stoul(newRemapKeys.c_str()));
|
|
}
|
|
}
|
|
catch (...)
|
|
{
|
|
Logger::error(L"Improper Key Data JSON. Try the next shortcut.");
|
|
result = false;
|
|
}
|
|
}
|
|
}
|
|
catch (...)
|
|
{
|
|
Logger::error(L"Improper JSON format for os level shortcut remaps. Skip to next remap type");
|
|
result = false;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
bool LoadShortcutRemaps(KeyboardManagerState& keyboardManagerState, const json::JsonObject& jsonData)
|
|
{
|
|
bool result = true;
|
|
|
|
try
|
|
{
|
|
auto remapShortcutsData = jsonData.GetNamedObject(KeyboardManagerConstants::RemapShortcutsSettingName);
|
|
keyboardManagerState.ClearOSLevelShortcuts();
|
|
keyboardManagerState.ClearAppSpecificShortcuts();
|
|
if (remapShortcutsData)
|
|
{
|
|
// Load os level shortcut remaps
|
|
try
|
|
{
|
|
auto globalRemapShortcuts = remapShortcutsData.GetNamedArray(KeyboardManagerConstants::GlobalRemapShortcutsSettingName);
|
|
for (const auto& it : globalRemapShortcuts)
|
|
{
|
|
try
|
|
{
|
|
auto originalKeys = it.GetObjectW().GetNamedString(KeyboardManagerConstants::OriginalKeysSettingName);
|
|
auto newRemapKeys = it.GetObjectW().GetNamedString(KeyboardManagerConstants::NewRemapKeysSettingName);
|
|
|
|
// If remapped to a shortcut
|
|
if (std::wstring(newRemapKeys).find(L";") != std::string::npos)
|
|
{
|
|
keyboardManagerState.AddOSLevelShortcut(Shortcut(originalKeys.c_str()), Shortcut(newRemapKeys.c_str()));
|
|
}
|
|
|
|
// If remapped to a key
|
|
else
|
|
{
|
|
keyboardManagerState.AddOSLevelShortcut(Shortcut(originalKeys.c_str()), std::stoul(newRemapKeys.c_str()));
|
|
}
|
|
}
|
|
catch (...)
|
|
{
|
|
Logger::error(L"Improper Key Data JSON. Try the next shortcut.");
|
|
result = false;
|
|
}
|
|
}
|
|
}
|
|
catch (...)
|
|
{
|
|
Logger::error(L"Improper JSON format for os level shortcut remaps. Skip to next remap type");
|
|
result = false;
|
|
}
|
|
|
|
// Load app specific shortcut remaps
|
|
result = result && LoadAppSpecificShortcutRemaps(keyboardManagerState, remapShortcutsData);
|
|
}
|
|
}
|
|
catch (...)
|
|
{
|
|
Logger::error(L"Improper JSON format for shortcut remaps. Skip to next remap type");
|
|
result = false;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
bool SettingsHelper::LoadSettings(KeyboardManagerState& keyboardManagerState)
|
|
{
|
|
Logger::trace(L"SettingsHelper::LoadSettings()");
|
|
try
|
|
{
|
|
PowerToysSettings::PowerToyValues settings = PowerToysSettings::PowerToyValues::load_from_settings_file(KeyboardManagerConstants::ModuleName);
|
|
auto current_config = settings.get_string_value(KeyboardManagerConstants::ActiveConfigurationSettingName);
|
|
|
|
if (!current_config)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
keyboardManagerState.SetCurrentConfigName(*current_config);
|
|
|
|
// Read the config file and load the remaps.
|
|
auto configFile = json::from_file(PTSettingsHelper::get_module_save_folder_location(KeyboardManagerConstants::ModuleName) + L"\\" + *current_config + L".json");
|
|
if (!configFile)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
bool result = LoadSingleKeyRemaps(keyboardManagerState, *configFile);
|
|
result = result && LoadShortcutRemaps(keyboardManagerState, *configFile);
|
|
|
|
return result;
|
|
}
|
|
catch (...)
|
|
{
|
|
Logger::error(L"SettingsHelper::LoadSettings() failed");
|
|
}
|
|
|
|
return false;
|
|
}
|