From 61cb997e4e9ebf50bcff835841fbd1ecc9499e49 Mon Sep 17 00:00:00 2001
From: Zhao Yuhang <2546789017@qq.com>
Date: 周五, 22 12月 2023 21:14:31 +0800
Subject: [PATCH] add themechange notify on win

---
 src/core/style/styleagent_win.cpp |   64 +++++++++++++++++++++++---------
 1 files changed, 46 insertions(+), 18 deletions(-)

diff --git a/src/core/style/styleagent_win.cpp b/src/core/style/styleagent_win.cpp
index 9d6072e..663b632 100644
--- a/src/core/style/styleagent_win.cpp
+++ b/src/core/style/styleagent_win.cpp
@@ -21,27 +21,47 @@
                 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") ==
+                    case WM_SETTINGCHANGE: {
+                        if (!msg->wParam && msg->lParam &&
+                            std::wcscmp(reinterpret_cast<LPCWSTR>(msg->lParam), L"ImmersiveColorSet") ==
                             0) {
-                        // TODO: walk through `g_styleAgentSet`
+                            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())) {
+                    if (ap->systemTheme != theme) {
+                        ap->systemTheme = theme;
+                        ap->notifyThemeChanged(theme);
+                    }
+                }
             }
+
             return false;
         }
 
@@ -65,11 +85,19 @@
 
     SystemSettingEventFilter *SystemSettingEventFilter::instance = nullptr;
 
+    void StyleAgentPrivate::init() {
+        if (isHighContrastModeEnabled()) {
+            systemTheme = StyleAgent::HighContrast;
+        } else if (isDarkThemeActive()) {
+            systemTheme = StyleAgent::Dark;
+        } else {
+            systemTheme = StyleAgent::Light;
+        }
+    }
+
     void StyleAgentPrivate::setupSystemThemeHook() {
         g_styleAgentSet->insert(this);
         SystemSettingEventFilter::install();
-
-        // Initialize `systemTheme` variable
     }
 
     void StyleAgentPrivate::removeSystemThemeHook() {

--
Gitblit v1.9.1