From 76df7227ef4afbd225f8a025e5eb04c87645847e Mon Sep 17 00:00:00 2001 From: Mike Griese Date: Tue, 21 Jul 2020 12:24:29 -0500 Subject: [PATCH 1/5] Add support for changing the active color scheme with an action --- doc/cascadia/profiles.schema.json | 19 +++++++++++ src/cascadia/TerminalApp/ActionAndArgs.cpp | 5 +++ src/cascadia/TerminalApp/ActionArgs.cpp | 14 ++++++++ src/cascadia/TerminalApp/ActionArgs.h | 33 +++++++++++++++++++ src/cascadia/TerminalApp/ActionArgs.idl | 5 +++ .../TerminalApp/AppActionHandlers.cpp | 23 +++++++++++++ src/cascadia/TerminalApp/CascadiaSettings.cpp | 20 +++++++++++ src/cascadia/TerminalApp/CascadiaSettings.h | 2 ++ src/cascadia/TerminalApp/ColorScheme.cpp | 2 +- src/cascadia/TerminalApp/ColorScheme.h | 2 +- src/cascadia/TerminalApp/Profile.cpp | 3 +- .../Resources/en-US/Resources.resw | 4 +++ .../TerminalApp/ShortcutActionDispatch.cpp | 5 +++ .../TerminalApp/ShortcutActionDispatch.h | 1 + .../TerminalApp/ShortcutActionDispatch.idl | 2 ++ src/cascadia/TerminalApp/TerminalPage.cpp | 1 + src/cascadia/TerminalApp/TerminalPage.h | 1 + src/cascadia/TerminalControl/TermControl.cpp | 5 +++ src/cascadia/TerminalControl/TermControl.h | 1 + src/cascadia/TerminalControl/TermControl.idl | 1 + 20 files changed, 146 insertions(+), 3 deletions(-) diff --git a/doc/cascadia/profiles.schema.json b/doc/cascadia/profiles.schema.json index 0ca40b685bd..f9b5339f665 100644 --- a/doc/cascadia/profiles.schema.json +++ b/doc/cascadia/profiles.schema.json @@ -59,6 +59,7 @@ "toggleAlwaysOnTop", "toggleRetroEffect", "find", + "setColorScheme", "setTabColor", "openTabColorPicker", "renameTab", @@ -281,6 +282,23 @@ } ] }, + "SetColorSchemeAction": { + "description": "Arguments corresponding to a Set Color Scheme Action", + "allOf": [ + { "$ref": "#/definitions/ShortcutAction" }, + { + "properties": { + "action": { "type": "string", "pattern": "setColorScheme" }, + "name": { + "type": "string", + "default": "", + "description": "the name of the scheme to apply to the active pane" + } + } + } + ], + "required": [ "name" ] + }, "WtAction": { "description": "Arguments corresponding to a wt Action", "allOf": [ @@ -314,6 +332,7 @@ { "$ref": "#/definitions/SplitPaneAction" }, { "$ref": "#/definitions/OpenSettingsAction" }, { "$ref": "#/definitions/SetTabColorAction" }, + { "$ref": "#/definitions/SetColorSchemeAction" }, { "$ref": "#/definitions/WtAction" }, { "type": "null" } ] diff --git a/src/cascadia/TerminalApp/ActionAndArgs.cpp b/src/cascadia/TerminalApp/ActionAndArgs.cpp index f28bfcca8a6..6c6e397aa36 100644 --- a/src/cascadia/TerminalApp/ActionAndArgs.cpp +++ b/src/cascadia/TerminalApp/ActionAndArgs.cpp @@ -35,6 +35,7 @@ static constexpr std::string_view ToggleRetroEffectKey{ "toggleRetroEffect" }; static constexpr std::string_view ToggleFocusModeKey{ "toggleFocusMode" }; static constexpr std::string_view ToggleFullscreenKey{ "toggleFullscreen" }; static constexpr std::string_view ToggleAlwaysOnTopKey{ "toggleAlwaysOnTop" }; +static constexpr std::string_view SetColorSchemeKey{ "setColorScheme" }; static constexpr std::string_view SetTabColorKey{ "setTabColor" }; static constexpr std::string_view OpenTabColorPickerKey{ "openTabColorPicker" }; static constexpr std::string_view RenameTabKey{ "renameTab" }; @@ -85,6 +86,7 @@ namespace winrt::TerminalApp::implementation { ToggleFullscreenKey, ShortcutAction::ToggleFullscreen }, { ToggleAlwaysOnTopKey, ShortcutAction::ToggleAlwaysOnTop }, { SplitPaneKey, ShortcutAction::SplitPane }, + { SetColorSchemeKey, ShortcutAction::SetColorScheme }, { SetTabColorKey, ShortcutAction::SetTabColor }, { OpenTabColorPickerKey, ShortcutAction::OpenTabColorPicker }, { UnboundKey, ShortcutAction::Invalid }, @@ -119,6 +121,8 @@ namespace winrt::TerminalApp::implementation { ShortcutAction::OpenSettings, winrt::TerminalApp::implementation::OpenSettingsArgs::FromJson }, + { ShortcutAction::SetColorScheme, winrt::TerminalApp::implementation::SetColorSchemeArgs::FromJson }, + { ShortcutAction::SetTabColor, winrt::TerminalApp::implementation::SetTabColorArgs::FromJson }, { ShortcutAction::RenameTab, winrt::TerminalApp::implementation::RenameTabArgs::FromJson }, @@ -269,6 +273,7 @@ namespace winrt::TerminalApp::implementation { ShortcutAction::SplitPane, RS_(L"SplitPaneCommandKey") }, { ShortcutAction::Invalid, L"" }, { ShortcutAction::Find, RS_(L"FindCommandKey") }, + { ShortcutAction::SetColorScheme, L"" }, { ShortcutAction::SetTabColor, RS_(L"ResetTabColorCommandKey") }, { ShortcutAction::OpenTabColorPicker, RS_(L"OpenTabColorPickerCommandKey") }, { ShortcutAction::RenameTab, RS_(L"ResetTabNameCommandKey") }, diff --git a/src/cascadia/TerminalApp/ActionArgs.cpp b/src/cascadia/TerminalApp/ActionArgs.cpp index a5a83203afa..63c51ca6428 100644 --- a/src/cascadia/TerminalApp/ActionArgs.cpp +++ b/src/cascadia/TerminalApp/ActionArgs.cpp @@ -15,6 +15,7 @@ #include "AdjustFontSizeArgs.g.cpp" #include "SplitPaneArgs.g.cpp" #include "OpenSettingsArgs.g.cpp" +#include "SetColorSchemeArgs.g.cpp" #include "SetTabColorArgs.g.cpp" #include "RenameTabArgs.g.cpp" #include "ExecuteCommandlineArgs.g.cpp" @@ -229,6 +230,19 @@ namespace winrt::TerminalApp::implementation } } + winrt::hstring SetColorSchemeArgs::GenerateName() const + { + // "Set color scheme to "{_SchemeName}"" + if (!_SchemeName.empty()) + { + return winrt::hstring{ + fmt::format(std::wstring_view(RS_(L"SetColorSchemeCommandKey")), + _SchemeName.c_str()) + }; + } + return L""; + } + winrt::hstring SetTabColorArgs::GenerateName() const { // "Set tab color to #RRGGBB" diff --git a/src/cascadia/TerminalApp/ActionArgs.h b/src/cascadia/TerminalApp/ActionArgs.h index 091774230d1..e2c10c257f8 100644 --- a/src/cascadia/TerminalApp/ActionArgs.h +++ b/src/cascadia/TerminalApp/ActionArgs.h @@ -15,6 +15,7 @@ #include "AdjustFontSizeArgs.g.h" #include "SplitPaneArgs.g.h" #include "OpenSettingsArgs.g.h" +#include "SetColorSchemeArgs.g.h" #include "SetTabColorArgs.g.h" #include "RenameTabArgs.g.h" #include "ExecuteCommandlineArgs.g.h" @@ -330,6 +331,38 @@ namespace winrt::TerminalApp::implementation } }; + struct SetColorSchemeArgs : public SetColorSchemeArgsT + { + SetColorSchemeArgs() = default; + GETSET_PROPERTY(winrt::hstring, SchemeName, L""); + + static constexpr std::string_view NameKey{ "name" }; + + public: + hstring GenerateName() const; + + bool Equals(const IActionArgs& other) + { + auto otherAsUs = other.try_as(); + if (otherAsUs) + { + return otherAsUs->_SchemeName == _SchemeName; + } + return false; + }; + static FromJsonResult FromJson(const Json::Value& json) + { + // LOAD BEARING: Not using make_self here _will_ break you in the future! + auto args = winrt::make_self(); + JsonUtils::GetValueForKey(json, NameKey, args->_SchemeName); + if (args->_SchemeName.empty()) + { + return { nullptr, { ::TerminalApp::SettingsLoadWarnings::MissingRequiredParameter } }; + } + return { *args, {} }; + } + }; + struct SetTabColorArgs : public SetTabColorArgsT { SetTabColorArgs() = default; diff --git a/src/cascadia/TerminalApp/ActionArgs.idl b/src/cascadia/TerminalApp/ActionArgs.idl index 84e5588bf2d..97563c0b489 100644 --- a/src/cascadia/TerminalApp/ActionArgs.idl +++ b/src/cascadia/TerminalApp/ActionArgs.idl @@ -106,6 +106,11 @@ namespace TerminalApp SettingsTarget Target { get; }; }; + [default_interface] runtimeclass SetColorSchemeArgs : IActionArgs + { + String SchemeName { get; }; + }; + [default_interface] runtimeclass SetTabColorArgs : IActionArgs { Windows.Foundation.IReference TabColor { get; }; diff --git a/src/cascadia/TerminalApp/AppActionHandlers.cpp b/src/cascadia/TerminalApp/AppActionHandlers.cpp index 63a2743d80b..7022264a620 100644 --- a/src/cascadia/TerminalApp/AppActionHandlers.cpp +++ b/src/cascadia/TerminalApp/AppActionHandlers.cpp @@ -272,6 +272,29 @@ namespace winrt::TerminalApp::implementation args.Handled(true); } + void TerminalPage::_HandleSetColorScheme(const IInspectable& /*sender*/, + const TerminalApp::ActionEventArgs& args) + { + if (const auto& realArgs = args.ActionArgs().try_as()) + { + if (auto activeTab = _GetFocusedTab()) + { + if (auto activeControl = activeTab->GetActiveTerminalControl()) + { + // Theoretically, if the properties in an IControlSettings + // were all observable, then the termcontrol could just + // listen for their changes, and update in real time. But + // _meh_ + auto controlSettings = activeControl.Settings(); + _settings->ApplyColorScheme(controlSettings, realArgs.SchemeName()); + activeControl.UpdateSettings(controlSettings); + } + } + } + + args.Handled(true); + } + void TerminalPage::_HandleSetTabColor(const IInspectable& /*sender*/, const TerminalApp::ActionEventArgs& args) { diff --git a/src/cascadia/TerminalApp/CascadiaSettings.cpp b/src/cascadia/TerminalApp/CascadiaSettings.cpp index 96e947e952d..ae1ec3f5f31 100644 --- a/src/cascadia/TerminalApp/CascadiaSettings.cpp +++ b/src/cascadia/TerminalApp/CascadiaSettings.cpp @@ -745,3 +745,23 @@ const ColorScheme* CascadiaSettings::GetColorSchemeForProfile(const GUID profile return nullptr; } } + +// Method Description: +// - Apply the color scheme (provided by name) to the given IControlSettings. +// The settings are modified in-place. +// - If the name doesn't correspond to any of our schemes, this does nothing. +// Arguments: +// - settings: the IControlSettings object to modify +// - name: the name of the scheme to apply +// Return Value: +// - +void CascadiaSettings::ApplyColorScheme(winrt::Microsoft::Terminal::Settings::IControlSettings& settings, std::wstring_view schemeName) +{ + std::wstring name{ schemeName }; + auto schemeAndName = _globals.GetColorSchemes().find(name); + if (schemeAndName != _globals.GetColorSchemes().end()) + { + const auto& scheme = schemeAndName->second; + scheme.ApplyScheme(settings); + } +} diff --git a/src/cascadia/TerminalApp/CascadiaSettings.h b/src/cascadia/TerminalApp/CascadiaSettings.h index 004f3809423..acbbb644a4b 100644 --- a/src/cascadia/TerminalApp/CascadiaSettings.h +++ b/src/cascadia/TerminalApp/CascadiaSettings.h @@ -74,6 +74,8 @@ class TerminalApp::CascadiaSettings final std::vector& GetWarnings(); + void ApplyColorScheme(winrt::Microsoft::Terminal::Settings::IControlSettings& settings, std::wstring_view schemeName); + private: GlobalAppSettings _globals; std::vector _profiles; diff --git a/src/cascadia/TerminalApp/ColorScheme.cpp b/src/cascadia/TerminalApp/ColorScheme.cpp index 525d8ec95cd..38e9b95ccbf 100644 --- a/src/cascadia/TerminalApp/ColorScheme.cpp +++ b/src/cascadia/TerminalApp/ColorScheme.cpp @@ -68,7 +68,7 @@ ColorScheme::~ColorScheme() // - terminalSettings: the object to apply our settings to. // Return Value: // - -void ColorScheme::ApplyScheme(TerminalSettings terminalSettings) const +void ColorScheme::ApplyScheme(IControlSettings& terminalSettings) const { terminalSettings.DefaultForeground(static_cast(_defaultForeground)); terminalSettings.DefaultBackground(static_cast(_defaultBackground)); diff --git a/src/cascadia/TerminalApp/ColorScheme.h b/src/cascadia/TerminalApp/ColorScheme.h index 92f8f4f6d70..a7c71caf766 100644 --- a/src/cascadia/TerminalApp/ColorScheme.h +++ b/src/cascadia/TerminalApp/ColorScheme.h @@ -38,7 +38,7 @@ class TerminalApp::ColorScheme ColorScheme(std::wstring name, til::color defaultFg, til::color defaultBg, til::color cursorColor); ~ColorScheme(); - void ApplyScheme(winrt::Microsoft::Terminal::Settings::TerminalSettings terminalSettings) const; + void ApplyScheme(winrt::Microsoft::Terminal::Settings::IControlSettings& terminalSettings) const; static ColorScheme FromJson(const Json::Value& json); bool ShouldBeLayered(const Json::Value& json) const; diff --git a/src/cascadia/TerminalApp/Profile.cpp b/src/cascadia/TerminalApp/Profile.cpp index 7cd80a65b11..693f2791e33 100644 --- a/src/cascadia/TerminalApp/Profile.cpp +++ b/src/cascadia/TerminalApp/Profile.cpp @@ -176,7 +176,8 @@ TerminalSettings Profile::CreateTerminalSettings(const std::unordered_mapsecond.ApplyScheme(terminalSettings); + IControlSettings controlSettings = terminalSettings; + found->second.ApplyScheme(controlSettings); } } if (_defaultForeground) diff --git a/src/cascadia/TerminalApp/Resources/en-US/Resources.resw b/src/cascadia/TerminalApp/Resources/en-US/Resources.resw index 6ca22a39ff0..0122741eb88 100644 --- a/src/cascadia/TerminalApp/Resources/en-US/Resources.resw +++ b/src/cascadia/TerminalApp/Resources/en-US/Resources.resw @@ -526,6 +526,10 @@ Toggle command palette + + Set color scheme to {0} + {0} will be replaced with the name of a color scheme as defined by the user. + Set tab color to {0} {0} will be replaced with a color, displayed in hexadecimal (#RRGGBB) notation. diff --git a/src/cascadia/TerminalApp/ShortcutActionDispatch.cpp b/src/cascadia/TerminalApp/ShortcutActionDispatch.cpp index 571b4589516..ae436510fc7 100644 --- a/src/cascadia/TerminalApp/ShortcutActionDispatch.cpp +++ b/src/cascadia/TerminalApp/ShortcutActionDispatch.cpp @@ -179,6 +179,11 @@ namespace winrt::TerminalApp::implementation _ToggleCommandPaletteHandlers(*this, *eventArgs); break; } + case ShortcutAction::SetColorScheme: + { + _SetColorSchemeHandlers(*this, *eventArgs); + break; + } case ShortcutAction::SetTabColor: { _SetTabColorHandlers(*this, *eventArgs); diff --git a/src/cascadia/TerminalApp/ShortcutActionDispatch.h b/src/cascadia/TerminalApp/ShortcutActionDispatch.h index 9c1dff1575c..07a75aaf4d7 100644 --- a/src/cascadia/TerminalApp/ShortcutActionDispatch.h +++ b/src/cascadia/TerminalApp/ShortcutActionDispatch.h @@ -51,6 +51,7 @@ namespace winrt::TerminalApp::implementation TYPED_EVENT(ToggleFullscreen, TerminalApp::ShortcutActionDispatch, TerminalApp::ActionEventArgs); TYPED_EVENT(ToggleAlwaysOnTop, TerminalApp::ShortcutActionDispatch, TerminalApp::ActionEventArgs); TYPED_EVENT(ToggleCommandPalette, TerminalApp::ShortcutActionDispatch, TerminalApp::ActionEventArgs); + TYPED_EVENT(SetColorScheme, TerminalApp::ShortcutActionDispatch, TerminalApp::ActionEventArgs); TYPED_EVENT(SetTabColor, TerminalApp::ShortcutActionDispatch, TerminalApp::ActionEventArgs); TYPED_EVENT(OpenTabColorPicker, TerminalApp::ShortcutActionDispatch, TerminalApp::ActionEventArgs); TYPED_EVENT(RenameTab, TerminalApp::ShortcutActionDispatch, TerminalApp::ActionEventArgs); diff --git a/src/cascadia/TerminalApp/ShortcutActionDispatch.idl b/src/cascadia/TerminalApp/ShortcutActionDispatch.idl index 8306c04fc46..7438c856924 100644 --- a/src/cascadia/TerminalApp/ShortcutActionDispatch.idl +++ b/src/cascadia/TerminalApp/ShortcutActionDispatch.idl @@ -36,6 +36,7 @@ namespace TerminalApp ToggleFullscreen, ToggleAlwaysOnTop, OpenSettings, + SetColorScheme, SetTabColor, OpenTabColorPicker, RenameTab, @@ -82,6 +83,7 @@ namespace TerminalApp event Windows.Foundation.TypedEventHandler ToggleFullscreen; event Windows.Foundation.TypedEventHandler ToggleAlwaysOnTop; event Windows.Foundation.TypedEventHandler ToggleCommandPalette; + event Windows.Foundation.TypedEventHandler SetColorScheme; event Windows.Foundation.TypedEventHandler SetTabColor; event Windows.Foundation.TypedEventHandler OpenTabColorPicker; event Windows.Foundation.TypedEventHandler RenameTab; diff --git a/src/cascadia/TerminalApp/TerminalPage.cpp b/src/cascadia/TerminalApp/TerminalPage.cpp index 81cfaf1735c..e612badd7e6 100644 --- a/src/cascadia/TerminalApp/TerminalPage.cpp +++ b/src/cascadia/TerminalApp/TerminalPage.cpp @@ -869,6 +869,7 @@ namespace winrt::TerminalApp::implementation _actionDispatch->ToggleFullscreen({ this, &TerminalPage::_HandleToggleFullscreen }); _actionDispatch->ToggleAlwaysOnTop({ this, &TerminalPage::_HandleToggleAlwaysOnTop }); _actionDispatch->ToggleCommandPalette({ this, &TerminalPage::_HandleToggleCommandPalette }); + _actionDispatch->SetColorScheme({ this, &TerminalPage::_HandleSetColorScheme }); _actionDispatch->SetTabColor({ this, &TerminalPage::_HandleSetTabColor }); _actionDispatch->OpenTabColorPicker({ this, &TerminalPage::_HandleOpenTabColorPicker }); _actionDispatch->RenameTab({ this, &TerminalPage::_HandleRenameTab }); diff --git a/src/cascadia/TerminalApp/TerminalPage.h b/src/cascadia/TerminalApp/TerminalPage.h index f78cfe86f23..dde0b839cd4 100644 --- a/src/cascadia/TerminalApp/TerminalPage.h +++ b/src/cascadia/TerminalApp/TerminalPage.h @@ -219,6 +219,7 @@ namespace winrt::TerminalApp::implementation void _HandleToggleFocusMode(const IInspectable& sender, const TerminalApp::ActionEventArgs& args); void _HandleToggleFullscreen(const IInspectable& sender, const TerminalApp::ActionEventArgs& args); void _HandleToggleAlwaysOnTop(const IInspectable& sender, const TerminalApp::ActionEventArgs& args); + void _HandleSetColorScheme(const IInspectable& sender, const TerminalApp::ActionEventArgs& args); void _HandleSetTabColor(const IInspectable& sender, const TerminalApp::ActionEventArgs& args); void _HandleOpenTabColorPicker(const IInspectable& sender, const TerminalApp::ActionEventArgs& args); void _HandleRenameTab(const IInspectable& sender, const TerminalApp::ActionEventArgs& args); diff --git a/src/cascadia/TerminalControl/TermControl.cpp b/src/cascadia/TerminalControl/TermControl.cpp index 8838eb5df11..b293aca6933 100644 --- a/src/cascadia/TerminalControl/TermControl.cpp +++ b/src/cascadia/TerminalControl/TermControl.cpp @@ -2819,6 +2819,11 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation _renderer->ResetErrorStateAndResume(); } + Settings::IControlSettings TermControl::Settings() const + { + return _settings; + } + // -------------------------------- WinRT Events --------------------------------- // Winrt events need a method for adding a callback to the event and removing the callback. // These macros will define them both for you. diff --git a/src/cascadia/TerminalControl/TermControl.h b/src/cascadia/TerminalControl/TermControl.h index 783ca85d967..d9dffae8f5b 100644 --- a/src/cascadia/TerminalControl/TermControl.h +++ b/src/cascadia/TerminalControl/TermControl.h @@ -99,6 +99,7 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation const Windows::UI::Xaml::Thickness GetPadding(); TerminalConnection::ConnectionState ConnectionState() const; + Settings::IControlSettings Settings() const; static Windows::Foundation::Size GetProposedDimensions(Microsoft::Terminal::Settings::IControlSettings const& settings, const uint32_t dpi); static Windows::Foundation::Size GetProposedDimensions(const winrt::Windows::Foundation::Size& initialSizeInChars, diff --git a/src/cascadia/TerminalControl/TermControl.idl b/src/cascadia/TerminalControl/TermControl.idl index d5454e50578..c6a8a53a485 100644 --- a/src/cascadia/TerminalControl/TermControl.idl +++ b/src/cascadia/TerminalControl/TermControl.idl @@ -38,6 +38,7 @@ namespace Microsoft.Terminal.TerminalControl static Windows.Foundation.Size GetProposedDimensions(Microsoft.Terminal.Settings.IControlSettings settings, UInt32 dpi); void UpdateSettings(Microsoft.Terminal.Settings.IControlSettings newSettings); + Microsoft.Terminal.Settings.IControlSettings Settings { get; }; event TitleChangedEventArgs TitleChanged; event FontSizeChangedEventArgs FontSizeChanged; From 5f7a7d23a735766a3cf2b80527d475fdc3e6f17f Mon Sep 17 00:00:00 2001 From: Mike Griese Date: Wed, 5 Aug 2020 07:45:36 -0500 Subject: [PATCH 2/5] good bot --- src/cascadia/TerminalApp/AppActionHandlers.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/cascadia/TerminalApp/AppActionHandlers.cpp b/src/cascadia/TerminalApp/AppActionHandlers.cpp index 7022264a620..cbb421bee82 100644 --- a/src/cascadia/TerminalApp/AppActionHandlers.cpp +++ b/src/cascadia/TerminalApp/AppActionHandlers.cpp @@ -282,9 +282,8 @@ namespace winrt::TerminalApp::implementation if (auto activeControl = activeTab->GetActiveTerminalControl()) { // Theoretically, if the properties in an IControlSettings - // were all observable, then the termcontrol could just - // listen for their changes, and update in real time. But - // _meh_ + // were all observable, then the TermControl could just + // listen for their changes, and update in real time. auto controlSettings = activeControl.Settings(); _settings->ApplyColorScheme(controlSettings, realArgs.SchemeName()); activeControl.UpdateSettings(controlSettings); From 39e744472e00d47f9d3644aa0511ec4b3fc8d3bf Mon Sep 17 00:00:00 2001 From: Mike Griese Date: Fri, 7 Aug 2020 10:44:49 -0500 Subject: [PATCH 3/5] PR nits --- src/cascadia/TerminalApp/ActionArgs.h | 2 +- src/cascadia/TerminalApp/AppActionHandlers.cpp | 3 --- src/cascadia/TerminalApp/ColorScheme.cpp | 2 +- src/cascadia/TerminalApp/ColorScheme.h | 2 +- src/cascadia/TerminalApp/Profile.cpp | 3 +-- 5 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/cascadia/TerminalApp/ActionArgs.h b/src/cascadia/TerminalApp/ActionArgs.h index ed6511abf44..ac84dde5a5c 100644 --- a/src/cascadia/TerminalApp/ActionArgs.h +++ b/src/cascadia/TerminalApp/ActionArgs.h @@ -338,7 +338,7 @@ namespace winrt::TerminalApp::implementation SetColorSchemeArgs() = default; GETSET_PROPERTY(winrt::hstring, SchemeName, L""); - static constexpr std::string_view NameKey{ "name" }; + static constexpr std::string_view NameKey{ "colorScheme" }; public: hstring GenerateName() const; diff --git a/src/cascadia/TerminalApp/AppActionHandlers.cpp b/src/cascadia/TerminalApp/AppActionHandlers.cpp index 5c56eb04289..91284293662 100644 --- a/src/cascadia/TerminalApp/AppActionHandlers.cpp +++ b/src/cascadia/TerminalApp/AppActionHandlers.cpp @@ -280,9 +280,6 @@ namespace winrt::TerminalApp::implementation { if (auto activeControl = activeTab->GetActiveTerminalControl()) { - // Theoretically, if the properties in an IControlSettings - // were all observable, then the TermControl could just - // listen for their changes, and update in real time. auto controlSettings = activeControl.Settings(); _settings->ApplyColorScheme(controlSettings, realArgs.SchemeName()); activeControl.UpdateSettings(controlSettings); diff --git a/src/cascadia/TerminalApp/ColorScheme.cpp b/src/cascadia/TerminalApp/ColorScheme.cpp index 5cf744d977b..af70c3595e4 100644 --- a/src/cascadia/TerminalApp/ColorScheme.cpp +++ b/src/cascadia/TerminalApp/ColorScheme.cpp @@ -67,7 +67,7 @@ ColorScheme::~ColorScheme() // - terminalSettings: the object to apply our settings to. // Return Value: // - -void ColorScheme::ApplyScheme(winrt::Microsoft::Terminal::TerminalControl::IControlSettings& terminalSettings) const +void ColorScheme::ApplyScheme(const winrt::Microsoft::Terminal::TerminalControl::IControlSettings& terminalSettings) const { terminalSettings.DefaultForeground(static_cast(_defaultForeground)); terminalSettings.DefaultBackground(static_cast(_defaultBackground)); diff --git a/src/cascadia/TerminalApp/ColorScheme.h b/src/cascadia/TerminalApp/ColorScheme.h index c3920ee4e83..2267eb8f006 100644 --- a/src/cascadia/TerminalApp/ColorScheme.h +++ b/src/cascadia/TerminalApp/ColorScheme.h @@ -37,7 +37,7 @@ class TerminalApp::ColorScheme ColorScheme(std::wstring name, til::color defaultFg, til::color defaultBg, til::color cursorColor); ~ColorScheme(); - void ApplyScheme(winrt::Microsoft::Terminal::TerminalControl::IControlSettings& terminalSettings) const; + void ApplyScheme(const winrt::Microsoft::Terminal::TerminalControl::IControlSettings& terminalSettings) const; static ColorScheme FromJson(const Json::Value& json); bool ShouldBeLayered(const Json::Value& json) const; diff --git a/src/cascadia/TerminalApp/Profile.cpp b/src/cascadia/TerminalApp/Profile.cpp index e09241969ca..9829474297a 100644 --- a/src/cascadia/TerminalApp/Profile.cpp +++ b/src/cascadia/TerminalApp/Profile.cpp @@ -177,8 +177,7 @@ TerminalSettings Profile::CreateTerminalSettings(const std::unordered_mapsecond.ApplyScheme(controlSettings); + found->second.ApplyScheme(terminalSettings); } } if (_defaultForeground) From 2d09f7bb6cf6bdb74bfe57df2ba3532164f31380 Mon Sep 17 00:00:00 2001 From: Mike Griese Date: Fri, 7 Aug 2020 10:45:33 -0500 Subject: [PATCH 4/5] update schema too --- doc/cascadia/profiles.schema.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/cascadia/profiles.schema.json b/doc/cascadia/profiles.schema.json index 75cd3b9355a..38bdd5352ab 100644 --- a/doc/cascadia/profiles.schema.json +++ b/doc/cascadia/profiles.schema.json @@ -291,7 +291,7 @@ { "properties": { "action": { "type": "string", "pattern": "setColorScheme" }, - "name": { + "colorScheme": { "type": "string", "default": "", "description": "the name of the scheme to apply to the active pane" From f03c4707ccc16666262f9623697664bfee274312 Mon Sep 17 00:00:00 2001 From: Mike Griese Date: Fri, 7 Aug 2020 15:42:30 -0500 Subject: [PATCH 5/5] only mark the event as handled if we found a matching scheme --- src/cascadia/TerminalApp/AppActionHandlers.cpp | 10 ++++++---- src/cascadia/TerminalApp/CascadiaSettings.cpp | 7 +++++-- src/cascadia/TerminalApp/CascadiaSettings.h | 2 +- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/cascadia/TerminalApp/AppActionHandlers.cpp b/src/cascadia/TerminalApp/AppActionHandlers.cpp index 91284293662..55e1449b772 100644 --- a/src/cascadia/TerminalApp/AppActionHandlers.cpp +++ b/src/cascadia/TerminalApp/AppActionHandlers.cpp @@ -274,6 +274,7 @@ namespace winrt::TerminalApp::implementation void TerminalPage::_HandleSetColorScheme(const IInspectable& /*sender*/, const TerminalApp::ActionEventArgs& args) { + args.Handled(false); if (const auto& realArgs = args.ActionArgs().try_as()) { if (auto activeTab = _GetFocusedTab()) @@ -281,13 +282,14 @@ namespace winrt::TerminalApp::implementation if (auto activeControl = activeTab->GetActiveTerminalControl()) { auto controlSettings = activeControl.Settings(); - _settings->ApplyColorScheme(controlSettings, realArgs.SchemeName()); - activeControl.UpdateSettings(controlSettings); + if (_settings->ApplyColorScheme(controlSettings, realArgs.SchemeName())) + { + activeControl.UpdateSettings(controlSettings); + args.Handled(true); + } } } } - - args.Handled(true); } void TerminalPage::_HandleSetTabColor(const IInspectable& /*sender*/, diff --git a/src/cascadia/TerminalApp/CascadiaSettings.cpp b/src/cascadia/TerminalApp/CascadiaSettings.cpp index d82f0d95502..e06db37795d 100644 --- a/src/cascadia/TerminalApp/CascadiaSettings.cpp +++ b/src/cascadia/TerminalApp/CascadiaSettings.cpp @@ -753,8 +753,9 @@ const ColorScheme* CascadiaSettings::GetColorSchemeForProfile(const GUID profile // - settings: the IControlSettings object to modify // - name: the name of the scheme to apply // Return Value: -// - -void CascadiaSettings::ApplyColorScheme(winrt::Microsoft::Terminal::TerminalControl::IControlSettings& settings, std::wstring_view schemeName) +// - true iff we found a matching scheme for the name schemeName +bool CascadiaSettings::ApplyColorScheme(winrt::Microsoft::Terminal::TerminalControl::IControlSettings& settings, + std::wstring_view schemeName) { std::wstring name{ schemeName }; auto schemeAndName = _globals.GetColorSchemes().find(name); @@ -762,5 +763,7 @@ void CascadiaSettings::ApplyColorScheme(winrt::Microsoft::Terminal::TerminalCont { const auto& scheme = schemeAndName->second; scheme.ApplyScheme(settings); + return true; } + return false; } diff --git a/src/cascadia/TerminalApp/CascadiaSettings.h b/src/cascadia/TerminalApp/CascadiaSettings.h index 2b39ad8b7c3..981264e10f2 100644 --- a/src/cascadia/TerminalApp/CascadiaSettings.h +++ b/src/cascadia/TerminalApp/CascadiaSettings.h @@ -74,7 +74,7 @@ class TerminalApp::CascadiaSettings final std::vector& GetWarnings(); - void ApplyColorScheme(winrt::Microsoft::Terminal::TerminalControl::IControlSettings& settings, std::wstring_view schemeName); + bool ApplyColorScheme(winrt::Microsoft::Terminal::TerminalControl::IControlSettings& settings, std::wstring_view schemeName); private: GlobalAppSettings _globals;