// Copyright (c) Microsoft Corporation. // Licensed under the MIT license. #include "pch.h" #include "GlobalAppSettings.h" #include "../../types/inc/Utils.hpp" #include "JsonUtils.h" #include "KeyChordSerialization.h" #include "GlobalAppSettings.g.cpp" using namespace Microsoft::Terminal::Settings::Model; using namespace winrt::Microsoft::Terminal::Settings::Model::implementation; using namespace winrt::Windows::UI::Xaml; using namespace ::Microsoft::Console; using namespace winrt::Microsoft::UI::Xaml::Controls; static constexpr std::string_view LegacyKeybindingsKey{ "keybindings" }; static constexpr std::string_view ActionsKey{ "actions" }; static constexpr std::string_view DefaultProfileKey{ "defaultProfile" }; static constexpr std::string_view LegacyUseTabSwitcherModeKey{ "useTabSwitcher" }; // Method Description: // - Copies any extraneous data from the parent before completing a CreateChild call // Arguments: // - // Return Value: // - void GlobalAppSettings::_FinalizeInheritance() { for (const auto& parent : _parents) { _actionMap->InsertParent(parent->_actionMap); _keybindingsWarnings.insert(_keybindingsWarnings.end(), parent->_keybindingsWarnings.begin(), parent->_keybindingsWarnings.end()); for (const auto& [k, v] : parent->_colorSchemes) { if (!_colorSchemes.HasKey(k)) { _colorSchemes.Insert(k, v); } } } } winrt::com_ptr GlobalAppSettings::Copy() const { auto globals{ winrt::make_self() }; globals->_UnparsedDefaultProfile = _UnparsedDefaultProfile; globals->_defaultProfile = _defaultProfile; globals->_actionMap = _actionMap->Copy(); globals->_keybindingsWarnings = _keybindingsWarnings; #define GLOBAL_SETTINGS_COPY(type, name, jsonKey, ...) \ globals->_##name = _##name; MTSM_GLOBAL_SETTINGS(GLOBAL_SETTINGS_COPY) #undef GLOBAL_SETTINGS_COPY if (_colorSchemes) { for (auto kv : _colorSchemes) { const auto schemeImpl{ winrt::get_self(kv.Value()) }; globals->_colorSchemes.Insert(kv.Key(), *schemeImpl->Copy()); } } for (const auto& parent : _parents) { globals->InsertParent(parent->Copy()); } return globals; } winrt::Windows::Foundation::Collections::IMapView GlobalAppSettings::ColorSchemes() noexcept { return _colorSchemes.GetView(); } #pragma region DefaultProfile void GlobalAppSettings::DefaultProfile(const winrt::guid& defaultProfile) noexcept { _defaultProfile = defaultProfile; _UnparsedDefaultProfile = Utils::GuidToString(defaultProfile); } winrt::guid GlobalAppSettings::DefaultProfile() const { return _defaultProfile; } #pragma endregion winrt::Microsoft::Terminal::Settings::Model::ActionMap GlobalAppSettings::ActionMap() const noexcept { return *_actionMap; } // Method Description: // - Create a new instance of this class from a serialized JsonObject. // Arguments: // - json: an object which should be a serialization of a GlobalAppSettings object. // Return Value: // - a new GlobalAppSettings instance created from the values in `json` winrt::com_ptr GlobalAppSettings::FromJson(const Json::Value& json) { auto result = winrt::make_self(); result->LayerJson(json); return result; } void GlobalAppSettings::LayerJson(const Json::Value& json) { JsonUtils::GetValueForKey(json, DefaultProfileKey, _UnparsedDefaultProfile); // GH#8076 - when adding enum values to this key, we also changed it from // "useTabSwitcher" to "tabSwitcherMode". Continue supporting // "useTabSwitcher", but prefer "tabSwitcherMode" JsonUtils::GetValueForKey(json, LegacyUseTabSwitcherModeKey, _TabSwitcherMode); #define GLOBAL_SETTINGS_LAYER_JSON(type, name, jsonKey, ...) \ JsonUtils::GetValueForKey(json, jsonKey, _##name); MTSM_GLOBAL_SETTINGS(GLOBAL_SETTINGS_LAYER_JSON) #undef GLOBAL_SETTINGS_LAYER_JSON static constexpr std::array bindingsKeys{ LegacyKeybindingsKey, ActionsKey }; for (const auto& jsonKey : bindingsKeys) { if (auto bindings{ json[JsonKey(jsonKey)] }) { auto warnings = _actionMap->LayerJson(bindings); // It's possible that the user provided keybindings have some warnings // in them - problems that we should alert the user to, but we can // recover from. Most of these warnings cannot be detected later in the // Validate settings phase, so we'll collect them now. If there were any // warnings generated from parsing these keybindings, add them to our // list of warnings. _keybindingsWarnings.insert(_keybindingsWarnings.end(), warnings.begin(), warnings.end()); } } } // Method Description: // - Adds the given colorscheme to our map of schemes, using its name as the key. // Arguments: // - scheme: the color scheme to add // Return Value: // - void GlobalAppSettings::AddColorScheme(const Model::ColorScheme& scheme) { _colorSchemes.Insert(scheme.Name(), scheme); } void GlobalAppSettings::RemoveColorScheme(hstring schemeName) { _colorSchemes.TryRemove(schemeName); } // Method Description: // - Return the warnings that we've collected during parsing the JSON for the // keybindings. It's possible that the user provided keybindings have some // warnings in them - problems that we should alert the user to, but we can // recover from. // Arguments: // - // Return Value: // - const std::vector& GlobalAppSettings::KeybindingsWarnings() const { return _keybindingsWarnings; } // Method Description: // - Create a new serialized JsonObject from an instance of this class // Arguments: // - // Return Value: // - the JsonObject representing this instance Json::Value GlobalAppSettings::ToJson() const { Json::Value json{ Json::ValueType::objectValue }; JsonUtils::SetValueForKey(json, DefaultProfileKey, _UnparsedDefaultProfile); #define GLOBAL_SETTINGS_TO_JSON(type, name, jsonKey, ...) \ JsonUtils::SetValueForKey(json, jsonKey, _##name); MTSM_GLOBAL_SETTINGS(GLOBAL_SETTINGS_TO_JSON) #undef GLOBAL_SETTINGS_TO_JSON json[JsonKey(ActionsKey)] = _actionMap->ToJson(); return json; }