From 50c87e33320fa5b154862644bae8db176bfcf1a2 Mon Sep 17 00:00:00 2001 From: James Holderness Date: Mon, 2 May 2022 15:46:49 +0100 Subject: [PATCH] Update window background when the color table changes. --- .../PublicTerminalCore/HwndTerminal.cpp | 2 -- src/cascadia/TerminalControl/ControlCore.cpp | 28 ++++++------------- src/cascadia/TerminalControl/ControlCore.h | 2 +- src/cascadia/TerminalCore/Terminal.cpp | 9 ------ src/cascadia/TerminalCore/Terminal.hpp | 2 -- src/renderer/base/renderer.cpp | 20 +++++++++++-- src/renderer/base/renderer.hpp | 4 ++- src/terminal/adapter/adaptDispatch.cpp | 8 ++++-- 8 files changed, 35 insertions(+), 40 deletions(-) diff --git a/src/cascadia/PublicTerminalCore/HwndTerminal.cpp b/src/cascadia/PublicTerminalCore/HwndTerminal.cpp index 67a678d2a9d8..f25fd86aecc5 100644 --- a/src/cascadia/PublicTerminalCore/HwndTerminal.cpp +++ b/src/cascadia/PublicTerminalCore/HwndTerminal.cpp @@ -239,8 +239,6 @@ HRESULT HwndTerminal::Initialize() _renderEngine = std::move(dxEngine); - _terminal->SetBackgroundCallback([](auto) {}); - _terminal->Create(COORD{ 80, 25 }, 1000, *_renderer); _terminal->SetWriteInputCallback([=](std::wstring_view input) noexcept { _WriteTextToConnection(input); }); localPointerToThread->EnablePainting(); diff --git a/src/cascadia/TerminalControl/ControlCore.cpp b/src/cascadia/TerminalControl/ControlCore.cpp index 4243fb12f864..cc14f2287704 100644 --- a/src/cascadia/TerminalControl/ControlCore.cpp +++ b/src/cascadia/TerminalControl/ControlCore.cpp @@ -96,9 +96,6 @@ namespace winrt::Microsoft::Terminal::Control::implementation auto pfnTabColorChanged = std::bind(&ControlCore::_terminalTabColorChanged, this, std::placeholders::_1); _terminal->SetTabColorChangedCallback(pfnTabColorChanged); - auto pfnBackgroundColorChanged = std::bind(&ControlCore::_terminalBackgroundColorChanged, this, std::placeholders::_1); - _terminal->SetBackgroundCallback(pfnBackgroundColorChanged); - auto pfnScrollPositionChanged = std::bind(&ControlCore::_terminalScrollPositionChanged, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3); _terminal->SetScrollPositionChangedCallback(pfnScrollPositionChanged); @@ -128,6 +125,8 @@ namespace winrt::Microsoft::Terminal::Control::implementation const auto& renderSettings = _terminal->GetRenderSettings(); _renderer = std::make_unique<::Microsoft::Console::Render::Renderer>(renderSettings, _terminal.get(), nullptr, 0, std::move(renderThread)); + _renderer->SetBackgroundColorChangedCallback([this]() { _rendererBackgroundColorChanged(); }); + _renderer->SetRendererEnteredErrorStateCallback([weakThis = get_weak()]() { if (auto strongThis{ weakThis.get() }) { @@ -1153,21 +1152,6 @@ namespace winrt::Microsoft::Terminal::Control::implementation _TabColorChangedHandlers(*this, nullptr); } - // Method Description: - // - Called for the Terminal's BackgroundColorChanged callback. This will - // re-raise a new winrt TypedEvent that can be listened to. - // - The listeners to this event will re-query the control for the current - // value of BackgroundColor(). - // Arguments: - // - - // Return Value: - // - - void ControlCore::_terminalBackgroundColorChanged(const COLORREF /*color*/) - { - // Raise a BackgroundColorChanged event - _BackgroundColorChangedHandlers(*this, nullptr); - } - // Method Description: // - Update the position and size of the scrollbar to match the given // viewport top, viewport height, and buffer size. @@ -1360,6 +1344,11 @@ namespace winrt::Microsoft::Terminal::Control::implementation _SwapChainChangedHandlers(*this, nullptr); } + void ControlCore::_rendererBackgroundColorChanged() + { + _BackgroundColorChangedHandlers(*this, nullptr); + } + void ControlCore::BlinkAttributeTick() { auto lock = _terminal->LockForWriting(); @@ -1684,8 +1673,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation _renderEngine->SetSelectionBackground(til::color{ _settings->SelectionBackground() }); - _renderer->TriggerRedrawAll(); - _BackgroundColorChangedHandlers(*this, nullptr); + _renderer->TriggerRedrawAll(true); } bool ControlCore::HasUnfocusedAppearance() const diff --git a/src/cascadia/TerminalControl/ControlCore.h b/src/cascadia/TerminalControl/ControlCore.h index 36ce7fd1575e..dfb40441130c 100644 --- a/src/cascadia/TerminalControl/ControlCore.h +++ b/src/cascadia/TerminalControl/ControlCore.h @@ -265,7 +265,6 @@ namespace winrt::Microsoft::Terminal::Control::implementation void _terminalWarningBell(); void _terminalTitleChanged(std::wstring_view wstr); void _terminalTabColorChanged(const std::optional color); - void _terminalBackgroundColorChanged(const COLORREF color); void _terminalScrollPositionChanged(const int viewTop, const int viewHeight, const int bufferSize); @@ -277,6 +276,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation #pragma region RendererCallbacks void _rendererWarning(const HRESULT hr); void _renderEngineSwapChainChanged(); + void _rendererBackgroundColorChanged(); #pragma endregion void _raiseReadOnlyWarning(); diff --git a/src/cascadia/TerminalCore/Terminal.cpp b/src/cascadia/TerminalCore/Terminal.cpp index 2b5151bd7ae9..2bde0be8f3a3 100644 --- a/src/cascadia/TerminalCore/Terminal.cpp +++ b/src/cascadia/TerminalCore/Terminal.cpp @@ -1301,15 +1301,6 @@ void Terminal::SetCursorPositionChangedCallback(std::function pfn) noexc _pfnCursorPositionChanged.swap(pfn); } -// Method Description: -// - Allows setting a callback for when the background color is changed -// Arguments: -// - pfn: a function callback that takes a color -void Terminal::SetBackgroundCallback(std::function pfn) noexcept -{ - _pfnBackgroundColorChanged.swap(pfn); -} - // Method Description: // - Allows settings a callback for settings the taskbar progress indicator // Arguments: diff --git a/src/cascadia/TerminalCore/Terminal.hpp b/src/cascadia/TerminalCore/Terminal.hpp index 1cefa176676b..5b1009bb2fe5 100644 --- a/src/cascadia/TerminalCore/Terminal.hpp +++ b/src/cascadia/TerminalCore/Terminal.hpp @@ -200,7 +200,6 @@ class Microsoft::Terminal::Core::Terminal final : void SetCopyToClipboardCallback(std::function pfn) noexcept; void SetScrollPositionChangedCallback(std::function pfn) noexcept; void SetCursorPositionChangedCallback(std::function pfn) noexcept; - void SetBackgroundCallback(std::function pfn) noexcept; void TaskbarProgressChangedCallback(std::function pfn) noexcept; void SetShowWindowCallback(std::function pfn) noexcept; @@ -268,7 +267,6 @@ class Microsoft::Terminal::Core::Terminal final : #endif std::function _pfnScrollPositionChanged; - std::function _pfnBackgroundColorChanged; std::function _pfnCursorPositionChanged; std::function)> _pfnTabColorChanged; std::function _pfnTaskbarProgressChanged; diff --git a/src/renderer/base/renderer.cpp b/src/renderer/base/renderer.cpp index 2424515b991c..faea3d531f0c 100644 --- a/src/renderer/base/renderer.cpp +++ b/src/renderer/base/renderer.cpp @@ -298,10 +298,10 @@ void Renderer::TriggerRedrawCursor(const COORD* const pcoord) // - Called when something that changes the output state has occurred and the entire frame is now potentially invalid. // - NOTE: Use sparingly. Try to reduce the refresh region where possible. Only use when a global state change has occurred. // Arguments: -// - +// - backgroundChanged - Set to true if the background color has changed. // Return Value: // - -void Renderer::TriggerRedrawAll() +void Renderer::TriggerRedrawAll(const bool backgroundChanged) { FOREACH_ENGINE(pEngine) { @@ -309,6 +309,11 @@ void Renderer::TriggerRedrawAll() } NotifyPaintFrame(); + + if (backgroundChanged && _pfnBackgroundColorChanged) + { + _pfnBackgroundColorChanged(); + } } // Method Description: @@ -1331,6 +1336,17 @@ void Renderer::AddRenderEngine(_In_ IRenderEngine* const pEngine) THROW_HR_MSG(E_UNEXPECTED, "engines array is full"); } +// Method Description: +// - Registers a callback for when the background color is changed +// Arguments: +// - pfn: the callback +// Return Value: +// - +void Renderer::SetBackgroundColorChangedCallback(std::function pfn) +{ + _pfnBackgroundColorChanged = std::move(pfn); +} + // Method Description: // - Registers a callback that will be called when this renderer gives up. // An application consuming a renderer can use this to display auxiliary Retry UI diff --git a/src/renderer/base/renderer.hpp b/src/renderer/base/renderer.hpp index 6d2b33afa80e..cd25463bbefd 100644 --- a/src/renderer/base/renderer.hpp +++ b/src/renderer/base/renderer.hpp @@ -52,7 +52,7 @@ namespace Microsoft::Console::Render void TriggerRedraw(const Microsoft::Console::Types::Viewport& region); void TriggerRedraw(const COORD* const pcoord); void TriggerRedrawCursor(const COORD* const pcoord); - void TriggerRedrawAll(); + void TriggerRedrawAll(const bool backgroundChanged = false); void TriggerTeardown() noexcept; void TriggerSelection(); @@ -84,6 +84,7 @@ namespace Microsoft::Console::Render void AddRenderEngine(_In_ IRenderEngine* const pEngine); + void SetBackgroundColorChangedCallback(std::function pfn); void SetRendererEnteredErrorStateCallback(std::function pfn); void ResetErrorStateAndResume(); @@ -121,6 +122,7 @@ namespace Microsoft::Console::Render Microsoft::Console::Types::Viewport _viewport; std::vector _clusterBuffer; std::vector _previousSelection; + std::function _pfnBackgroundColorChanged; std::function _pfnRendererEnteredErrorState; bool _destructing = false; diff --git a/src/terminal/adapter/adaptDispatch.cpp b/src/terminal/adapter/adaptDispatch.cpp index 82cea029d001..b131a3b8645f 100644 --- a/src/terminal/adapter/adaptDispatch.cpp +++ b/src/terminal/adapter/adaptDispatch.cpp @@ -2234,12 +2234,14 @@ bool AdaptDispatch::SetColorTableEntry(const size_t tableIndex, const DWORD dwCo return false; } - // TODO: In the Terminal we also need to call the _pfnBackgroundColorChanged - // handler when this is going to affect the background color. + // If we're updating the background color, we need to let the renderer + // know, since it may want to repaint the window background to match. + const auto backgroundIndex = _renderSettings.GetColorAliasIndex(ColorAlias::DefaultBackground); + const auto backgroundChanged = (tableIndex == backgroundIndex); // Update the screen colors if we're not a pty // No need to force a redraw in pty mode. - _renderer.TriggerRedrawAll(); + _renderer.TriggerRedrawAll(backgroundChanged); return true; }