mirror of
https://github.com/microsoft/terminal.git
synced 2025-12-10 00:48:23 -06:00
Automatically enable AdjustIndistinguishableColors if High Contrast mode enabled (#17346)
If High Contrast mode is enabled in the OS settings, we now automatically enable `adjustIndistinguishableColors`. To accomplish this, a new `Automatic` value is added to `adjustIndistinguishableColors`. When it's chosen, color nudging doesn't occur in regular contrast sessions, but we interpret the value as `Indexed` respectively. The new default value is `AutomaticIndexed`. Meaning that regular contrast sessions will see no difference in behavior. However, if they switch to high contrast mode, Windows Terminal will interpret the value as `Indexed` at runtime. This was chosen because `Always` is more performance intensive. ## References and Relevant Issues #12999 ## Validation Steps Performed ✅ Toggling High Contrast mode immediately triggers an updated terminal instance with `adjustIndistinguishableColors`
This commit is contained in:
parent
7a9fb76955
commit
685499df3a
@ -955,6 +955,11 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ControlCore::SetHighContrastMode(const bool enabled)
|
||||||
|
{
|
||||||
|
_terminal->SetHighContrastMode(enabled);
|
||||||
|
}
|
||||||
|
|
||||||
Control::IControlSettings ControlCore::Settings()
|
Control::IControlSettings ControlCore::Settings()
|
||||||
{
|
{
|
||||||
return *_settings;
|
return *_settings;
|
||||||
|
|||||||
@ -94,6 +94,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
|
|
||||||
void UpdateSettings(const Control::IControlSettings& settings, const IControlAppearance& newAppearance);
|
void UpdateSettings(const Control::IControlSettings& settings, const IControlAppearance& newAppearance);
|
||||||
void ApplyAppearance(const bool focused);
|
void ApplyAppearance(const bool focused);
|
||||||
|
void SetHighContrastMode(const bool enabled);
|
||||||
Control::IControlSettings Settings();
|
Control::IControlSettings Settings();
|
||||||
Control::IControlAppearance FocusedAppearance() const;
|
Control::IControlAppearance FocusedAppearance() const;
|
||||||
Control::IControlAppearance UnfocusedAppearance() const;
|
Control::IControlAppearance UnfocusedAppearance() const;
|
||||||
|
|||||||
@ -102,6 +102,7 @@ namespace Microsoft.Terminal.Control
|
|||||||
IControlAppearance FocusedAppearance { get; };
|
IControlAppearance FocusedAppearance { get; };
|
||||||
IControlAppearance UnfocusedAppearance { get; };
|
IControlAppearance UnfocusedAppearance { get; };
|
||||||
Boolean HasUnfocusedAppearance();
|
Boolean HasUnfocusedAppearance();
|
||||||
|
void SetHighContrastMode(Boolean enabled);
|
||||||
|
|
||||||
UInt64 SwapChainHandle { get; };
|
UInt64 SwapChainHandle { get; };
|
||||||
|
|
||||||
|
|||||||
@ -257,6 +257,12 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
return get_self<ControlCore>(_termControl->_core);
|
return get_self<ControlCore>(_termControl->_core);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Windows::UI::ViewManagement::AccessibilitySettings& _GetAccessibilitySettings()
|
||||||
|
{
|
||||||
|
static Windows::UI::ViewManagement::AccessibilitySettings accessibilitySettings;
|
||||||
|
return accessibilitySettings;
|
||||||
|
}
|
||||||
|
|
||||||
TermControl::TermControl(IControlSettings settings,
|
TermControl::TermControl(IControlSettings settings,
|
||||||
Control::IControlAppearance unfocusedAppearance,
|
Control::IControlAppearance unfocusedAppearance,
|
||||||
TerminalConnection::ITerminalConnection connection) :
|
TerminalConnection::ITerminalConnection connection) :
|
||||||
@ -276,6 +282,16 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
|
|
||||||
_core = _interactivity.Core();
|
_core = _interactivity.Core();
|
||||||
|
|
||||||
|
// If high contrast mode was changed, update the appearance appropriately.
|
||||||
|
_core.SetHighContrastMode(_GetAccessibilitySettings().HighContrast());
|
||||||
|
_revokers.HighContrastChanged = _GetAccessibilitySettings().HighContrastChanged(winrt::auto_revoke, [weakThis{ get_weak() }](const Windows::UI::ViewManagement::AccessibilitySettings& a11ySettings, auto&&) {
|
||||||
|
if (auto termControl = weakThis.get())
|
||||||
|
{
|
||||||
|
termControl->_core.SetHighContrastMode(a11ySettings.HighContrast());
|
||||||
|
termControl->_core.ApplyAppearance(termControl->_focused);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// This event is specifically triggered by the renderer thread, a BG thread. Use a weak ref here.
|
// This event is specifically triggered by the renderer thread, a BG thread. Use a weak ref here.
|
||||||
_revokers.RendererEnteredErrorState = _core.RendererEnteredErrorState(winrt::auto_revoke, { get_weak(), &TermControl::_RendererEnteredErrorState });
|
_revokers.RendererEnteredErrorState = _core.RendererEnteredErrorState(winrt::auto_revoke, { get_weak(), &TermControl::_RendererEnteredErrorState });
|
||||||
|
|
||||||
|
|||||||
@ -362,7 +362,6 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
};
|
};
|
||||||
bool _InitializeTerminal(const InitializeReason reason);
|
bool _InitializeTerminal(const InitializeReason reason);
|
||||||
safe_void_coroutine _restoreInBackground();
|
safe_void_coroutine _restoreInBackground();
|
||||||
void _SetFontSize(int fontSize);
|
|
||||||
void _TappedHandler(const Windows::Foundation::IInspectable& sender, const Windows::UI::Xaml::Input::TappedRoutedEventArgs& e);
|
void _TappedHandler(const Windows::Foundation::IInspectable& sender, const Windows::UI::Xaml::Input::TappedRoutedEventArgs& e);
|
||||||
void _KeyDownHandler(const Windows::Foundation::IInspectable& sender, const Windows::UI::Xaml::Input::KeyRoutedEventArgs& e);
|
void _KeyDownHandler(const Windows::Foundation::IInspectable& sender, const Windows::UI::Xaml::Input::KeyRoutedEventArgs& e);
|
||||||
void _KeyUpHandler(const Windows::Foundation::IInspectable& sender, const Windows::UI::Xaml::Input::KeyRoutedEventArgs& e);
|
void _KeyUpHandler(const Windows::Foundation::IInspectable& sender, const Windows::UI::Xaml::Input::KeyRoutedEventArgs& e);
|
||||||
@ -394,8 +393,6 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
void _SwapChainSizeChanged(const Windows::Foundation::IInspectable& sender, const Windows::UI::Xaml::SizeChangedEventArgs& e);
|
void _SwapChainSizeChanged(const Windows::Foundation::IInspectable& sender, const Windows::UI::Xaml::SizeChangedEventArgs& e);
|
||||||
void _SwapChainScaleChanged(const Windows::UI::Xaml::Controls::SwapChainPanel& sender, const Windows::Foundation::IInspectable& args);
|
void _SwapChainScaleChanged(const Windows::UI::Xaml::Controls::SwapChainPanel& sender, const Windows::Foundation::IInspectable& args);
|
||||||
|
|
||||||
void _TerminalTabColorChanged(const std::optional<til::color> color);
|
|
||||||
|
|
||||||
void _ScrollPositionChanged(const IInspectable& sender, const Control::ScrollPositionChangedArgs& args);
|
void _ScrollPositionChanged(const IInspectable& sender, const Control::ScrollPositionChangedArgs& args);
|
||||||
|
|
||||||
bool _CapturePointer(const Windows::Foundation::IInspectable& sender, const Windows::UI::Xaml::Input::PointerRoutedEventArgs& e);
|
bool _CapturePointer(const Windows::Foundation::IInspectable& sender, const Windows::UI::Xaml::Input::PointerRoutedEventArgs& e);
|
||||||
@ -480,6 +477,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
// These are set up in _InitializeTerminal
|
// These are set up in _InitializeTerminal
|
||||||
Control::ControlCore::RendererWarning_revoker RendererWarning;
|
Control::ControlCore::RendererWarning_revoker RendererWarning;
|
||||||
Control::ControlCore::SwapChainChanged_revoker SwapChainChanged;
|
Control::ControlCore::SwapChainChanged_revoker SwapChainChanged;
|
||||||
|
Windows::UI::ViewManagement::AccessibilitySettings::HighContrastChanged_revoker HighContrastChanged;
|
||||||
|
|
||||||
Control::ControlInteractivity::OpenHyperlink_revoker interactivityOpenHyperlink;
|
Control::ControlInteractivity::OpenHyperlink_revoker interactivityOpenHyperlink;
|
||||||
Control::ControlInteractivity::ScrollPositionChanged_revoker interactivityScrollPositionChanged;
|
Control::ControlInteractivity::ScrollPositionChanged_revoker interactivityScrollPositionChanged;
|
||||||
|
|||||||
@ -23,7 +23,8 @@ namespace Microsoft.Terminal.Core
|
|||||||
{
|
{
|
||||||
Never,
|
Never,
|
||||||
Indexed,
|
Indexed,
|
||||||
Always
|
Always,
|
||||||
|
Automatic
|
||||||
};
|
};
|
||||||
|
|
||||||
// TerminalCore declares its own Color struct to avoid depending
|
// TerminalCore declares its own Color struct to avoid depending
|
||||||
|
|||||||
@ -143,7 +143,15 @@ void Terminal::UpdateAppearance(const ICoreAppearance& appearance)
|
|||||||
renderSettings.SetRenderMode(RenderSettings::Mode::IntenseIsBold, appearance.IntenseIsBold());
|
renderSettings.SetRenderMode(RenderSettings::Mode::IntenseIsBold, appearance.IntenseIsBold());
|
||||||
renderSettings.SetRenderMode(RenderSettings::Mode::IntenseIsBright, appearance.IntenseIsBright());
|
renderSettings.SetRenderMode(RenderSettings::Mode::IntenseIsBright, appearance.IntenseIsBright());
|
||||||
|
|
||||||
switch (appearance.AdjustIndistinguishableColors())
|
// If AIC is set to Automatic,
|
||||||
|
// update the value based on if high contrast mode is enabled.
|
||||||
|
AdjustTextMode deducedAIC = appearance.AdjustIndistinguishableColors();
|
||||||
|
if (deducedAIC == AdjustTextMode::Automatic)
|
||||||
|
{
|
||||||
|
deducedAIC = _highContrastMode ? AdjustTextMode::Indexed : AdjustTextMode::Never;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (deducedAIC)
|
||||||
{
|
{
|
||||||
case AdjustTextMode::Always:
|
case AdjustTextMode::Always:
|
||||||
renderSettings.SetRenderMode(RenderSettings::Mode::IndexedDistinguishableColors, false);
|
renderSettings.SetRenderMode(RenderSettings::Mode::IndexedDistinguishableColors, false);
|
||||||
@ -213,6 +221,11 @@ void Terminal::UpdateAppearance(const ICoreAppearance& appearance)
|
|||||||
_NotifyScrollEvent();
|
_NotifyScrollEvent();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Terminal::SetHighContrastMode(bool hc) noexcept
|
||||||
|
{
|
||||||
|
_highContrastMode = hc;
|
||||||
|
}
|
||||||
|
|
||||||
void Terminal::SetCursorStyle(const DispatchTypes::CursorStyle cursorStyle)
|
void Terminal::SetCursorStyle(const DispatchTypes::CursorStyle cursorStyle)
|
||||||
{
|
{
|
||||||
auto& engine = reinterpret_cast<OutputStateMachineEngine&>(_stateMachine->Engine());
|
auto& engine = reinterpret_cast<OutputStateMachineEngine&>(_stateMachine->Engine());
|
||||||
|
|||||||
@ -92,6 +92,7 @@ public:
|
|||||||
|
|
||||||
void UpdateSettings(winrt::Microsoft::Terminal::Core::ICoreSettings settings);
|
void UpdateSettings(winrt::Microsoft::Terminal::Core::ICoreSettings settings);
|
||||||
void UpdateAppearance(const winrt::Microsoft::Terminal::Core::ICoreAppearance& appearance);
|
void UpdateAppearance(const winrt::Microsoft::Terminal::Core::ICoreAppearance& appearance);
|
||||||
|
void SetHighContrastMode(bool hc) noexcept;
|
||||||
void SetFontInfo(const FontInfo& fontInfo);
|
void SetFontInfo(const FontInfo& fontInfo);
|
||||||
void SetCursorStyle(const ::Microsoft::Console::VirtualTerminal::DispatchTypes::CursorStyle cursorStyle);
|
void SetCursorStyle(const ::Microsoft::Console::VirtualTerminal::DispatchTypes::CursorStyle cursorStyle);
|
||||||
void SetVtChecksumReportSupport(const bool enabled);
|
void SetVtChecksumReportSupport(const bool enabled);
|
||||||
@ -382,6 +383,7 @@ private:
|
|||||||
|
|
||||||
std::wstring _answerbackMessage;
|
std::wstring _answerbackMessage;
|
||||||
std::wstring _workingDirectory;
|
std::wstring _workingDirectory;
|
||||||
|
bool _highContrastMode = false;
|
||||||
|
|
||||||
// This default fake font value is only used to check if the font is a raster font.
|
// This default fake font value is only used to check if the font is a raster font.
|
||||||
// Otherwise, the font is changed to a real value with the renderer via TriggerFontChange.
|
// Otherwise, the font is changed to a real value with the renderer via TriggerFontChange.
|
||||||
|
|||||||
@ -946,6 +946,10 @@
|
|||||||
<value>Always</value>
|
<value>Always</value>
|
||||||
<comment>An option to choose from for the "adjust indistinguishable colors" setting. When selected, we will adjust the text colors for visibility.</comment>
|
<comment>An option to choose from for the "adjust indistinguishable colors" setting. When selected, we will adjust the text colors for visibility.</comment>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Profile_AdjustIndistinguishableColorsAutomatic.Content" xml:space="preserve">
|
||||||
|
<value>Automatic</value>
|
||||||
|
<comment>An option to choose from for the "adjust indistinguishable colors" setting. When selected, we will adjust the text colors for visibility only when the colors are part of this profile's color scheme's color table if and only if high contrast mode is enabled.</comment>
|
||||||
|
</data>
|
||||||
<data name="Profile_CursorShapeBar.Content" xml:space="preserve">
|
<data name="Profile_CursorShapeBar.Content" xml:space="preserve">
|
||||||
<value>Bar ( ┃ )</value>
|
<value>Bar ( ┃ )</value>
|
||||||
<comment>{Locked="┃"} An option to choose from for the "cursor shape" setting. When selected, the cursor will look like a vertical bar. The character in the parentheses is used to show what it looks like.</comment>
|
<comment>{Locked="┃"} An option to choose from for the "cursor shape" setting. When selected, the cursor will look like a vertical bar. The character in the parentheses is used to show what it looks like.</comment>
|
||||||
|
|||||||
@ -136,7 +136,7 @@ Author(s):
|
|||||||
X(ConvergedAlignment, BackgroundImageAlignment, "backgroundImageAlignment", ConvergedAlignment::Horizontal_Center | ConvergedAlignment::Vertical_Center) \
|
X(ConvergedAlignment, BackgroundImageAlignment, "backgroundImageAlignment", ConvergedAlignment::Horizontal_Center | ConvergedAlignment::Vertical_Center) \
|
||||||
X(hstring, BackgroundImagePath, "backgroundImage") \
|
X(hstring, BackgroundImagePath, "backgroundImage") \
|
||||||
X(Model::IntenseStyle, IntenseTextStyle, "intenseTextStyle", Model::IntenseStyle::Bright) \
|
X(Model::IntenseStyle, IntenseTextStyle, "intenseTextStyle", Model::IntenseStyle::Bright) \
|
||||||
X(Core::AdjustTextMode, AdjustIndistinguishableColors, "adjustIndistinguishableColors", Core::AdjustTextMode::Never) \
|
X(Core::AdjustTextMode, AdjustIndistinguishableColors, "adjustIndistinguishableColors", Core::AdjustTextMode::Automatic) \
|
||||||
X(bool, UseAcrylic, "useAcrylic", false)
|
X(bool, UseAcrylic, "useAcrylic", false)
|
||||||
|
|
||||||
// Intentionally omitted Appearance settings:
|
// Intentionally omitted Appearance settings:
|
||||||
|
|||||||
@ -35,10 +35,11 @@ JSON_ENUM_MAPPER(::winrt::Microsoft::Terminal::Core::CursorStyle)
|
|||||||
// - Helper for converting a user-specified adjustTextMode value to its corresponding enum
|
// - Helper for converting a user-specified adjustTextMode value to its corresponding enum
|
||||||
JSON_ENUM_MAPPER(::winrt::Microsoft::Terminal::Core::AdjustTextMode)
|
JSON_ENUM_MAPPER(::winrt::Microsoft::Terminal::Core::AdjustTextMode)
|
||||||
{
|
{
|
||||||
JSON_MAPPINGS(3) = {
|
JSON_MAPPINGS(4) = {
|
||||||
pair_type{ "never", ValueType::Never },
|
pair_type{ "never", ValueType::Never },
|
||||||
pair_type{ "indexed", ValueType::Indexed },
|
pair_type{ "indexed", ValueType::Indexed },
|
||||||
pair_type{ "always", ValueType::Always },
|
pair_type{ "always", ValueType::Always },
|
||||||
|
pair_type{ "automatic", ValueType::Automatic },
|
||||||
};
|
};
|
||||||
|
|
||||||
// Override mapping parser to add boolean parsing
|
// Override mapping parser to add boolean parsing
|
||||||
|
|||||||
@ -14,7 +14,7 @@
|
|||||||
X(til::color, SelectionBackground, DEFAULT_FOREGROUND) \
|
X(til::color, SelectionBackground, DEFAULT_FOREGROUND) \
|
||||||
X(bool, IntenseIsBold) \
|
X(bool, IntenseIsBold) \
|
||||||
X(bool, IntenseIsBright, true) \
|
X(bool, IntenseIsBright, true) \
|
||||||
X(winrt::Microsoft::Terminal::Core::AdjustTextMode, AdjustIndistinguishableColors, winrt::Microsoft::Terminal::Core::AdjustTextMode::Never)
|
X(winrt::Microsoft::Terminal::Core::AdjustTextMode, AdjustIndistinguishableColors, winrt::Microsoft::Terminal::Core::AdjustTextMode::Automatic)
|
||||||
|
|
||||||
// --------------------------- Control Appearance ---------------------------
|
// --------------------------- Control Appearance ---------------------------
|
||||||
// All of these settings are defined in IControlAppearance.
|
// All of these settings are defined in IControlAppearance.
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user