mirror of
https://github.com/microsoft/terminal.git
synced 2025-12-11 04:38:24 -06:00
Allow OSC 17 to set the selection background color (#17742)
This pull request adds support for setting and querying the selection color with `OSC 17`. To make this possible, I had to move selection color down into the color table where it always belonged. This lets us get rid of the special `SetSelectionColor` method from the surface of AtlasEngine, and reunites selection colors with the rest of the special colors.
This commit is contained in:
parent
eabebc4cb2
commit
cbb4a0a01c
@ -82,7 +82,8 @@ public:
|
|||||||
static constexpr size_t FRAME_FOREGROUND = 263;
|
static constexpr size_t FRAME_FOREGROUND = 263;
|
||||||
static constexpr size_t FRAME_BACKGROUND = 264;
|
static constexpr size_t FRAME_BACKGROUND = 264;
|
||||||
static constexpr size_t CURSOR_COLOR = 265;
|
static constexpr size_t CURSOR_COLOR = 265;
|
||||||
static constexpr size_t TABLE_SIZE = 266;
|
static constexpr size_t SELECTION_BACKGROUND = 266;
|
||||||
|
static constexpr size_t TABLE_SIZE = 267;
|
||||||
|
|
||||||
constexpr TextColor() noexcept :
|
constexpr TextColor() noexcept :
|
||||||
_meta{ ColorType::IsDefault },
|
_meta{ ColorType::IsDefault },
|
||||||
|
|||||||
@ -349,9 +349,6 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
const auto viewInPixels = Viewport::FromDimensions({ 0, 0 }, windowSize);
|
const auto viewInPixels = Viewport::FromDimensions({ 0, 0 }, windowSize);
|
||||||
LOG_IF_FAILED(_renderEngine->SetWindowSize({ viewInPixels.Width(), viewInPixels.Height() }));
|
LOG_IF_FAILED(_renderEngine->SetWindowSize({ viewInPixels.Width(), viewInPixels.Height() }));
|
||||||
|
|
||||||
// Update AtlasEngine's SelectionBackground
|
|
||||||
_renderEngine->SetSelectionBackground(til::color{ _settings->SelectionBackground() });
|
|
||||||
|
|
||||||
const auto vp = _renderEngine->GetViewportInCharacters(viewInPixels);
|
const auto vp = _renderEngine->GetViewportInCharacters(viewInPixels);
|
||||||
const auto width = vp.Width();
|
const auto width = vp.Width();
|
||||||
const auto height = vp.Height();
|
const auto height = vp.Height();
|
||||||
@ -900,7 +897,6 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
if (_renderEngine)
|
if (_renderEngine)
|
||||||
{
|
{
|
||||||
// Update AtlasEngine settings under the lock
|
// Update AtlasEngine settings under the lock
|
||||||
_renderEngine->SetSelectionBackground(til::color{ newAppearance->SelectionBackground() });
|
|
||||||
_renderEngine->SetRetroTerminalEffect(newAppearance->RetroTerminalEffect());
|
_renderEngine->SetRetroTerminalEffect(newAppearance->RetroTerminalEffect());
|
||||||
_renderEngine->SetPixelShaderPath(newAppearance->PixelShaderPath());
|
_renderEngine->SetPixelShaderPath(newAppearance->PixelShaderPath());
|
||||||
_renderEngine->SetPixelShaderImagePath(newAppearance->PixelShaderImagePath());
|
_renderEngine->SetPixelShaderImagePath(newAppearance->PixelShaderImagePath());
|
||||||
@ -2412,7 +2408,6 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
|
|
||||||
const auto lock = _terminal->LockForWriting();
|
const auto lock = _terminal->LockForWriting();
|
||||||
_terminal->ApplyScheme(scheme);
|
_terminal->ApplyScheme(scheme);
|
||||||
_renderEngine->SetSelectionBackground(til::color{ _settings->SelectionBackground() });
|
|
||||||
_renderer->TriggerRedrawAll(true);
|
_renderer->TriggerRedrawAll(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -881,8 +881,7 @@ void _stdcall TerminalSetTheme(void* terminal, TerminalTheme theme, LPCWSTR font
|
|||||||
auto& renderSettings = publicTerminal->_terminal->GetRenderSettings();
|
auto& renderSettings = publicTerminal->_terminal->GetRenderSettings();
|
||||||
renderSettings.SetColorTableEntry(TextColor::DEFAULT_FOREGROUND, theme.DefaultForeground);
|
renderSettings.SetColorTableEntry(TextColor::DEFAULT_FOREGROUND, theme.DefaultForeground);
|
||||||
renderSettings.SetColorTableEntry(TextColor::DEFAULT_BACKGROUND, theme.DefaultBackground);
|
renderSettings.SetColorTableEntry(TextColor::DEFAULT_BACKGROUND, theme.DefaultBackground);
|
||||||
|
renderSettings.SetColorTableEntry(TextColor::SELECTION_BACKGROUND, theme.DefaultSelectionBackground);
|
||||||
publicTerminal->_renderEngine->SetSelectionBackground(theme.DefaultSelectionBackground);
|
|
||||||
|
|
||||||
// Set the font colors
|
// Set the font colors
|
||||||
for (size_t tableIndex = 0; tableIndex < 16; tableIndex++)
|
for (size_t tableIndex = 0; tableIndex < 16; tableIndex++)
|
||||||
|
|||||||
@ -5,7 +5,6 @@ namespace Microsoft.Terminal.Control
|
|||||||
{
|
{
|
||||||
interface IControlAppearance requires Microsoft.Terminal.Core.ICoreAppearance
|
interface IControlAppearance requires Microsoft.Terminal.Core.ICoreAppearance
|
||||||
{
|
{
|
||||||
Microsoft.Terminal.Core.Color SelectionBackground { get; };
|
|
||||||
String BackgroundImage { get; };
|
String BackgroundImage { get; };
|
||||||
Single BackgroundImageOpacity { get; };
|
Single BackgroundImageOpacity { get; };
|
||||||
Windows.UI.Xaml.Media.Stretch BackgroundImageStretchMode { get; };
|
Windows.UI.Xaml.Media.Stretch BackgroundImageStretchMode { get; };
|
||||||
|
|||||||
@ -115,6 +115,7 @@ namespace Microsoft.Terminal.Core
|
|||||||
{
|
{
|
||||||
Microsoft.Terminal.Core.Color DefaultForeground;
|
Microsoft.Terminal.Core.Color DefaultForeground;
|
||||||
Microsoft.Terminal.Core.Color DefaultBackground;
|
Microsoft.Terminal.Core.Color DefaultBackground;
|
||||||
|
Microsoft.Terminal.Core.Color SelectionBackground;
|
||||||
Microsoft.Terminal.Core.Color GetColorTableEntry(Int32 index);
|
Microsoft.Terminal.Core.Color GetColorTableEntry(Int32 index);
|
||||||
Microsoft.Terminal.Core.Color CursorColor;
|
Microsoft.Terminal.Core.Color CursorColor;
|
||||||
CursorStyle CursorShape;
|
CursorStyle CursorShape;
|
||||||
|
|||||||
@ -155,6 +155,8 @@ void Terminal::UpdateAppearance(const ICoreAppearance& appearance)
|
|||||||
renderSettings.SetColorAlias(ColorAlias::DefaultForeground, TextColor::DEFAULT_FOREGROUND, newForegroundColor);
|
renderSettings.SetColorAlias(ColorAlias::DefaultForeground, TextColor::DEFAULT_FOREGROUND, newForegroundColor);
|
||||||
const til::color newCursorColor{ appearance.CursorColor() };
|
const til::color newCursorColor{ appearance.CursorColor() };
|
||||||
renderSettings.SetColorTableEntry(TextColor::CURSOR_COLOR, newCursorColor);
|
renderSettings.SetColorTableEntry(TextColor::CURSOR_COLOR, newCursorColor);
|
||||||
|
const til::color newSelectionColor{ appearance.SelectionBackground() };
|
||||||
|
renderSettings.SetColorTableEntry(TextColor::SELECTION_BACKGROUND, newSelectionColor);
|
||||||
|
|
||||||
for (auto i = 0; i < 16; i++)
|
for (auto i = 0; i < 16; i++)
|
||||||
{
|
{
|
||||||
@ -1275,8 +1277,8 @@ Scheme Terminal::GetColorScheme() const
|
|||||||
s.Foreground = til::color{ renderSettings.GetColorAlias(ColorAlias::DefaultForeground) };
|
s.Foreground = til::color{ renderSettings.GetColorAlias(ColorAlias::DefaultForeground) };
|
||||||
s.Background = til::color{ renderSettings.GetColorAlias(ColorAlias::DefaultBackground) };
|
s.Background = til::color{ renderSettings.GetColorAlias(ColorAlias::DefaultBackground) };
|
||||||
|
|
||||||
// SelectionBackground is stored in the ControlAppearance
|
|
||||||
s.CursorColor = til::color{ renderSettings.GetColorTableEntry(TextColor::CURSOR_COLOR) };
|
s.CursorColor = til::color{ renderSettings.GetColorTableEntry(TextColor::CURSOR_COLOR) };
|
||||||
|
s.SelectionBackground = til::color{ renderSettings.GetColorTableEntry(TextColor::SELECTION_BACKGROUND) };
|
||||||
|
|
||||||
s.Black = til::color{ renderSettings.GetColorTableEntry(TextColor::DARK_BLACK) };
|
s.Black = til::color{ renderSettings.GetColorTableEntry(TextColor::DARK_BLACK) };
|
||||||
s.Red = til::color{ renderSettings.GetColorTableEntry(TextColor::DARK_RED) };
|
s.Red = til::color{ renderSettings.GetColorTableEntry(TextColor::DARK_RED) };
|
||||||
@ -1322,6 +1324,7 @@ void Terminal::ApplyScheme(const Scheme& colorScheme)
|
|||||||
renderSettings.SetColorTableEntry(TextColor::BRIGHT_WHITE, til::color{ colorScheme.BrightWhite });
|
renderSettings.SetColorTableEntry(TextColor::BRIGHT_WHITE, til::color{ colorScheme.BrightWhite });
|
||||||
|
|
||||||
renderSettings.SetColorTableEntry(TextColor::CURSOR_COLOR, til::color{ colorScheme.CursorColor });
|
renderSettings.SetColorTableEntry(TextColor::CURSOR_COLOR, til::color{ colorScheme.CursorColor });
|
||||||
|
renderSettings.SetColorTableEntry(TextColor::SELECTION_BACKGROUND, til::color{ colorScheme.SelectionBackground });
|
||||||
|
|
||||||
// Tell the control that the scrollbar has somehow changed. Used as a
|
// Tell the control that the scrollbar has somehow changed. Used as a
|
||||||
// workaround to force the control to redraw any scrollbar marks whose color
|
// workaround to force the control to redraw any scrollbar marks whose color
|
||||||
|
|||||||
@ -11,6 +11,7 @@
|
|||||||
X(til::color, CursorColor, DEFAULT_CURSOR_COLOR) \
|
X(til::color, CursorColor, DEFAULT_CURSOR_COLOR) \
|
||||||
X(winrt::Microsoft::Terminal::Core::CursorStyle, CursorShape, winrt::Microsoft::Terminal::Core::CursorStyle::Vintage) \
|
X(winrt::Microsoft::Terminal::Core::CursorStyle, CursorShape, winrt::Microsoft::Terminal::Core::CursorStyle::Vintage) \
|
||||||
X(uint32_t, CursorHeight, DEFAULT_CURSOR_HEIGHT) \
|
X(uint32_t, CursorHeight, DEFAULT_CURSOR_HEIGHT) \
|
||||||
|
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::Never)
|
||||||
@ -18,7 +19,6 @@
|
|||||||
// --------------------------- Control Appearance ---------------------------
|
// --------------------------- Control Appearance ---------------------------
|
||||||
// All of these settings are defined in IControlAppearance.
|
// All of these settings are defined in IControlAppearance.
|
||||||
#define CONTROL_APPEARANCE_SETTINGS(X) \
|
#define CONTROL_APPEARANCE_SETTINGS(X) \
|
||||||
X(til::color, SelectionBackground, DEFAULT_FOREGROUND) \
|
|
||||||
X(float, Opacity, 1.0f) \
|
X(float, Opacity, 1.0f) \
|
||||||
X(bool, UseAcrylic, false) \
|
X(bool, UseAcrylic, false) \
|
||||||
X(winrt::hstring, BackgroundImage) \
|
X(winrt::hstring, BackgroundImage) \
|
||||||
|
|||||||
@ -7,7 +7,6 @@
|
|||||||
#include "Backend.h"
|
#include "Backend.h"
|
||||||
#include "../../buffer/out/textBuffer.hpp"
|
#include "../../buffer/out/textBuffer.hpp"
|
||||||
#include "../base/FontCache.h"
|
#include "../base/FontCache.h"
|
||||||
#include "../../types/inc/ColorFix.hpp"
|
|
||||||
|
|
||||||
// #### NOTE ####
|
// #### NOTE ####
|
||||||
// If you see any code in here that contains "_r." you might be seeing a race condition.
|
// If you see any code in here that contains "_r." you might be seeing a race condition.
|
||||||
@ -425,18 +424,6 @@ void AtlasEngine::SetRetroTerminalEffect(bool enable) noexcept
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AtlasEngine::SetSelectionBackground(const COLORREF color) noexcept
|
|
||||||
{
|
|
||||||
const u32 selectionColor = (color & 0xffffff) | 0xff000000;
|
|
||||||
if (_api.s->misc->selectionColor != selectionColor)
|
|
||||||
{
|
|
||||||
auto misc = _api.s.write()->misc.write();
|
|
||||||
misc->selectionColor = selectionColor;
|
|
||||||
// Select a black or white foreground based on the perceptual lightness of the background.
|
|
||||||
misc->selectionForeground = ColorFix::GetLuminosity(selectionColor) < 0.5f ? 0xffffffff : 0xff000000;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void AtlasEngine::SetSoftwareRendering(bool enable) noexcept
|
void AtlasEngine::SetSoftwareRendering(bool enable) noexcept
|
||||||
{
|
{
|
||||||
if (_api.s->target->useWARP != enable)
|
if (_api.s->target->useWARP != enable)
|
||||||
|
|||||||
@ -315,6 +315,21 @@ CATCH_RETURN()
|
|||||||
}
|
}
|
||||||
|
|
||||||
_api.selectionSpans = til::point_span_subspan_within_rect(info.selectionSpans, dr);
|
_api.selectionSpans = til::point_span_subspan_within_rect(info.selectionSpans, dr);
|
||||||
|
|
||||||
|
const u32 newSelectionColor{ static_cast<COLORREF>(info.selectionBackground) | 0xff000000 };
|
||||||
|
if (_api.s->misc->selectionColor != newSelectionColor)
|
||||||
|
{
|
||||||
|
auto misc = _api.s.write()->misc.write();
|
||||||
|
misc->selectionColor = newSelectionColor;
|
||||||
|
// Select a black or white foreground based on the perceptual lightness of the background.
|
||||||
|
misc->selectionForeground = ColorFix::GetLuminosity(newSelectionColor) < 0.5f ? 0xffffffff : 0xff000000;
|
||||||
|
|
||||||
|
// We copied the selection colors into _p during StartPaint, which happened just before PrepareRenderInfo
|
||||||
|
// This keeps their generations in sync.
|
||||||
|
auto pm = _p.s.write()->misc.write();
|
||||||
|
pm->selectionColor = misc->selectionColor;
|
||||||
|
pm->selectionForeground = misc->selectionForeground;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return S_OK;
|
return S_OK;
|
||||||
@ -502,7 +517,7 @@ try
|
|||||||
// Apply the highlighting colors to the highlighted cells
|
// Apply the highlighting colors to the highlighted cells
|
||||||
RETURN_IF_FAILED(_drawHighlighted(_api.searchHighlights, y, x, columnEnd, highlightFg, highlightBg));
|
RETURN_IF_FAILED(_drawHighlighted(_api.searchHighlights, y, x, columnEnd, highlightFg, highlightBg));
|
||||||
RETURN_IF_FAILED(_drawHighlighted(_api.searchHighlightFocused, y, x, columnEnd, highlightFocusFg, highlightFocusBg));
|
RETURN_IF_FAILED(_drawHighlighted(_api.searchHighlightFocused, y, x, columnEnd, highlightFocusFg, highlightFocusBg));
|
||||||
RETURN_IF_FAILED(_drawHighlighted(_api.selectionSpans, y, x, columnEnd, _api.s->misc->selectionForeground, _api.s->misc->selectionColor));
|
RETURN_IF_FAILED(_drawHighlighted(_api.selectionSpans, y, x, columnEnd, _p.s->misc->selectionForeground, _p.s->misc->selectionColor));
|
||||||
|
|
||||||
_api.lastPaintBufferLineCoord = { x, y };
|
_api.lastPaintBufferLineCoord = { x, y };
|
||||||
return S_OK;
|
return S_OK;
|
||||||
|
|||||||
@ -71,7 +71,6 @@ namespace Microsoft::Console::Render::Atlas
|
|||||||
void SetPixelShaderPath(std::wstring_view value) noexcept;
|
void SetPixelShaderPath(std::wstring_view value) noexcept;
|
||||||
void SetPixelShaderImagePath(std::wstring_view value) noexcept;
|
void SetPixelShaderImagePath(std::wstring_view value) noexcept;
|
||||||
void SetRetroTerminalEffect(bool enable) noexcept;
|
void SetRetroTerminalEffect(bool enable) noexcept;
|
||||||
void SetSelectionBackground(COLORREF color) noexcept;
|
|
||||||
void SetSoftwareRendering(bool enable) noexcept;
|
void SetSoftwareRendering(bool enable) noexcept;
|
||||||
void SetDisablePartialInvalidation(bool enable) noexcept;
|
void SetDisablePartialInvalidation(bool enable) noexcept;
|
||||||
void SetGraphicsAPI(GraphicsAPI graphicsAPI) noexcept;
|
void SetGraphicsAPI(GraphicsAPI graphicsAPI) noexcept;
|
||||||
|
|||||||
@ -20,6 +20,7 @@ RenderSettings::RenderSettings() noexcept
|
|||||||
SetColorTableEntry(TextColor::FRAME_FOREGROUND, INVALID_COLOR);
|
SetColorTableEntry(TextColor::FRAME_FOREGROUND, INVALID_COLOR);
|
||||||
SetColorTableEntry(TextColor::FRAME_BACKGROUND, INVALID_COLOR);
|
SetColorTableEntry(TextColor::FRAME_BACKGROUND, INVALID_COLOR);
|
||||||
SetColorTableEntry(TextColor::CURSOR_COLOR, INVALID_COLOR);
|
SetColorTableEntry(TextColor::CURSOR_COLOR, INVALID_COLOR);
|
||||||
|
SetColorTableEntry(TextColor::SELECTION_BACKGROUND, INVALID_COLOR);
|
||||||
|
|
||||||
SetColorAliasIndex(ColorAlias::DefaultForeground, TextColor::DARK_WHITE);
|
SetColorAliasIndex(ColorAlias::DefaultForeground, TextColor::DARK_WHITE);
|
||||||
SetColorAliasIndex(ColorAlias::DefaultBackground, TextColor::DARK_BLACK);
|
SetColorAliasIndex(ColorAlias::DefaultBackground, TextColor::DARK_BLACK);
|
||||||
|
|||||||
@ -1276,6 +1276,7 @@ void Renderer::_PaintCursor(_In_ IRenderEngine* const pEngine)
|
|||||||
info.searchHighlights = _pData->GetSearchHighlights();
|
info.searchHighlights = _pData->GetSearchHighlights();
|
||||||
info.searchHighlightFocused = _pData->GetSearchHighlightFocused();
|
info.searchHighlightFocused = _pData->GetSearchHighlightFocused();
|
||||||
info.selectionSpans = _pData->GetSelectionSpans();
|
info.selectionSpans = _pData->GetSelectionSpans();
|
||||||
|
info.selectionBackground = _renderSettings.GetColorTableEntry(TextColor::SELECTION_BACKGROUND);
|
||||||
return pEngine->PrepareRenderInfo(std::move(info));
|
return pEngine->PrepareRenderInfo(std::move(info));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -33,6 +33,7 @@ namespace Microsoft::Console::Render
|
|||||||
std::span<const til::point_span> searchHighlights;
|
std::span<const til::point_span> searchHighlights;
|
||||||
const til::point_span* searchHighlightFocused;
|
const til::point_span* searchHighlightFocused;
|
||||||
std::span<const til::point_span> selectionSpans;
|
std::span<const til::point_span> selectionSpans;
|
||||||
|
til::color selectionBackground;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class GridLines
|
enum class GridLines
|
||||||
|
|||||||
@ -32,7 +32,7 @@ static constexpr std::array<XtermResourceColorTableEntry, 10> XtermResourceColor
|
|||||||
/* 14 */ { -1, -1 },
|
/* 14 */ { -1, -1 },
|
||||||
/* 15 */ { -1, -1 },
|
/* 15 */ { -1, -1 },
|
||||||
/* 16 */ { -1, -1 },
|
/* 16 */ { -1, -1 },
|
||||||
/* 17 */ { -1, -1 },
|
/* 17 */ { TextColor::SELECTION_BACKGROUND, -1 },
|
||||||
/* 18 */ { -1, -1 },
|
/* 18 */ { -1, -1 },
|
||||||
/* 19 */ { -1, -1 },
|
/* 19 */ { -1, -1 },
|
||||||
} };
|
} };
|
||||||
|
|||||||
@ -804,6 +804,7 @@ bool OutputStateMachineEngine::ActionOscDispatch(const size_t parameter, const s
|
|||||||
case OscActionCodes::SetForegroundColor:
|
case OscActionCodes::SetForegroundColor:
|
||||||
case OscActionCodes::SetBackgroundColor:
|
case OscActionCodes::SetBackgroundColor:
|
||||||
case OscActionCodes::SetCursorColor:
|
case OscActionCodes::SetCursorColor:
|
||||||
|
case OscActionCodes::SetHighlightColor:
|
||||||
{
|
{
|
||||||
std::vector<DWORD> colors;
|
std::vector<DWORD> colors;
|
||||||
success = _GetOscSetColor(string, colors);
|
success = _GetOscSetColor(string, colors);
|
||||||
|
|||||||
@ -213,6 +213,7 @@ namespace Microsoft::Console::VirtualTerminal
|
|||||||
SetForegroundColor = 10,
|
SetForegroundColor = 10,
|
||||||
SetBackgroundColor = 11,
|
SetBackgroundColor = 11,
|
||||||
SetCursorColor = 12,
|
SetCursorColor = 12,
|
||||||
|
SetHighlightColor = 17,
|
||||||
DECSWT_SetWindowTitle = 21,
|
DECSWT_SetWindowTitle = 21,
|
||||||
SetClipboard = 52,
|
SetClipboard = 52,
|
||||||
ResetForegroundColor = 110, // Not implemented
|
ResetForegroundColor = 110, // Not implemented
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user