From 726b4281840984818d928ed47d4fd6910dea4960 Mon Sep 17 00:00:00 2001 From: PankajBhojwani Date: Wed, 3 Nov 2021 08:01:20 -0700 Subject: [PATCH] Use X-macros to simplify new setting creation in SettingsModel (#11416) Introduces X-macros to reduce the number of places we need to write essentially the same line of code but for a different setting (declaring it in the header file, in `Copy`, `LayerJson`, `ToJson`, etc). --- .../AppearanceConfig.cpp | 61 ++---- .../TerminalSettingsModel/AppearanceConfig.h | 19 +- .../TerminalSettingsModel/FontConfig.cpp | 34 ++-- .../TerminalSettingsModel/FontConfig.h | 10 +- .../GlobalAppSettings.cpp | 177 ++---------------- .../TerminalSettingsModel/GlobalAppSettings.h | 45 +---- .../TerminalSettingsModel/MTSMSettings.h | 96 ++++++++++ ...crosoft.Terminal.Settings.ModelLib.vcxproj | 1 + ...Terminal.Settings.ModelLib.vcxproj.filters | 1 + .../TerminalSettingsModel/Profile.cpp | 82 ++------ src/cascadia/TerminalSettingsModel/Profile.h | 42 ++--- 11 files changed, 190 insertions(+), 378 deletions(-) create mode 100644 src/cascadia/TerminalSettingsModel/MTSMSettings.h diff --git a/src/cascadia/TerminalSettingsModel/AppearanceConfig.cpp b/src/cascadia/TerminalSettingsModel/AppearanceConfig.cpp index dcc1677e6..d48763eca 100644 --- a/src/cascadia/TerminalSettingsModel/AppearanceConfig.cpp +++ b/src/cascadia/TerminalSettingsModel/AppearanceConfig.cpp @@ -16,17 +16,6 @@ static constexpr std::string_view ForegroundKey{ "foreground" }; static constexpr std::string_view BackgroundKey{ "background" }; static constexpr std::string_view SelectionBackgroundKey{ "selectionBackground" }; static constexpr std::string_view CursorColorKey{ "cursorColor" }; -static constexpr std::string_view CursorShapeKey{ "cursorShape" }; -static constexpr std::string_view CursorHeightKey{ "cursorHeight" }; -static constexpr std::string_view BackgroundImageKey{ "backgroundImage" }; -static constexpr std::string_view ColorSchemeKey{ "colorScheme" }; -static constexpr std::string_view BackgroundImageOpacityKey{ "backgroundImageOpacity" }; -static constexpr std::string_view BackgroundImageStretchModeKey{ "backgroundImageStretchMode" }; -static constexpr std::string_view BackgroundImageAlignmentKey{ "backgroundImageAlignment" }; -static constexpr std::string_view RetroTerminalEffectKey{ "experimental.retroTerminalEffect" }; -static constexpr std::string_view PixelShaderPathKey{ "experimental.pixelShaderPath" }; -static constexpr std::string_view IntenseTextStyleKey{ "intenseTextStyle" }; -static constexpr std::string_view AdjustIndistinguishableColorsKey{ "adjustIndistinguishableColors" }; static constexpr std::string_view LegacyAcrylicTransparencyKey{ "acrylicOpacity" }; static constexpr std::string_view OpacityKey{ "opacity" }; @@ -38,22 +27,17 @@ AppearanceConfig::AppearanceConfig(winrt::weak_ref sourceProfile) : winrt::com_ptr AppearanceConfig::CopyAppearance(const AppearanceConfig* source, winrt::weak_ref sourceProfile) { auto appearance{ winrt::make_self(std::move(sourceProfile)) }; - appearance->_BackgroundImagePath = source->_BackgroundImagePath; - appearance->_BackgroundImageOpacity = source->_BackgroundImageOpacity; - appearance->_BackgroundImageStretchMode = source->_BackgroundImageStretchMode; - appearance->_ColorSchemeName = source->_ColorSchemeName; appearance->_Foreground = source->_Foreground; appearance->_Background = source->_Background; appearance->_SelectionBackground = source->_SelectionBackground; appearance->_CursorColor = source->_CursorColor; - appearance->_CursorShape = source->_CursorShape; - appearance->_CursorHeight = source->_CursorHeight; - appearance->_BackgroundImageAlignment = source->_BackgroundImageAlignment; - appearance->_RetroTerminalEffect = source->_RetroTerminalEffect; - appearance->_PixelShaderPath = source->_PixelShaderPath; - appearance->_IntenseTextStyle = source->_IntenseTextStyle; appearance->_Opacity = source->_Opacity; - appearance->_AdjustIndistinguishableColors = source->_AdjustIndistinguishableColors; + +#define APPEARANCE_SETTINGS_COPY(type, name, jsonKey, ...) \ + appearance->_##name = source->_##name; + MTSM_APPEARANCE_SETTINGS(APPEARANCE_SETTINGS_COPY) +#undef APPEARANCE_SETTINGS_COPY + return appearance; } @@ -65,19 +49,13 @@ Json::Value AppearanceConfig::ToJson() const JsonUtils::SetValueForKey(json, BackgroundKey, _Background); JsonUtils::SetValueForKey(json, SelectionBackgroundKey, _SelectionBackground); JsonUtils::SetValueForKey(json, CursorColorKey, _CursorColor); - JsonUtils::SetValueForKey(json, ColorSchemeKey, _ColorSchemeName); - JsonUtils::SetValueForKey(json, CursorHeightKey, _CursorHeight); - JsonUtils::SetValueForKey(json, CursorShapeKey, _CursorShape); - JsonUtils::SetValueForKey(json, BackgroundImageKey, _BackgroundImagePath); - JsonUtils::SetValueForKey(json, BackgroundImageOpacityKey, _BackgroundImageOpacity); - JsonUtils::SetValueForKey(json, BackgroundImageStretchModeKey, _BackgroundImageStretchMode); - JsonUtils::SetValueForKey(json, BackgroundImageAlignmentKey, _BackgroundImageAlignment); - JsonUtils::SetValueForKey(json, RetroTerminalEffectKey, _RetroTerminalEffect); - JsonUtils::SetValueForKey(json, PixelShaderPathKey, _PixelShaderPath); - JsonUtils::SetValueForKey(json, IntenseTextStyleKey, _IntenseTextStyle); - JsonUtils::SetValueForKey(json, AdjustIndistinguishableColorsKey, _AdjustIndistinguishableColors); JsonUtils::SetValueForKey(json, OpacityKey, _Opacity, JsonUtils::OptionalConverter{}); +#define APPEARANCE_SETTINGS_TO_JSON(type, name, jsonKey, ...) \ + JsonUtils::SetValueForKey(json, jsonKey, _##name); + MTSM_APPEARANCE_SETTINGS(APPEARANCE_SETTINGS_TO_JSON) +#undef APPEARANCE_SETTINGS_TO_JSON + return json; } @@ -98,19 +76,14 @@ void AppearanceConfig::LayerJson(const Json::Value& json) JsonUtils::GetValueForKey(json, BackgroundKey, _Background); JsonUtils::GetValueForKey(json, SelectionBackgroundKey, _SelectionBackground); JsonUtils::GetValueForKey(json, CursorColorKey, _CursorColor); - JsonUtils::GetValueForKey(json, CursorHeightKey, _CursorHeight); - JsonUtils::GetValueForKey(json, ColorSchemeKey, _ColorSchemeName); - JsonUtils::GetValueForKey(json, CursorShapeKey, _CursorShape); - JsonUtils::GetValueForKey(json, BackgroundImageKey, _BackgroundImagePath); - JsonUtils::GetValueForKey(json, BackgroundImageOpacityKey, _BackgroundImageOpacity); - JsonUtils::GetValueForKey(json, BackgroundImageStretchModeKey, _BackgroundImageStretchMode); - JsonUtils::GetValueForKey(json, BackgroundImageAlignmentKey, _BackgroundImageAlignment); - JsonUtils::GetValueForKey(json, RetroTerminalEffectKey, _RetroTerminalEffect); - JsonUtils::GetValueForKey(json, PixelShaderPathKey, _PixelShaderPath); - JsonUtils::GetValueForKey(json, IntenseTextStyleKey, _IntenseTextStyle); - JsonUtils::GetValueForKey(json, AdjustIndistinguishableColorsKey, _AdjustIndistinguishableColors); + JsonUtils::GetValueForKey(json, LegacyAcrylicTransparencyKey, _Opacity); JsonUtils::GetValueForKey(json, OpacityKey, _Opacity, JsonUtils::OptionalConverter{}); + +#define APPEARANCE_SETTINGS_LAYER_JSON(type, name, jsonKey, ...) \ + JsonUtils::GetValueForKey(json, jsonKey, _##name); + MTSM_APPEARANCE_SETTINGS(APPEARANCE_SETTINGS_LAYER_JSON) +#undef APPEARANCE_SETTINGS_LAYER_JSON } winrt::Microsoft::Terminal::Settings::Model::Profile AppearanceConfig::SourceProfile() diff --git a/src/cascadia/TerminalSettingsModel/AppearanceConfig.h b/src/cascadia/TerminalSettingsModel/AppearanceConfig.h index 6cf9a5f2d..bbc30927e 100644 --- a/src/cascadia/TerminalSettingsModel/AppearanceConfig.h +++ b/src/cascadia/TerminalSettingsModel/AppearanceConfig.h @@ -19,6 +19,7 @@ Author(s): #include "AppearanceConfig.g.h" #include "JsonUtils.h" #include "IInheritable.h" +#include "MTSMSettings.h" #include namespace winrt::Microsoft::Terminal::Settings::Model::implementation @@ -35,26 +36,16 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation winrt::hstring ExpandedBackgroundImagePath(); - INHERITABLE_SETTING(Model::IAppearanceConfig, ConvergedAlignment, BackgroundImageAlignment, ConvergedAlignment::Horizontal_Center | ConvergedAlignment::Vertical_Center); - - INHERITABLE_SETTING(Model::IAppearanceConfig, uint32_t, CursorHeight, DEFAULT_CURSOR_HEIGHT); - INHERITABLE_SETTING(Model::IAppearanceConfig, hstring, ColorSchemeName, L"Campbell"); INHERITABLE_NULLABLE_SETTING(Model::IAppearanceConfig, Microsoft::Terminal::Core::Color, Foreground, nullptr); INHERITABLE_NULLABLE_SETTING(Model::IAppearanceConfig, Microsoft::Terminal::Core::Color, Background, nullptr); INHERITABLE_NULLABLE_SETTING(Model::IAppearanceConfig, Microsoft::Terminal::Core::Color, SelectionBackground, nullptr); INHERITABLE_NULLABLE_SETTING(Model::IAppearanceConfig, Microsoft::Terminal::Core::Color, CursorColor, nullptr); - INHERITABLE_SETTING(Model::IAppearanceConfig, Microsoft::Terminal::Core::CursorStyle, CursorShape, Microsoft::Terminal::Core::CursorStyle::Bar); - INHERITABLE_SETTING(Model::IAppearanceConfig, hstring, BackgroundImagePath); - - INHERITABLE_SETTING(Model::IAppearanceConfig, double, BackgroundImageOpacity, 1.0); - INHERITABLE_SETTING(Model::IAppearanceConfig, Windows::UI::Xaml::Media::Stretch, BackgroundImageStretchMode, Windows::UI::Xaml::Media::Stretch::UniformToFill); - - INHERITABLE_SETTING(Model::IAppearanceConfig, bool, RetroTerminalEffect, false); - INHERITABLE_SETTING(Model::IAppearanceConfig, hstring, PixelShaderPath, L""); - INHERITABLE_SETTING(Model::IAppearanceConfig, Model::IntenseStyle, IntenseTextStyle, Model::IntenseStyle::Bright); INHERITABLE_SETTING(Model::IAppearanceConfig, double, Opacity, 1.0); - INHERITABLE_SETTING(Model::IAppearanceConfig, bool, AdjustIndistinguishableColors, true); +#define APPEARANCE_SETTINGS_INITIALIZE(type, name, jsonKey, ...) \ + INHERITABLE_SETTING(Model::IAppearanceConfig, type, name, ##__VA_ARGS__) + MTSM_APPEARANCE_SETTINGS(APPEARANCE_SETTINGS_INITIALIZE) +#undef APPEARANCE_SETTINGS_INITIALIZE private: winrt::weak_ref _sourceProfile; diff --git a/src/cascadia/TerminalSettingsModel/FontConfig.cpp b/src/cascadia/TerminalSettingsModel/FontConfig.cpp index 5d57eb355..62ebc5aac 100644 --- a/src/cascadia/TerminalSettingsModel/FontConfig.cpp +++ b/src/cascadia/TerminalSettingsModel/FontConfig.cpp @@ -12,11 +12,6 @@ using namespace Microsoft::Terminal::Settings::Model; using namespace winrt::Microsoft::Terminal::Settings::Model::implementation; static constexpr std::string_view FontInfoKey{ "font" }; -static constexpr std::string_view FontFaceKey{ "face" }; -static constexpr std::string_view FontSizeKey{ "size" }; -static constexpr std::string_view FontWeightKey{ "weight" }; -static constexpr std::string_view FontFeaturesKey{ "features" }; -static constexpr std::string_view FontAxesKey{ "axes" }; static constexpr std::string_view LegacyFontFaceKey{ "fontFace" }; static constexpr std::string_view LegacyFontSizeKey{ "fontSize" }; static constexpr std::string_view LegacyFontWeightKey{ "fontWeight" }; @@ -29,11 +24,12 @@ winrt::Microsoft::Terminal::Settings::Model::implementation::FontConfig::FontCon winrt::com_ptr FontConfig::CopyFontInfo(const FontConfig* source, winrt::weak_ref sourceProfile) { auto fontInfo{ winrt::make_self(std::move(sourceProfile)) }; - fontInfo->_FontFace = source->_FontFace; - fontInfo->_FontSize = source->_FontSize; - fontInfo->_FontWeight = source->_FontWeight; - fontInfo->_FontAxes = source->_FontAxes; - fontInfo->_FontFeatures = source->_FontFeatures; + +#define FONT_SETTINGS_COPY(type, name, jsonKey, ...) \ + fontInfo->_##name = source->_##name; + MTSM_FONT_SETTINGS(FONT_SETTINGS_COPY) +#undef FONT_SETTINGS_COPY + return fontInfo; } @@ -41,11 +37,10 @@ Json::Value FontConfig::ToJson() const { Json::Value json{ Json::ValueType::objectValue }; - JsonUtils::SetValueForKey(json, FontFaceKey, _FontFace); - JsonUtils::SetValueForKey(json, FontSizeKey, _FontSize); - JsonUtils::SetValueForKey(json, FontWeightKey, _FontWeight); - JsonUtils::SetValueForKey(json, FontAxesKey, _FontAxes); - JsonUtils::SetValueForKey(json, FontFeaturesKey, _FontFeatures); +#define FONT_SETTINGS_TO_JSON(type, name, jsonKey, ...) \ + JsonUtils::SetValueForKey(json, jsonKey, _##name); + MTSM_FONT_SETTINGS(FONT_SETTINGS_TO_JSON) +#undef FONT_SETTINGS_TO_JSON return json; } @@ -69,11 +64,10 @@ void FontConfig::LayerJson(const Json::Value& json) { // A font object is defined, use that const auto fontInfoJson = json[JsonKey(FontInfoKey)]; - JsonUtils::GetValueForKey(fontInfoJson, FontFaceKey, _FontFace); - JsonUtils::GetValueForKey(fontInfoJson, FontSizeKey, _FontSize); - JsonUtils::GetValueForKey(fontInfoJson, FontWeightKey, _FontWeight); - JsonUtils::GetValueForKey(fontInfoJson, FontFeaturesKey, _FontFeatures); - JsonUtils::GetValueForKey(fontInfoJson, FontAxesKey, _FontAxes); +#define FONT_SETTINGS_LAYER_JSON(type, name, jsonKey, ...) \ + JsonUtils::GetValueForKey(fontInfoJson, jsonKey, _##name); + MTSM_FONT_SETTINGS(FONT_SETTINGS_LAYER_JSON) +#undef FONT_SETTINGS_LAYER_JSON } else { diff --git a/src/cascadia/TerminalSettingsModel/FontConfig.h b/src/cascadia/TerminalSettingsModel/FontConfig.h index 6c53ed4ea..db69fd08f 100644 --- a/src/cascadia/TerminalSettingsModel/FontConfig.h +++ b/src/cascadia/TerminalSettingsModel/FontConfig.h @@ -19,6 +19,7 @@ Author(s): #include "pch.h" #include "FontConfig.g.h" #include "JsonUtils.h" +#include "MTSMSettings.h" #include "../inc/cppwinrt_utils.h" #include "IInheritable.h" #include @@ -39,11 +40,10 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation Model::Profile SourceProfile(); - INHERITABLE_SETTING(Model::FontConfig, hstring, FontFace, DEFAULT_FONT_FACE); - INHERITABLE_SETTING(Model::FontConfig, int32_t, FontSize, DEFAULT_FONT_SIZE); - INHERITABLE_SETTING(Model::FontConfig, Windows::UI::Text::FontWeight, FontWeight, DEFAULT_FONT_WEIGHT); - INHERITABLE_SETTING(Model::FontConfig, IFontAxesMap, FontAxes); - INHERITABLE_SETTING(Model::FontConfig, IFontFeatureMap, FontFeatures); +#define FONT_SETTINGS_INITIALIZE(type, name, jsonKey, ...) \ + INHERITABLE_SETTING(Model::FontConfig, type, name, ##__VA_ARGS__) + MTSM_FONT_SETTINGS(FONT_SETTINGS_INITIALIZE) +#undef FONT_SETTINGS_INITIALIZE private: winrt::weak_ref _sourceProfile; diff --git a/src/cascadia/TerminalSettingsModel/GlobalAppSettings.cpp b/src/cascadia/TerminalSettingsModel/GlobalAppSettings.cpp index 2680cb857..0ffe584fc 100644 --- a/src/cascadia/TerminalSettingsModel/GlobalAppSettings.cpp +++ b/src/cascadia/TerminalSettingsModel/GlobalAppSettings.cpp @@ -18,48 +18,7 @@ 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 AlwaysShowTabsKey{ "alwaysShowTabs" }; -static constexpr std::string_view InitialRowsKey{ "initialRows" }; -static constexpr std::string_view InitialColsKey{ "initialCols" }; -static constexpr std::string_view InitialPositionKey{ "initialPosition" }; -static constexpr std::string_view CenterOnLaunchKey{ "centerOnLaunch" }; -static constexpr std::string_view ShowTitleInTitlebarKey{ "showTerminalTitleInTitlebar" }; -static constexpr std::string_view LanguageKey{ "language" }; -static constexpr std::string_view ThemeKey{ "theme" }; -static constexpr std::string_view TabWidthModeKey{ "tabWidthMode" }; -static constexpr std::string_view UseAcrylicInTabRowKey{ "useAcrylicInTabRow" }; -static constexpr std::string_view ShowTabsInTitlebarKey{ "showTabsInTitlebar" }; -static constexpr std::string_view WordDelimitersKey{ "wordDelimiters" }; -static constexpr std::string_view InputServiceWarningKey{ "inputServiceWarning" }; -static constexpr std::string_view CopyOnSelectKey{ "copyOnSelect" }; -static constexpr std::string_view CopyFormattingKey{ "copyFormatting" }; -static constexpr std::string_view WarnAboutLargePasteKey{ "largePasteWarning" }; -static constexpr std::string_view WarnAboutMultiLinePasteKey{ "multiLinePasteWarning" }; -static constexpr std::string_view TrimPasteKey{ "trimPaste" }; -static constexpr std::string_view LaunchModeKey{ "launchMode" }; -static constexpr std::string_view ConfirmCloseAllKey{ "confirmCloseAllTabs" }; -static constexpr std::string_view SnapToGridOnResizeKey{ "snapToGridOnResize" }; -static constexpr std::string_view EnableStartupTaskKey{ "startOnUserLogin" }; -static constexpr std::string_view FirstWindowPreferenceKey{ "firstWindowPreference" }; -static constexpr std::string_view AlwaysOnTopKey{ "alwaysOnTop" }; static constexpr std::string_view LegacyUseTabSwitcherModeKey{ "useTabSwitcher" }; -static constexpr std::string_view TabSwitcherModeKey{ "tabSwitcherMode" }; -static constexpr std::string_view DisableAnimationsKey{ "disableAnimations" }; -static constexpr std::string_view StartupActionsKey{ "startupActions" }; -static constexpr std::string_view FocusFollowMouseKey{ "focusFollowMouse" }; -static constexpr std::string_view WindowingBehaviorKey{ "windowingBehavior" }; -static constexpr std::string_view TrimBlockSelectionKey{ "trimBlockSelection" }; -static constexpr std::string_view AlwaysShowNotificationIconKey{ "alwaysShowNotificationIcon" }; -static constexpr std::string_view MinimizeToNotificationAreaKey{ "minimizeToNotificationArea" }; -static constexpr std::string_view DisabledProfileSourcesKey{ "disabledProfileSources" }; -static constexpr std::string_view ShowAdminShieldKey{ "showAdminShield" }; - -static constexpr std::string_view DebugFeaturesKey{ "debugFeatures" }; - -static constexpr std::string_view ForceFullRepaintRenderingKey{ "experimental.rendering.forceFullRepaint" }; -static constexpr std::string_view SoftwareRenderingKey{ "experimental.rendering.software" }; -static constexpr std::string_view ForceVTInputKey{ "experimental.input.forceVT" }; -static constexpr std::string_view DetectURLsKey{ "experimental.detectURLs" }; // Method Description: // - Copies any extraneous data from the parent before completing a CreateChild call @@ -86,45 +45,6 @@ void GlobalAppSettings::_FinalizeInheritance() winrt::com_ptr GlobalAppSettings::Copy() const { auto globals{ winrt::make_self() }; - globals->_InitialRows = _InitialRows; - globals->_InitialCols = _InitialCols; - globals->_AlwaysShowTabs = _AlwaysShowTabs; - globals->_ShowTitleInTitlebar = _ShowTitleInTitlebar; - globals->_ConfirmCloseAllTabs = _ConfirmCloseAllTabs; - globals->_Language = _Language; - globals->_Theme = _Theme; - globals->_TabWidthMode = _TabWidthMode; - globals->_UseAcrylicInTabRow = _UseAcrylicInTabRow; - globals->_ShowTabsInTitlebar = _ShowTabsInTitlebar; - globals->_WordDelimiters = _WordDelimiters; - globals->_InputServiceWarning = _InputServiceWarning; - globals->_CopyOnSelect = _CopyOnSelect; - globals->_CopyFormatting = _CopyFormatting; - globals->_WarnAboutLargePaste = _WarnAboutLargePaste; - globals->_WarnAboutMultiLinePaste = _WarnAboutMultiLinePaste; - globals->_TrimPaste = _TrimPaste; - globals->_InitialPosition = _InitialPosition; - globals->_CenterOnLaunch = _CenterOnLaunch; - globals->_LaunchMode = _LaunchMode; - globals->_SnapToGridOnResize = _SnapToGridOnResize; - globals->_ForceFullRepaintRendering = _ForceFullRepaintRendering; - globals->_SoftwareRendering = _SoftwareRendering; - globals->_ForceVTInput = _ForceVTInput; - globals->_DebugFeaturesEnabled = _DebugFeaturesEnabled; - globals->_StartOnUserLogin = _StartOnUserLogin; - globals->_FirstWindowPreference = _FirstWindowPreference; - globals->_AlwaysOnTop = _AlwaysOnTop; - globals->_TabSwitcherMode = _TabSwitcherMode; - globals->_DisableAnimations = _DisableAnimations; - globals->_StartupActions = _StartupActions; - globals->_FocusFollowMouse = _FocusFollowMouse; - globals->_WindowingBehavior = _WindowingBehavior; - globals->_TrimBlockSelection = _TrimBlockSelection; - globals->_DetectURLs = _DetectURLs; - globals->_MinimizeToNotificationArea = _MinimizeToNotificationArea; - globals->_AlwaysShowNotificationIcon = _AlwaysShowNotificationIcon; - globals->_DisabledProfileSources = _DisabledProfileSources; - globals->_ShowAdminShield = _ShowAdminShield; globals->_UnparsedDefaultProfile = _UnparsedDefaultProfile; @@ -132,6 +52,11 @@ winrt::com_ptr GlobalAppSettings::Copy() const 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) @@ -189,51 +114,15 @@ winrt::com_ptr GlobalAppSettings::FromJson(const Json::Value& void GlobalAppSettings::LayerJson(const Json::Value& json) { JsonUtils::GetValueForKey(json, DefaultProfileKey, _UnparsedDefaultProfile); - JsonUtils::GetValueForKey(json, AlwaysShowTabsKey, _AlwaysShowTabs); - JsonUtils::GetValueForKey(json, ConfirmCloseAllKey, _ConfirmCloseAllTabs); - JsonUtils::GetValueForKey(json, InitialRowsKey, _InitialRows); - JsonUtils::GetValueForKey(json, InitialColsKey, _InitialCols); - JsonUtils::GetValueForKey(json, InitialPositionKey, _InitialPosition); - JsonUtils::GetValueForKey(json, CenterOnLaunchKey, _CenterOnLaunch); - JsonUtils::GetValueForKey(json, ShowTitleInTitlebarKey, _ShowTitleInTitlebar); - JsonUtils::GetValueForKey(json, ShowTabsInTitlebarKey, _ShowTabsInTitlebar); - JsonUtils::GetValueForKey(json, WordDelimitersKey, _WordDelimiters); - JsonUtils::GetValueForKey(json, CopyOnSelectKey, _CopyOnSelect); - JsonUtils::GetValueForKey(json, InputServiceWarningKey, _InputServiceWarning); - JsonUtils::GetValueForKey(json, CopyFormattingKey, _CopyFormatting); - JsonUtils::GetValueForKey(json, WarnAboutLargePasteKey, _WarnAboutLargePaste); - JsonUtils::GetValueForKey(json, WarnAboutMultiLinePasteKey, _WarnAboutMultiLinePaste); - JsonUtils::GetValueForKey(json, TrimPasteKey, _TrimPaste); - JsonUtils::GetValueForKey(json, FirstWindowPreferenceKey, _FirstWindowPreference); - JsonUtils::GetValueForKey(json, LaunchModeKey, _LaunchMode); - JsonUtils::GetValueForKey(json, LanguageKey, _Language); - JsonUtils::GetValueForKey(json, ThemeKey, _Theme); - JsonUtils::GetValueForKey(json, TabWidthModeKey, _TabWidthMode); - JsonUtils::GetValueForKey(json, UseAcrylicInTabRowKey, _UseAcrylicInTabRow); - JsonUtils::GetValueForKey(json, SnapToGridOnResizeKey, _SnapToGridOnResize); - // GetValueForKey will only override the current value if the key exists - JsonUtils::GetValueForKey(json, DebugFeaturesKey, _DebugFeaturesEnabled); - JsonUtils::GetValueForKey(json, ForceFullRepaintRenderingKey, _ForceFullRepaintRendering); - JsonUtils::GetValueForKey(json, SoftwareRenderingKey, _SoftwareRendering); - JsonUtils::GetValueForKey(json, ForceVTInputKey, _ForceVTInput); - JsonUtils::GetValueForKey(json, EnableStartupTaskKey, _StartOnUserLogin); - JsonUtils::GetValueForKey(json, AlwaysOnTopKey, _AlwaysOnTop); // 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); - JsonUtils::GetValueForKey(json, TabSwitcherModeKey, _TabSwitcherMode); - JsonUtils::GetValueForKey(json, DisableAnimationsKey, _DisableAnimations); - JsonUtils::GetValueForKey(json, StartupActionsKey, _StartupActions); - JsonUtils::GetValueForKey(json, FocusFollowMouseKey, _FocusFollowMouse); - JsonUtils::GetValueForKey(json, WindowingBehaviorKey, _WindowingBehavior); - JsonUtils::GetValueForKey(json, TrimBlockSelectionKey, _TrimBlockSelection); - JsonUtils::GetValueForKey(json, DetectURLsKey, _DetectURLs); - JsonUtils::GetValueForKey(json, MinimizeToNotificationAreaKey, _MinimizeToNotificationArea); - JsonUtils::GetValueForKey(json, AlwaysShowNotificationIconKey, _AlwaysShowNotificationIcon); - JsonUtils::GetValueForKey(json, DisabledProfileSourcesKey, _DisabledProfileSources); - JsonUtils::GetValueForKey(json, ShowAdminShieldKey, _ShowAdminShield); +#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) @@ -293,48 +182,12 @@ Json::Value GlobalAppSettings::ToJson() const { Json::Value json{ Json::ValueType::objectValue }; - // clang-format off - JsonUtils::SetValueForKey(json, DefaultProfileKey, _UnparsedDefaultProfile); - JsonUtils::SetValueForKey(json, AlwaysShowTabsKey, _AlwaysShowTabs); - JsonUtils::SetValueForKey(json, ConfirmCloseAllKey, _ConfirmCloseAllTabs); - JsonUtils::SetValueForKey(json, InitialRowsKey, _InitialRows); - JsonUtils::SetValueForKey(json, InitialColsKey, _InitialCols); - JsonUtils::SetValueForKey(json, InitialPositionKey, _InitialPosition); - JsonUtils::SetValueForKey(json, CenterOnLaunchKey, _CenterOnLaunch); - JsonUtils::SetValueForKey(json, ShowTitleInTitlebarKey, _ShowTitleInTitlebar); - JsonUtils::SetValueForKey(json, ShowTabsInTitlebarKey, _ShowTabsInTitlebar); - JsonUtils::SetValueForKey(json, WordDelimitersKey, _WordDelimiters); - JsonUtils::SetValueForKey(json, InputServiceWarningKey, _InputServiceWarning); - JsonUtils::SetValueForKey(json, CopyOnSelectKey, _CopyOnSelect); - JsonUtils::SetValueForKey(json, CopyFormattingKey, _CopyFormatting); - JsonUtils::SetValueForKey(json, WarnAboutLargePasteKey, _WarnAboutLargePaste); - JsonUtils::SetValueForKey(json, WarnAboutMultiLinePasteKey, _WarnAboutMultiLinePaste); - JsonUtils::SetValueForKey(json, TrimPasteKey, _TrimPaste); - JsonUtils::SetValueForKey(json, FirstWindowPreferenceKey, _FirstWindowPreference); - JsonUtils::SetValueForKey(json, LaunchModeKey, _LaunchMode); - JsonUtils::SetValueForKey(json, LanguageKey, _Language); - JsonUtils::SetValueForKey(json, ThemeKey, _Theme); - JsonUtils::SetValueForKey(json, TabWidthModeKey, _TabWidthMode); - JsonUtils::SetValueForKey(json, UseAcrylicInTabRowKey, _UseAcrylicInTabRow); - JsonUtils::SetValueForKey(json, SnapToGridOnResizeKey, _SnapToGridOnResize); - JsonUtils::SetValueForKey(json, DebugFeaturesKey, _DebugFeaturesEnabled); - JsonUtils::SetValueForKey(json, ForceFullRepaintRenderingKey, _ForceFullRepaintRendering); - JsonUtils::SetValueForKey(json, SoftwareRenderingKey, _SoftwareRendering); - JsonUtils::SetValueForKey(json, ForceVTInputKey, _ForceVTInput); - JsonUtils::SetValueForKey(json, EnableStartupTaskKey, _StartOnUserLogin); - JsonUtils::SetValueForKey(json, AlwaysOnTopKey, _AlwaysOnTop); - JsonUtils::SetValueForKey(json, TabSwitcherModeKey, _TabSwitcherMode); - JsonUtils::SetValueForKey(json, DisableAnimationsKey, _DisableAnimations); - JsonUtils::SetValueForKey(json, StartupActionsKey, _StartupActions); - JsonUtils::SetValueForKey(json, FocusFollowMouseKey, _FocusFollowMouse); - JsonUtils::SetValueForKey(json, WindowingBehaviorKey, _WindowingBehavior); - JsonUtils::SetValueForKey(json, TrimBlockSelectionKey, _TrimBlockSelection); - JsonUtils::SetValueForKey(json, DetectURLsKey, _DetectURLs); - JsonUtils::SetValueForKey(json, MinimizeToNotificationAreaKey, _MinimizeToNotificationArea); - JsonUtils::SetValueForKey(json, AlwaysShowNotificationIconKey, _AlwaysShowNotificationIcon); - JsonUtils::SetValueForKey(json, DisabledProfileSourcesKey, _DisabledProfileSources); - JsonUtils::SetValueForKey(json, ShowAdminShieldKey, _ShowAdminShield); - // clang-format on + 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; diff --git a/src/cascadia/TerminalSettingsModel/GlobalAppSettings.h b/src/cascadia/TerminalSettingsModel/GlobalAppSettings.h index 022700264..14584b26a 100644 --- a/src/cascadia/TerminalSettingsModel/GlobalAppSettings.h +++ b/src/cascadia/TerminalSettingsModel/GlobalAppSettings.h @@ -17,6 +17,7 @@ Author(s): #include "GlobalAppSettings.g.h" #include "IInheritable.h" +#include "MTSMSettings.h" #include "ActionMap.h" #include "Command.h" @@ -61,46 +62,12 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation DisableAnimations(!invertedDisableAnimationsValue); } - INHERITABLE_SETTING(Model::GlobalAppSettings, int32_t, InitialRows, DEFAULT_ROWS); - INHERITABLE_SETTING(Model::GlobalAppSettings, int32_t, InitialCols, DEFAULT_COLS); - INHERITABLE_SETTING(Model::GlobalAppSettings, bool, AlwaysShowTabs, true); - INHERITABLE_SETTING(Model::GlobalAppSettings, bool, ShowTitleInTitlebar, true); - INHERITABLE_SETTING(Model::GlobalAppSettings, bool, ConfirmCloseAllTabs, true); - INHERITABLE_SETTING(Model::GlobalAppSettings, hstring, Language); - INHERITABLE_SETTING(Model::GlobalAppSettings, winrt::Windows::UI::Xaml::ElementTheme, Theme, winrt::Windows::UI::Xaml::ElementTheme::Default); - INHERITABLE_SETTING(Model::GlobalAppSettings, winrt::Microsoft::UI::Xaml::Controls::TabViewWidthMode, TabWidthMode, winrt::Microsoft::UI::Xaml::Controls::TabViewWidthMode::Equal); - INHERITABLE_SETTING(Model::GlobalAppSettings, bool, UseAcrylicInTabRow, false); - INHERITABLE_SETTING(Model::GlobalAppSettings, bool, ShowTabsInTitlebar, true); - INHERITABLE_SETTING(Model::GlobalAppSettings, hstring, WordDelimiters, DEFAULT_WORD_DELIMITERS); - INHERITABLE_SETTING(Model::GlobalAppSettings, bool, CopyOnSelect, false); - INHERITABLE_SETTING(Model::GlobalAppSettings, bool, InputServiceWarning, true); - INHERITABLE_SETTING(Model::GlobalAppSettings, winrt::Microsoft::Terminal::Control::CopyFormat, CopyFormatting, 0); - INHERITABLE_SETTING(Model::GlobalAppSettings, bool, WarnAboutLargePaste, true); - INHERITABLE_SETTING(Model::GlobalAppSettings, bool, WarnAboutMultiLinePaste, true); - INHERITABLE_SETTING(Model::GlobalAppSettings, bool, TrimPaste, true); - INHERITABLE_SETTING(Model::GlobalAppSettings, Model::LaunchPosition, InitialPosition, nullptr, nullptr); - INHERITABLE_SETTING(Model::GlobalAppSettings, bool, CenterOnLaunch, false); - INHERITABLE_SETTING(Model::GlobalAppSettings, Model::FirstWindowPreference, FirstWindowPreference, FirstWindowPreference::DefaultProfile); - INHERITABLE_SETTING(Model::GlobalAppSettings, Model::LaunchMode, LaunchMode, LaunchMode::DefaultMode); - INHERITABLE_SETTING(Model::GlobalAppSettings, bool, SnapToGridOnResize, true); - INHERITABLE_SETTING(Model::GlobalAppSettings, bool, ForceFullRepaintRendering, false); - INHERITABLE_SETTING(Model::GlobalAppSettings, bool, SoftwareRendering, false); - INHERITABLE_SETTING(Model::GlobalAppSettings, bool, ForceVTInput, false); - INHERITABLE_SETTING(Model::GlobalAppSettings, bool, DebugFeaturesEnabled, debugFeaturesDefault); - INHERITABLE_SETTING(Model::GlobalAppSettings, bool, StartOnUserLogin, false); - INHERITABLE_SETTING(Model::GlobalAppSettings, bool, AlwaysOnTop, false); - INHERITABLE_SETTING(Model::GlobalAppSettings, Model::TabSwitcherMode, TabSwitcherMode, Model::TabSwitcherMode::InOrder); - INHERITABLE_SETTING(Model::GlobalAppSettings, bool, DisableAnimations, false); - INHERITABLE_SETTING(Model::GlobalAppSettings, hstring, StartupActions, L""); - INHERITABLE_SETTING(Model::GlobalAppSettings, bool, FocusFollowMouse, false); - INHERITABLE_SETTING(Model::GlobalAppSettings, Model::WindowingMode, WindowingBehavior, Model::WindowingMode::UseNew); - INHERITABLE_SETTING(Model::GlobalAppSettings, bool, TrimBlockSelection, false); - INHERITABLE_SETTING(Model::GlobalAppSettings, bool, DetectURLs, true); - INHERITABLE_SETTING(Model::GlobalAppSettings, bool, MinimizeToNotificationArea, false); - INHERITABLE_SETTING(Model::GlobalAppSettings, bool, AlwaysShowNotificationIcon, false); - INHERITABLE_SETTING(Model::GlobalAppSettings, winrt::Windows::Foundation::Collections::IVector, DisabledProfileSources, nullptr); INHERITABLE_SETTING(Model::GlobalAppSettings, hstring, UnparsedDefaultProfile, L""); - INHERITABLE_SETTING(Model::GlobalAppSettings, bool, ShowAdminShield, true); + +#define GLOBAL_SETTINGS_INITIALIZE(type, name, jsonKey, ...) \ + INHERITABLE_SETTING(Model::GlobalAppSettings, type, name, ##__VA_ARGS__) + MTSM_GLOBAL_SETTINGS(GLOBAL_SETTINGS_INITIALIZE) +#undef GLOBAL_SETTINGS_INITIALIZE private: #ifdef NDEBUG diff --git a/src/cascadia/TerminalSettingsModel/MTSMSettings.h b/src/cascadia/TerminalSettingsModel/MTSMSettings.h new file mode 100644 index 000000000..6719818e7 --- /dev/null +++ b/src/cascadia/TerminalSettingsModel/MTSMSettings.h @@ -0,0 +1,96 @@ +/*++ +Copyright (c) Microsoft Corporation +Licensed under the MIT license. + +Module Name: +- MTSMSettings.h + +Abstract: +- Contains most of the settings within Terminal Settings Model (global, profile, font, appearance) +- To add a new setting to any one of those classes, simply add it to the respective list below, following the macro format + +Author(s): +- Pankaj Bhojwani - October 2021 + +--*/ +#pragma once + +// Macro format (defaultArgs are optional): +// (type, name, jsonKey, defaultArgs) + +#define MTSM_GLOBAL_SETTINGS(X) \ + X(int32_t, InitialRows, "initialRows", 30) \ + X(int32_t, InitialCols, "initialCols", 80) \ + X(hstring, WordDelimiters, "wordDelimiters", DEFAULT_WORD_DELIMITERS) \ + X(bool, CopyOnSelect, "copyOnSelect", false) \ + X(bool, FocusFollowMouse, "focusFollowMouse", false) \ + X(bool, ForceFullRepaintRendering, "experimental.rendering.forceFullRepaint", false) \ + X(bool, SoftwareRendering, "experimental.rendering.software", false) \ + X(bool, ForceVTInput, "experimental.input.forceVT", false) \ + X(bool, TrimBlockSelection, "trimBlockSelection", false) \ + X(bool, DetectURLs, "experimental.detectURLs", true) \ + X(bool, AlwaysShowTabs, "alwaysShowTabs", true) \ + X(bool, ShowTitleInTitlebar, "showTerminalTitleInTitlebar", true) \ + X(bool, ConfirmCloseAllTabs, "confirmCloseAllTabs", true) \ + X(hstring, Language, "language") \ + X(winrt::Windows::UI::Xaml::ElementTheme, Theme, "theme", winrt::Windows::UI::Xaml::ElementTheme::Default) \ + X(winrt::Microsoft::UI::Xaml::Controls::TabViewWidthMode, TabWidthMode, "tabWidthMode", winrt::Microsoft::UI::Xaml::Controls::TabViewWidthMode::Equal) \ + X(bool, UseAcrylicInTabRow, "useAcrylicInTabRow", false) \ + X(bool, ShowTabsInTitlebar, "showTabsInTitlebar", true) \ + X(bool, InputServiceWarning, "inputServiceWarning", true) \ + X(winrt::Microsoft::Terminal::Control::CopyFormat, CopyFormatting, "copyFormatting", 0) \ + X(bool, WarnAboutLargePaste, "largePasteWarning", true) \ + X(bool, WarnAboutMultiLinePaste, "multiLinePasteWarning", true) \ + X(Model::LaunchPosition, InitialPosition, "initialPosition", nullptr, nullptr) \ + X(bool, CenterOnLaunch, "centerOnLaunch", false) \ + X(Model::FirstWindowPreference, FirstWindowPreference, "firstWindowPreference", FirstWindowPreference::DefaultProfile) \ + X(Model::LaunchMode, LaunchMode, "launchMode", LaunchMode::DefaultMode) \ + X(bool, SnapToGridOnResize, "snapToGridOnResize", true) \ + X(bool, DebugFeaturesEnabled, "debugFeatures", debugFeaturesDefault) \ + X(bool, StartOnUserLogin, "startOnUserLogin", false) \ + X(bool, AlwaysOnTop, "alwaysOnTop", false) \ + X(Model::TabSwitcherMode, TabSwitcherMode, "tabSwitcherMode", Model::TabSwitcherMode::InOrder) \ + X(bool, DisableAnimations, "disableAnimations", false) \ + X(hstring, StartupActions, "startupActions", L"") \ + X(Model::WindowingMode, WindowingBehavior, "windowingBehavior", Model::WindowingMode::UseNew) \ + X(bool, MinimizeToNotificationArea, "minimizeToNotificationArea", false) \ + X(bool, AlwaysShowNotificationIcon, "alwaysShowNotificationIcon", false) \ + X(winrt::Windows::Foundation::Collections::IVector, DisabledProfileSources, "disabledProfileSources", nullptr) \ + X(bool, ShowAdminShield, "showAdminShield", true) \ + X(bool, TrimPaste, "trimPaste", true) + +#define MTSM_PROFILE_SETTINGS(X) \ + X(int32_t, HistorySize, "historySize", DEFAULT_HISTORY_SIZE) \ + X(bool, SnapOnInput, "snapOnInput", true) \ + X(bool, AltGrAliasing, "altGrAliasing", true) \ + X(bool, UseAcrylic, "useAcrylic", false) \ + X(hstring, Commandline, "commandline", L"%SystemRoot%\\System32\\cmd.exe") \ + X(Microsoft::Terminal::Control::ScrollbarState, ScrollState, "scrollbarState", Microsoft::Terminal::Control::ScrollbarState::Visible) \ + X(Microsoft::Terminal::Control::TextAntialiasingMode, AntialiasingMode, "antialiasingMode", Microsoft::Terminal::Control::TextAntialiasingMode::Grayscale) \ + X(hstring, StartingDirectory, "startingDirectory") \ + X(bool, SuppressApplicationTitle, "suppressApplicationTitle", false) \ + X(guid, ConnectionType, "connectionType") \ + X(hstring, Icon, "icon", L"\uE756") \ + X(CloseOnExitMode, CloseOnExit, "closeOnExit", CloseOnExitMode::Graceful) \ + X(hstring, TabTitle, "tabTitle") \ + X(Model::BellStyle, BellStyle, "bellStyle", BellStyle::Audible) + +#define MTSM_FONT_SETTINGS(X) \ + X(hstring, FontFace, "face", DEFAULT_FONT_FACE) \ + X(int32_t, FontSize, "size", DEFAULT_FONT_SIZE) \ + X(winrt::Windows::UI::Text::FontWeight, FontWeight, "weight", DEFAULT_FONT_WEIGHT) \ + X(IFontAxesMap, FontAxes, "axes") \ + X(IFontFeatureMap, FontFeatures, "features") + +#define MTSM_APPEARANCE_SETTINGS(X) \ + X(Core::CursorStyle, CursorShape, "cursorShape", Core::CursorStyle::Bar) \ + X(uint32_t, CursorHeight, "cursorHeight", DEFAULT_CURSOR_HEIGHT) \ + X(double, BackgroundImageOpacity, "backgroundImageOpacity", 1.0) \ + X(winrt::Windows::UI::Xaml::Media::Stretch, BackgroundImageStretchMode, "backgroundImageStretchMode", winrt::Windows::UI::Xaml::Media::Stretch::UniformToFill) \ + X(bool, RetroTerminalEffect, "experimental.retroTerminalEffect", false) \ + X(hstring, PixelShaderPath, "experimental.pixelShaderPath") \ + X(ConvergedAlignment, BackgroundImageAlignment, "backgroundImageAlignment", ConvergedAlignment::Horizontal_Center | ConvergedAlignment::Vertical_Center) \ + X(hstring, ColorSchemeName, "colorScheme", L"Campbell") \ + X(hstring, BackgroundImagePath, "backgroundImage") \ + X(Model::IntenseStyle, IntenseTextStyle, "intenseTextStyle", Model::IntenseStyle::Bright) \ + X(bool, AdjustIndistinguishableColors, "adjustIndistinguishableColors", true) diff --git a/src/cascadia/TerminalSettingsModel/Microsoft.Terminal.Settings.ModelLib.vcxproj b/src/cascadia/TerminalSettingsModel/Microsoft.Terminal.Settings.ModelLib.vcxproj index 60de4fd1c..5afc82375 100644 --- a/src/cascadia/TerminalSettingsModel/Microsoft.Terminal.Settings.ModelLib.vcxproj +++ b/src/cascadia/TerminalSettingsModel/Microsoft.Terminal.Settings.ModelLib.vcxproj @@ -50,6 +50,7 @@ GlobalAppSettings.idl + diff --git a/src/cascadia/TerminalSettingsModel/Microsoft.Terminal.Settings.ModelLib.vcxproj.filters b/src/cascadia/TerminalSettingsModel/Microsoft.Terminal.Settings.ModelLib.vcxproj.filters index a99f5e654..287892c4a 100644 --- a/src/cascadia/TerminalSettingsModel/Microsoft.Terminal.Settings.ModelLib.vcxproj.filters +++ b/src/cascadia/TerminalSettingsModel/Microsoft.Terminal.Settings.ModelLib.vcxproj.filters @@ -76,6 +76,7 @@ json + diff --git a/src/cascadia/TerminalSettingsModel/Profile.cpp b/src/cascadia/TerminalSettingsModel/Profile.cpp index 287ce8970..c7b104e9a 100644 --- a/src/cascadia/TerminalSettingsModel/Profile.cpp +++ b/src/cascadia/TerminalSettingsModel/Profile.cpp @@ -26,24 +26,9 @@ static constexpr std::string_view GuidKey{ "guid" }; static constexpr std::string_view SourceKey{ "source" }; static constexpr std::string_view HiddenKey{ "hidden" }; -static constexpr std::string_view TabTitleKey{ "tabTitle" }; -static constexpr std::string_view SuppressApplicationTitleKey{ "suppressApplicationTitle" }; -static constexpr std::string_view HistorySizeKey{ "historySize" }; -static constexpr std::string_view SnapOnInputKey{ "snapOnInput" }; -static constexpr std::string_view AltGrAliasingKey{ "altGrAliasing" }; - -static constexpr std::string_view ConnectionTypeKey{ "connectionType" }; -static constexpr std::string_view CommandlineKey{ "commandline" }; static constexpr std::string_view FontInfoKey{ "font" }; -static constexpr std::string_view UseAcrylicKey{ "useAcrylic" }; -static constexpr std::string_view ScrollbarStateKey{ "scrollbarState" }; -static constexpr std::string_view CloseOnExitKey{ "closeOnExit" }; static constexpr std::string_view PaddingKey{ "padding" }; -static constexpr std::string_view StartingDirectoryKey{ "startingDirectory" }; -static constexpr std::string_view IconKey{ "icon" }; -static constexpr std::string_view AntialiasingModeKey{ "antialiasingMode" }; static constexpr std::string_view TabColorKey{ "tabColor" }; -static constexpr std::string_view BellStyleKey{ "bellStyle" }; static constexpr std::string_view UnfocusedAppearanceKey{ "unfocusedAppearance" }; Profile::Profile(guid guid) noexcept : @@ -117,28 +102,19 @@ winrt::com_ptr Profile::CopySettings() const profile->_Name = _Name; profile->_Source = _Source; profile->_Hidden = _Hidden; - profile->_Icon = _Icon; - profile->_CloseOnExit = _CloseOnExit; - profile->_TabTitle = _TabTitle; profile->_TabColor = _TabColor; - profile->_SuppressApplicationTitle = _SuppressApplicationTitle; - profile->_UseAcrylic = _UseAcrylic; - profile->_ScrollState = _ScrollState; profile->_Padding = _Padding; - profile->_Commandline = _Commandline; - profile->_StartingDirectory = _StartingDirectory; - profile->_AntialiasingMode = _AntialiasingMode; profile->_ForceFullRepaintRendering = _ForceFullRepaintRendering; profile->_SoftwareRendering = _SoftwareRendering; - profile->_HistorySize = _HistorySize; - profile->_SnapOnInput = _SnapOnInput; - profile->_AltGrAliasing = _AltGrAliasing; - profile->_BellStyle = _BellStyle; - profile->_ConnectionType = _ConnectionType; profile->_Origin = _Origin; profile->_FontInfo = *fontInfo; profile->_DefaultAppearance = *defaultAppearance; +#define PROFILE_SETTINGS_COPY(type, name, jsonKey, ...) \ + profile->_##name = _##name; + MTSM_PROFILE_SETTINGS(PROFILE_SETTINGS_COPY) +#undef PROFILE_SETTINGS_COPY + if (_UnfocusedAppearance) { Model::AppearanceConfig unfocused{ nullptr }; @@ -196,31 +172,16 @@ void Profile::LayerJson(const Json::Value& json) JsonUtils::GetValueForKey(json, HiddenKey, _Hidden); JsonUtils::GetValueForKey(json, SourceKey, _Source); - // TODO:MSFT:20642297 - Use a sentinel value (-1) for "Infinite scrollback" - JsonUtils::GetValueForKey(json, HistorySizeKey, _HistorySize); - JsonUtils::GetValueForKey(json, SnapOnInputKey, _SnapOnInput); - JsonUtils::GetValueForKey(json, AltGrAliasingKey, _AltGrAliasing); - JsonUtils::GetValueForKey(json, TabTitleKey, _TabTitle); - - // Control Settings - JsonUtils::GetValueForKey(json, ConnectionTypeKey, _ConnectionType); - JsonUtils::GetValueForKey(json, CommandlineKey, _Commandline); - JsonUtils::GetValueForKey(json, UseAcrylicKey, _UseAcrylic); - JsonUtils::GetValueForKey(json, SuppressApplicationTitleKey, _SuppressApplicationTitle); - JsonUtils::GetValueForKey(json, CloseOnExitKey, _CloseOnExit); - // Padding was never specified as an integer, but it was a common working mistake. // Allow it to be permissive. JsonUtils::GetValueForKey(json, PaddingKey, _Padding, JsonUtils::OptionalConverter>{}); - JsonUtils::GetValueForKey(json, ScrollbarStateKey, _ScrollState); - - JsonUtils::GetValueForKey(json, StartingDirectoryKey, _StartingDirectory); - - JsonUtils::GetValueForKey(json, IconKey, _Icon); - JsonUtils::GetValueForKey(json, AntialiasingModeKey, _AntialiasingMode); JsonUtils::GetValueForKey(json, TabColorKey, _TabColor); - JsonUtils::GetValueForKey(json, BellStyleKey, _BellStyle); + +#define PROFILE_SETTINGS_LAYER_JSON(type, name, jsonKey, ...) \ + JsonUtils::GetValueForKey(json, jsonKey, _##name); + MTSM_PROFILE_SETTINGS(PROFILE_SETTINGS_LAYER_JSON) +#undef PROFILE_SETTINGS_LAYER_JSON if (json.isMember(JsonKey(UnfocusedAppearanceKey))) { @@ -352,28 +313,15 @@ Json::Value Profile::ToJson() const JsonUtils::SetValueForKey(json, HiddenKey, writeBasicSettings ? Hidden() : _Hidden); JsonUtils::SetValueForKey(json, SourceKey, writeBasicSettings ? Source() : _Source); - // TODO:MSFT:20642297 - Use a sentinel value (-1) for "Infinite scrollback" - JsonUtils::SetValueForKey(json, HistorySizeKey, _HistorySize); - JsonUtils::SetValueForKey(json, SnapOnInputKey, _SnapOnInput); - JsonUtils::SetValueForKey(json, AltGrAliasingKey, _AltGrAliasing); - JsonUtils::SetValueForKey(json, TabTitleKey, _TabTitle); - - // Control Settings - JsonUtils::SetValueForKey(json, ConnectionTypeKey, _ConnectionType); - JsonUtils::SetValueForKey(json, CommandlineKey, _Commandline); - JsonUtils::SetValueForKey(json, UseAcrylicKey, _UseAcrylic); - JsonUtils::SetValueForKey(json, SuppressApplicationTitleKey, _SuppressApplicationTitle); - JsonUtils::SetValueForKey(json, CloseOnExitKey, _CloseOnExit); - // PermissiveStringConverter is unnecessary for serialization JsonUtils::SetValueForKey(json, PaddingKey, _Padding); - JsonUtils::SetValueForKey(json, ScrollbarStateKey, _ScrollState); - JsonUtils::SetValueForKey(json, StartingDirectoryKey, _StartingDirectory); - JsonUtils::SetValueForKey(json, IconKey, _Icon); - JsonUtils::SetValueForKey(json, AntialiasingModeKey, _AntialiasingMode); JsonUtils::SetValueForKey(json, TabColorKey, _TabColor); - JsonUtils::SetValueForKey(json, BellStyleKey, _BellStyle); + +#define PROFILE_SETTINGS_TO_JSON(type, name, jsonKey, ...) \ + JsonUtils::SetValueForKey(json, jsonKey, _##name); + MTSM_PROFILE_SETTINGS(PROFILE_SETTINGS_TO_JSON) +#undef PROFILE_SETTINGS_TO_JSON // Font settings const auto fontInfoImpl = winrt::get_self(_FontInfo); diff --git a/src/cascadia/TerminalSettingsModel/Profile.h b/src/cascadia/TerminalSettingsModel/Profile.h index f69471332..b828165a2 100644 --- a/src/cascadia/TerminalSettingsModel/Profile.h +++ b/src/cascadia/TerminalSettingsModel/Profile.h @@ -46,6 +46,7 @@ Author(s): #include "Profile.g.h" #include "IInheritable.h" +#include "MTSMSettings.h" #include "../inc/cppwinrt_utils.h" #include "JsonUtils.h" @@ -102,43 +103,30 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation void _FinalizeInheritance() override; + // Special fields WINRT_PROPERTY(bool, Deleted, false); WINRT_PROPERTY(OriginTag, Origin, OriginTag::None); - WINRT_PROPERTY(guid, Updates); - INHERITABLE_SETTING(Model::Profile, guid, Guid, _GenerateGuidForProfile(Name(), Source())); - INHERITABLE_SETTING(Model::Profile, hstring, Name, L"Default"); - INHERITABLE_SETTING(Model::Profile, hstring, Source); - INHERITABLE_SETTING(Model::Profile, bool, Hidden, false); - INHERITABLE_SETTING(Model::Profile, guid, ConnectionType); - // Default Icon: Segoe MDL2 CommandPrompt icon - INHERITABLE_SETTING(Model::Profile, hstring, Icon, L"\uE756"); - - INHERITABLE_SETTING(Model::Profile, CloseOnExitMode, CloseOnExit, CloseOnExitMode::Graceful); - INHERITABLE_SETTING(Model::Profile, hstring, TabTitle); + // Nullable/optional settings INHERITABLE_NULLABLE_SETTING(Model::Profile, Microsoft::Terminal::Core::Color, TabColor, nullptr); - INHERITABLE_SETTING(Model::Profile, bool, SuppressApplicationTitle, false); + INHERITABLE_SETTING(Model::Profile, Model::IAppearanceConfig, UnfocusedAppearance, nullptr); - INHERITABLE_SETTING(Model::Profile, bool, UseAcrylic, false); - INHERITABLE_SETTING(Model::Profile, Microsoft::Terminal::Control::ScrollbarState, ScrollState, Microsoft::Terminal::Control::ScrollbarState::Visible); - - INHERITABLE_SETTING(Model::Profile, hstring, Padding, DEFAULT_PADDING); - - INHERITABLE_SETTING(Model::Profile, hstring, Commandline, L"%SystemRoot%\\System32\\cmd.exe"); - INHERITABLE_SETTING(Model::Profile, hstring, StartingDirectory); - - INHERITABLE_SETTING(Model::Profile, Microsoft::Terminal::Control::TextAntialiasingMode, AntialiasingMode, Microsoft::Terminal::Control::TextAntialiasingMode::Grayscale); + // Global settings INHERITABLE_SETTING(Model::Profile, bool, ForceFullRepaintRendering, false); INHERITABLE_SETTING(Model::Profile, bool, SoftwareRendering, false); - INHERITABLE_SETTING(Model::Profile, int32_t, HistorySize, DEFAULT_HISTORY_SIZE); - INHERITABLE_SETTING(Model::Profile, bool, SnapOnInput, true); - INHERITABLE_SETTING(Model::Profile, bool, AltGrAliasing, true); + // Settings that cannot be put in the macro because of how they are handled in ToJson/LayerJson + INHERITABLE_SETTING(Model::Profile, hstring, Name, L"Default"); + INHERITABLE_SETTING(Model::Profile, hstring, Source); + INHERITABLE_SETTING(Model::Profile, bool, Hidden, false); + INHERITABLE_SETTING(Model::Profile, guid, Guid, _GenerateGuidForProfile(Name(), Source())); + INHERITABLE_SETTING(Model::Profile, hstring, Padding, DEFAULT_PADDING); - INHERITABLE_SETTING(Model::Profile, Model::BellStyle, BellStyle, BellStyle::Audible); - - INHERITABLE_SETTING(Model::Profile, Model::IAppearanceConfig, UnfocusedAppearance, nullptr); +#define PROFILE_SETTINGS_INITIALIZE(type, name, jsonKey, ...) \ + INHERITABLE_SETTING(Model::Profile, type, name, ##__VA_ARGS__) + MTSM_PROFILE_SETTINGS(PROFILE_SETTINGS_INITIALIZE) +#undef PROFILE_SETTINGS_INITIALIZE private: Model::IAppearanceConfig _DefaultAppearance{ winrt::make(weak_ref(*this)) };