diff --git a/src/cascadia/TerminalApp/App.xaml b/src/cascadia/TerminalApp/App.xaml
index 24573ba6198..3da02dff31a 100644
--- a/src/cascadia/TerminalApp/App.xaml
+++ b/src/cascadia/TerminalApp/App.xaml
@@ -153,7 +153,7 @@
Color="#2e2e2e" />
+ ResourceKey="TabViewBackground" />
@@ -169,7 +169,7 @@
Color="#e8e8e8" />
+ ResourceKey="TabViewBackground" />
diff --git a/src/cascadia/TerminalApp/Pane.cpp b/src/cascadia/TerminalApp/Pane.cpp
index b1060590d4e..0f1b115bb07 100644
--- a/src/cascadia/TerminalApp/Pane.cpp
+++ b/src/cascadia/TerminalApp/Pane.cpp
@@ -5,6 +5,8 @@
#include "Pane.h"
#include "AppLogic.h"
+#include "Utils.h"
+
#include
using namespace winrt::Windows::Foundation;
@@ -45,14 +47,6 @@ Pane::Pane(const Profile& profile, const TermControl& control, const bool lastFo
_connectionStateChangedToken = _control.ConnectionStateChanged({ this, &Pane::_ControlConnectionStateChangedHandler });
_warningBellToken = _control.WarningBell({ this, &Pane::_ControlWarningBellHandler });
- // On the first Pane's creation, lookup resources we'll use to theme the
- // Pane, including the brushed to use for the focused/unfocused border
- // color.
- if (s_focusedBorderBrush == nullptr || s_unfocusedBorderBrush == nullptr)
- {
- _SetupResources();
- }
-
// Register an event with the control to have it inform us when it gains focus.
_gotFocusRevoker = _control.GotFocus(winrt::auto_revoke, { this, &Pane::_ControlGotFocusHandler });
_lostFocusRevoker = _control.LostFocus(winrt::auto_revoke, { this, &Pane::_ControlLostFocusHandler });
@@ -3077,16 +3071,16 @@ float Pane::_ClampSplitPosition(const bool widthOrHeight, const float requestedV
// * The Brush we'll use for inactive Panes - TabViewBackground (to match the
// color of the titlebar)
// Arguments:
-// -
+// - requestedTheme: this should be the currently active Theme for the app
// Return Value:
// -
-void Pane::_SetupResources()
+void Pane::SetupResources(const winrt::Windows::UI::Xaml::ElementTheme& requestedTheme)
{
const auto res = Application::Current().Resources();
const auto accentColorKey = winrt::box_value(L"SystemAccentColor");
if (res.HasKey(accentColorKey))
{
- const auto colorFromResources = res.Lookup(accentColorKey);
+ const auto colorFromResources = ThemeLookup(res, requestedTheme, accentColorKey);
// If SystemAccentColor is _not_ a Color for some reason, use
// Transparent as the color, so we don't do this process again on
// the next pane (by leaving s_focusedBorderBrush nullptr)
@@ -3104,7 +3098,10 @@ void Pane::_SetupResources()
const auto unfocusedBorderBrushKey = winrt::box_value(L"UnfocusedBorderBrush");
if (res.HasKey(unfocusedBorderBrushKey))
{
- auto obj = res.Lookup(unfocusedBorderBrushKey);
+ // MAKE SURE TO USE ThemeLookup, so that we get the correct resource for
+ // the requestedTheme, not just the value from the resources (which
+ // might not respect the settings' requested theme)
+ auto obj = ThemeLookup(res, requestedTheme, unfocusedBorderBrushKey);
s_unfocusedBorderBrush = obj.try_as();
}
else
diff --git a/src/cascadia/TerminalApp/Pane.h b/src/cascadia/TerminalApp/Pane.h
index c81bd3fd096..3f72d13e49b 100644
--- a/src/cascadia/TerminalApp/Pane.h
+++ b/src/cascadia/TerminalApp/Pane.h
@@ -136,6 +136,8 @@ class Pane : public std::enable_shared_from_this
bool ContainsReadOnly() const;
+ static void SetupResources(const winrt::Windows::UI::Xaml::ElementTheme& requestedTheme);
+
// Method Description:
// - A helper method for ad-hoc recursion on a pane tree. Walks the pane
// tree, calling a function on each pane in a depth-first pattern.
@@ -337,8 +339,6 @@ class Pane : public std::enable_shared_from_this
return false;
}
- static void _SetupResources();
-
struct PanePoint
{
float x;
diff --git a/src/cascadia/TerminalApp/TerminalPage.cpp b/src/cascadia/TerminalApp/TerminalPage.cpp
index 327347f5caf..564f99379df 100644
--- a/src/cascadia/TerminalApp/TerminalPage.cpp
+++ b/src/cascadia/TerminalApp/TerminalPage.cpp
@@ -4175,6 +4175,22 @@ namespace winrt::TerminalApp::implementation
const auto theme = _settings.GlobalSettings().CurrentTheme();
auto requestedTheme{ theme.RequestedTheme() };
+ {
+ // Update the brushes that Pane's use...
+ Pane::SetupResources(requestedTheme);
+ // ... then trigger a visual update for all the pane borders to
+ // apply the new ones.
+ for (const auto& tab : _tabs)
+ {
+ if (auto terminalTab{ _GetTerminalTabImpl(tab) })
+ {
+ terminalTab->GetRootPane()->WalkTree([&](auto&& pane) {
+ pane->UpdateVisuals();
+ });
+ }
+ }
+ }
+
const auto res = Application::Current().Resources();
// Use our helper to lookup the theme-aware version of the resource.