Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Automatically enable AdjustIndistinguishableColors if High Contrast mode enabled #17346

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions src/cascadia/TerminalControl/ControlCore.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -941,6 +941,11 @@ namespace winrt::Microsoft::Terminal::Control::implementation
}
}

void ControlCore::SetHighContrastInfo(const bool enabled)
{
_terminal->SetHighContrastInfo(enabled);
}

Control::IControlSettings ControlCore::Settings()
{
return *_settings;
Expand Down
1 change: 1 addition & 0 deletions src/cascadia/TerminalControl/ControlCore.h
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation

void UpdateSettings(const Control::IControlSettings& settings, const IControlAppearance& newAppearance);
void ApplyAppearance(const bool focused);
void SetHighContrastInfo(const bool enabled);
Control::IControlSettings Settings();
Control::IControlAppearance FocusedAppearance() const;
Control::IControlAppearance UnfocusedAppearance() const;
Expand Down
1 change: 1 addition & 0 deletions src/cascadia/TerminalControl/ControlCore.idl
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ namespace Microsoft.Terminal.Control
IControlAppearance FocusedAppearance { get; };
IControlAppearance UnfocusedAppearance { get; };
Boolean HasUnfocusedAppearance();
void SetHighContrastInfo(Boolean enabled);

UInt64 SwapChainHandle { get; };

Expand Down
8 changes: 8 additions & 0 deletions src/cascadia/TerminalControl/TermControl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,8 @@ static Microsoft::Console::TSF::Handle& GetTSFHandle()

namespace winrt::Microsoft::Terminal::Control::implementation
{
Windows::UI::ViewManagement::AccessibilitySettings TermControl::_accessibilitySettings{};

TsfDataProvider::TsfDataProvider(TermControl* termControl) noexcept :
_termControl{ termControl }
{
Expand Down Expand Up @@ -187,6 +189,12 @@ namespace winrt::Microsoft::Terminal::Control::implementation

_core = _interactivity.Core();

// If high contrast mode was changed, update the appearance appropriately.
_accessibilitySettings.HighContrastChanged([this](const Windows::UI::ViewManagement::AccessibilitySettings& a11ySettings, auto&&) {
_core.SetHighContrastInfo(a11ySettings.HighContrast());
_core.ApplyAppearance(_focused);
});

// 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 });

Expand Down
5 changes: 2 additions & 3 deletions src/cascadia/TerminalControl/TermControl.h
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,8 @@ namespace winrt::Microsoft::Terminal::Control::implementation
friend struct TermControlT<TermControl>; // friend our parent so it can bind private event handlers
friend struct TsfDataProvider;

static Windows::UI::ViewManagement::AccessibilitySettings _accessibilitySettings;

// NOTE: _uiaEngine must be ordered before _core.
//
// ControlCore::AttachUiaEngine receives a IRenderEngine as a raw pointer, which we own.
Expand Down Expand Up @@ -361,7 +363,6 @@ namespace winrt::Microsoft::Terminal::Control::implementation
};
bool _InitializeTerminal(const InitializeReason reason);
safe_void_coroutine _restoreInBackground();
void _SetFontSize(int fontSize);
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 _KeyUpHandler(const Windows::Foundation::IInspectable& sender, const Windows::UI::Xaml::Input::KeyRoutedEventArgs& e);
Expand Down Expand Up @@ -393,8 +394,6 @@ namespace winrt::Microsoft::Terminal::Control::implementation
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 _TerminalTabColorChanged(const std::optional<til::color> color);

void _ScrollPositionChanged(const IInspectable& sender, const Control::ScrollPositionChangedArgs& args);

bool _CapturePointer(const Windows::Foundation::IInspectable& sender, const Windows::UI::Xaml::Input::PointerRoutedEventArgs& e);
Expand Down
3 changes: 2 additions & 1 deletion src/cascadia/TerminalCore/ICoreAppearance.idl
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@ namespace Microsoft.Terminal.Core
{
Never,
Indexed,
Always
Always,
Automatic
};

// TerminalCore declares its own Color struct to avoid depending
Expand Down
20 changes: 19 additions & 1 deletion src/cascadia/TerminalCore/Terminal.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,20 @@ void Terminal::UpdateAppearance(const ICoreAppearance& appearance)
renderSettings.SetRenderMode(RenderSettings::Mode::IntenseIsBold, appearance.IntenseIsBold());
renderSettings.SetRenderMode(RenderSettings::Mode::IntenseIsBright, appearance.IntenseIsBright());

switch (appearance.AdjustIndistinguishableColors())
// If we're in high contrast mode and AIC is set to Automatic Indexed/Always,
// fallback to Indexed/Always respectively.
const auto deducedAIC = [this, &appearance]() {
const auto initialAIC = appearance.AdjustIndistinguishableColors();
switch (initialAIC)
{
case AdjustTextMode::Automatic:
return _highContrastMode ? AdjustTextMode::Indexed : AdjustTextMode::Never;
default:
return initialAIC;
}
}();

switch (deducedAIC)
{
case AdjustTextMode::Always:
renderSettings.SetRenderMode(RenderSettings::Mode::IndexedDistinguishableColors, false);
Expand Down Expand Up @@ -211,6 +224,11 @@ void Terminal::UpdateAppearance(const ICoreAppearance& appearance)
_NotifyScrollEvent();
}

void Terminal::SetHighContrastInfo(bool hc) noexcept
{
_highContrastMode = hc;
}

void Terminal::SetCursorStyle(const DispatchTypes::CursorStyle cursorStyle)
{
auto& engine = reinterpret_cast<OutputStateMachineEngine&>(_stateMachine->Engine());
Expand Down
2 changes: 2 additions & 0 deletions src/cascadia/TerminalCore/Terminal.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@ class Microsoft::Terminal::Core::Terminal final :

void UpdateSettings(winrt::Microsoft::Terminal::Core::ICoreSettings settings);
void UpdateAppearance(const winrt::Microsoft::Terminal::Core::ICoreAppearance& appearance);
void SetHighContrastInfo(bool hc) noexcept;
void SetFontInfo(const FontInfo& fontInfo);
void SetCursorStyle(const ::Microsoft::Console::VirtualTerminal::DispatchTypes::CursorStyle cursorStyle);
void SetVtChecksumReportSupport(const bool enabled);
Expand Down Expand Up @@ -382,6 +383,7 @@ class Microsoft::Terminal::Core::Terminal final :

std::wstring _answerbackMessage;
std::wstring _workingDirectory;
bool _highContrastMode = false;

// 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.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -942,6 +942,10 @@
<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>
</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">
<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>
Expand Down Expand Up @@ -1961,4 +1965,4 @@
<value>Display a shield in the title bar when Windows Terminal is running as Administrator</value>
<comment>Header for a control to toggle displaying a shield in the title bar of the app. "Admin" refers to elevated sessions like "run as Admin"</comment>
</data>
</root>
</root>
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,11 @@ JSON_ENUM_MAPPER(::winrt::Microsoft::Terminal::Core::CursorStyle)
// - Helper for converting a user-specified adjustTextMode value to its corresponding enum
JSON_ENUM_MAPPER(::winrt::Microsoft::Terminal::Core::AdjustTextMode)
{
JSON_MAPPINGS(3) = {
JSON_MAPPINGS(4) = {
pair_type{ "never", ValueType::Never },
pair_type{ "indexed", ValueType::Indexed },
pair_type{ "always", ValueType::Always },
pair_type{ "automatic", ValueType::Automatic },
};

// Override mapping parser to add boolean parsing
Expand Down
2 changes: 1 addition & 1 deletion src/cascadia/inc/ControlProperties.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
X(til::color, SelectionBackground, DEFAULT_FOREGROUND) \
X(bool, IntenseIsBold) \
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 ---------------------------
// All of these settings are defined in IControlAppearance.
Expand Down
Loading