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

---
 examples/qml/main.cpp               |    2 
 examples/mainwindow/main.cpp        |    2 
 src/core/style/styleagent_win.cpp   |   64 +++++++++++++++++++++++---------
 src/core/shared/qwkwindowsextra_p.h |    7 +++
 src/core/style/styleagent_p.h       |    2 
 src/core/style/styleagent.cpp       |    3 -
 6 files changed, 56 insertions(+), 24 deletions(-)

diff --git a/examples/mainwindow/main.cpp b/examples/mainwindow/main.cpp
index dd5dc5d..6a1ce88 100644
--- a/examples/mainwindow/main.cpp
+++ b/examples/mainwindow/main.cpp
@@ -3,7 +3,7 @@
 #include "mainwindow.h"
 
 int main(int argc, char *argv[]) {
-    qputenv("QT_WIN_DEBUG_CONSOLE", "1");
+    qputenv("QT_WIN_DEBUG_CONSOLE", "attach");
     qputenv("QSG_INFO", "1");
 #if 0
     qputenv("QT_WIDGETS_RHI", "1");
diff --git a/examples/qml/main.cpp b/examples/qml/main.cpp
index 75ca6e2..e9cf0a7 100644
--- a/examples/qml/main.cpp
+++ b/examples/qml/main.cpp
@@ -4,7 +4,7 @@
 #include <QWKQuick/qwkquickglobal.h>
 
 int main(int argc, char *argv[]) {
-    qputenv("QT_WIN_DEBUG_CONSOLE", "1");
+    qputenv("QT_WIN_DEBUG_CONSOLE", "attach");
     qputenv("QSG_INFO", "1");
 #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
     qputenv("QT_QUICK_CONTROLS_STYLE", "Basic");
diff --git a/src/core/shared/qwkwindowsextra_p.h b/src/core/shared/qwkwindowsextra_p.h
index 03adf7e..d934c07 100644
--- a/src/core/shared/qwkwindowsextra_p.h
+++ b/src/core/shared/qwkwindowsextra_p.h
@@ -327,6 +327,13 @@
         return value.first;
     }
 
+    static inline bool isHighContrastModeEnabled() {
+        HIGHCONTRASTW hc{};
+        hc.cbSize = sizeof(hc);
+        ::SystemParametersInfoW(SPI_GETHIGHCONTRAST, sizeof(hc), &hc, FALSE);
+        return (hc.dwFlags & HCF_HIGHCONTRASTON);
+    }
+
     static inline bool isDarkThemeActive() {
 #if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)
         return QGuiApplication::styleHints()->colorScheme() == Qt::ColorScheme::Dark;
diff --git a/src/core/style/styleagent.cpp b/src/core/style/styleagent.cpp
index 47ef5de..6c0e740 100644
--- a/src/core/style/styleagent.cpp
+++ b/src/core/style/styleagent.cpp
@@ -10,9 +10,6 @@
 
     StyleAgentPrivate::~StyleAgentPrivate() = default;
 
-    void StyleAgentPrivate::init() {
-    }
-
     void StyleAgentPrivate::notifyThemeChanged(StyleAgent::SystemTheme theme) {
         if (theme == systemTheme)
             return;
diff --git a/src/core/style/styleagent_p.h b/src/core/style/styleagent_p.h
index 5d8549a..966e507 100644
--- a/src/core/style/styleagent_p.h
+++ b/src/core/style/styleagent_p.h
@@ -26,7 +26,7 @@
 
         StyleAgent *q_ptr;
 
-        StyleAgent::SystemTheme systemTheme = StyleAgent::Dark;
+        StyleAgent::SystemTheme systemTheme = StyleAgent::Unknown;
 
         virtual void setupSystemThemeHook();
         virtual void removeSystemThemeHook();
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