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