/*++ Copyright (c) Microsoft Corporation Licensed under the MIT license. Module Name: - TerminalSettings.h Abstract: - The implementation of the TerminalSettings winrt class. Provides both terminal control settings and terminal core settings. Author(s): - Mike Griese - March 2019 --*/ #pragma once #include "TerminalSettings.g.h" #include "TerminalSettingsCreateResult.g.h" #include "IInheritable.h" #include "../inc/cppwinrt_utils.h" #include #include using IFontAxesMap = winrt::Windows::Foundation::Collections::IMap; using IFontFeatureMap = winrt::Windows::Foundation::Collections::IMap; // fwdecl unittest classes namespace SettingsModelLocalTests { class TerminalSettingsTests; } namespace winrt::Microsoft::Terminal::Settings::Model::implementation { struct TerminalSettingsCreateResult : public TerminalSettingsCreateResultT { public: TerminalSettingsCreateResult(Model::TerminalSettings defaultSettings, Model::TerminalSettings unfocusedSettings) : _defaultSettings(defaultSettings), _unfocusedSettings(unfocusedSettings) {} TerminalSettingsCreateResult(Model::TerminalSettings defaultSettings) : _defaultSettings(defaultSettings), _unfocusedSettings(nullptr) {} Model::TerminalSettings DefaultSettings() { return _defaultSettings; }; Model::TerminalSettings UnfocusedSettings() { return _unfocusedSettings; }; private: Model::TerminalSettings _defaultSettings; Model::TerminalSettings _unfocusedSettings; }; struct TerminalSettings : TerminalSettingsT, IInheritable { TerminalSettings() = default; static Model::TerminalSettingsCreateResult CreateWithProfile(const Model::CascadiaSettings& appSettings, const Model::Profile& profile, const Control::IKeyBindings& keybindings); static Model::TerminalSettingsCreateResult CreateWithNewTerminalArgs(const Model::CascadiaSettings& appSettings, const Model::NewTerminalArgs& newTerminalArgs, const Control::IKeyBindings& keybindings); static Model::TerminalSettingsCreateResult CreateWithParent(const Model::TerminalSettingsCreateResult& parent); Model::TerminalSettings GetParent(); void SetParent(const Model::TerminalSettings& parent); void ApplyColorScheme(const Model::ColorScheme& scheme); // --------------------------- Core Settings --------------------------- // All of these settings are defined in ICoreSettings. // GetColorTableEntry needs to be implemented manually, to get a // particular value from the array. Microsoft::Terminal::Core::Color GetColorTableEntry(int32_t index) noexcept; void ColorTable(std::array colors); std::array ColorTable(); INHERITABLE_SETTING(Model::TerminalSettings, til::color, DefaultForeground, DEFAULT_FOREGROUND); INHERITABLE_SETTING(Model::TerminalSettings, til::color, DefaultBackground, DEFAULT_BACKGROUND); INHERITABLE_SETTING(Model::TerminalSettings, til::color, SelectionBackground, DEFAULT_FOREGROUND); INHERITABLE_SETTING(Model::TerminalSettings, int32_t, HistorySize, DEFAULT_HISTORY_SIZE); INHERITABLE_SETTING(Model::TerminalSettings, int32_t, InitialRows, 30); INHERITABLE_SETTING(Model::TerminalSettings, int32_t, InitialCols, 80); INHERITABLE_SETTING(Model::TerminalSettings, bool, SnapOnInput, true); INHERITABLE_SETTING(Model::TerminalSettings, bool, AltGrAliasing, true); INHERITABLE_SETTING(Model::TerminalSettings, til::color, CursorColor, DEFAULT_CURSOR_COLOR); INHERITABLE_SETTING(Model::TerminalSettings, Microsoft::Terminal::Core::CursorStyle, CursorShape, Core::CursorStyle::Vintage); INHERITABLE_SETTING(Model::TerminalSettings, uint32_t, CursorHeight, DEFAULT_CURSOR_HEIGHT); INHERITABLE_SETTING(Model::TerminalSettings, hstring, WordDelimiters, DEFAULT_WORD_DELIMITERS); INHERITABLE_SETTING(Model::TerminalSettings, bool, CopyOnSelect, false); INHERITABLE_SETTING(Model::TerminalSettings, bool, InputServiceWarning, true); INHERITABLE_SETTING(Model::TerminalSettings, bool, FocusFollowMouse, false); INHERITABLE_SETTING(Model::TerminalSettings, bool, TrimBlockSelection, false); INHERITABLE_SETTING(Model::TerminalSettings, bool, DetectURLs, true); INHERITABLE_SETTING(Model::TerminalSettings, Windows::Foundation::IReference, TabColor, nullptr); // When set, StartingTabColor allows to create a terminal with a "sticky" tab color. // This color is prioritized above the TabColor (that is usually initialized based on profile settings). // Due to this prioritization, the tab color will be preserved upon settings reload // (even if the profile's tab color gets altered or removed). // This property is expected to be passed only once upon terminal creation. // TODO: to ensure that this property is not populated during settings reload, // we should consider moving this property to a separate interface, // passed to the terminal only upon creation. INHERITABLE_SETTING(Model::TerminalSettings, Windows::Foundation::IReference, StartingTabColor, nullptr); INHERITABLE_SETTING(Model::TerminalSettings, bool, IntenseIsBright); INHERITABLE_SETTING(Model::TerminalSettings, bool, AdjustIndistinguishableColors); // ------------------------ End of Core Settings ----------------------- INHERITABLE_SETTING(Model::TerminalSettings, hstring, ProfileName); INHERITABLE_SETTING(Model::TerminalSettings, hstring, ProfileSource); INHERITABLE_SETTING(Model::TerminalSettings, bool, UseAcrylic, false); INHERITABLE_SETTING(Model::TerminalSettings, double, Opacity, UseAcrylic() ? 0.5 : 1.0); INHERITABLE_SETTING(Model::TerminalSettings, hstring, Padding, DEFAULT_PADDING); INHERITABLE_SETTING(Model::TerminalSettings, hstring, FontFace, DEFAULT_FONT_FACE); INHERITABLE_SETTING(Model::TerminalSettings, int32_t, FontSize, DEFAULT_FONT_SIZE); INHERITABLE_SETTING(Model::TerminalSettings, winrt::Windows::UI::Text::FontWeight, FontWeight); INHERITABLE_SETTING(Model::TerminalSettings, IFontAxesMap, FontAxes); INHERITABLE_SETTING(Model::TerminalSettings, IFontFeatureMap, FontFeatures); INHERITABLE_SETTING(Model::TerminalSettings, Model::ColorScheme, AppliedColorScheme); INHERITABLE_SETTING(Model::TerminalSettings, hstring, BackgroundImage); INHERITABLE_SETTING(Model::TerminalSettings, double, BackgroundImageOpacity, 1.0); INHERITABLE_SETTING(Model::TerminalSettings, winrt::Windows::UI::Xaml::Media::Stretch, BackgroundImageStretchMode, winrt::Windows::UI::Xaml::Media::Stretch::UniformToFill); INHERITABLE_SETTING(Model::TerminalSettings, winrt::Windows::UI::Xaml::HorizontalAlignment, BackgroundImageHorizontalAlignment, winrt::Windows::UI::Xaml::HorizontalAlignment::Center); INHERITABLE_SETTING(Model::TerminalSettings, winrt::Windows::UI::Xaml::VerticalAlignment, BackgroundImageVerticalAlignment, winrt::Windows::UI::Xaml::VerticalAlignment::Center); INHERITABLE_SETTING(Model::TerminalSettings, Microsoft::Terminal::Control::IKeyBindings, KeyBindings, nullptr); INHERITABLE_SETTING(Model::TerminalSettings, hstring, Commandline); INHERITABLE_SETTING(Model::TerminalSettings, hstring, StartingDirectory); INHERITABLE_SETTING(Model::TerminalSettings, hstring, StartingTitle); INHERITABLE_SETTING(Model::TerminalSettings, bool, SuppressApplicationTitle); INHERITABLE_SETTING(Model::TerminalSettings, hstring, EnvironmentVariables); INHERITABLE_SETTING(Model::TerminalSettings, Microsoft::Terminal::Control::ScrollbarState, ScrollState, Microsoft::Terminal::Control::ScrollbarState::Visible); INHERITABLE_SETTING(Model::TerminalSettings, Microsoft::Terminal::Control::TextAntialiasingMode, AntialiasingMode, Microsoft::Terminal::Control::TextAntialiasingMode::Grayscale); INHERITABLE_SETTING(Model::TerminalSettings, bool, RetroTerminalEffect, false); INHERITABLE_SETTING(Model::TerminalSettings, bool, ForceFullRepaintRendering, false); INHERITABLE_SETTING(Model::TerminalSettings, bool, SoftwareRendering, false); INHERITABLE_SETTING(Model::TerminalSettings, bool, ForceVTInput, false); INHERITABLE_SETTING(Model::TerminalSettings, hstring, PixelShaderPath); INHERITABLE_SETTING(Model::TerminalSettings, bool, IntenseIsBold); INHERITABLE_SETTING(Model::TerminalSettings, bool, Elevate, false); private: std::optional> _ColorTable; gsl::span _getColorTableImpl(); void _ApplyProfileSettings(const Model::Profile& profile); void _ApplyGlobalSettings(const Model::GlobalAppSettings& globalSettings) noexcept; void _ApplyAppearanceSettings(const Microsoft::Terminal::Settings::Model::IAppearanceConfig& appearance, const Windows::Foundation::Collections::IMapView& schemes); friend class SettingsModelLocalTests::TerminalSettingsTests; }; } namespace winrt::Microsoft::Terminal::Settings::Model::factory_implementation { BASIC_FACTORY(TerminalSettingsCreateResult); BASIC_FACTORY(TerminalSettings); }