From 1740ed5e0e765ebd8676733243eb3eaa81f95df1 Mon Sep 17 00:00:00 2001 From: Sine Striker <trueful@163.com> Date: 周二, 26 12月 2023 17:32:13 +0800 Subject: [PATCH] Fix window visibility inconsistency --- src/core/style/styleagent_win.cpp | 59 ++++++++++++++++++++++++++++++++++++++++------------------- 1 files changed, 40 insertions(+), 19 deletions(-) diff --git a/src/core/style/styleagent_win.cpp b/src/core/style/styleagent_win.cpp index 9d6072e..6b77012 100644 --- a/src/core/style/styleagent_win.cpp +++ b/src/core/style/styleagent_win.cpp @@ -21,27 +21,42 @@ return false; } - const auto msg = static_cast<const MSG *>(message); - switch (msg->message) { - case WM_THEMECHANGED: - case WM_SYSCOLORCHANGE: - case WM_DWMCOLORIZATIONCOLORCHANGED: { - // TODO: walk through `g_styleAgentSet` - break; - } + auto themeChanged = [message]() -> bool { + const auto msg = static_cast<const MSG *>(message); + switch (msg->message) { + case WM_THEMECHANGED: + case WM_SYSCOLORCHANGE: + case WM_DWMCOLORIZATIONCOLORCHANGED: + return true; - case WM_SETTINGCHANGE: { - if (!msg->wParam && msg->lParam && - std::wcscmp(reinterpret_cast<LPCWSTR>(msg->lParam), L"ImmersiveColorSet") == - 0) { - // TODO: walk through `g_styleAgentSet` + case WM_SETTINGCHANGE: { + if (isImmersiveColorSetChange(msg->wParam, msg->lParam)) { + return true; + } + break; } - break; - } - default: - break; + default: + break; + } + return false; + }(); + + if (themeChanged) { + auto theme = []() -> StyleAgent::SystemTheme { + if (isHighContrastModeEnabled()) { + return StyleAgent::HighContrast; + } else if (isDarkThemeActive()) { + return StyleAgent::Dark; + } else { + return StyleAgent::Light; + } + }(); + for (auto &&ap : std::as_const(*g_styleAgentSet())) { + ap->notifyThemeChanged(theme); + } } + return false; } @@ -66,10 +81,16 @@ SystemSettingEventFilter *SystemSettingEventFilter::instance = nullptr; void StyleAgentPrivate::setupSystemThemeHook() { + if (isHighContrastModeEnabled()) { + systemTheme = StyleAgent::HighContrast; + } else if (isDarkThemeActive()) { + systemTheme = StyleAgent::Dark; + } else { + systemTheme = StyleAgent::Light; + } + g_styleAgentSet->insert(this); SystemSettingEventFilter::install(); - - // Initialize `systemTheme` variable } void StyleAgentPrivate::removeSystemThemeHook() { -- Gitblit v1.9.1