From e331fb1feda8891baba2a2dc1caeed67834d9d93 Mon Sep 17 00:00:00 2001
From: Zhao Yuhang <2546789017@qq.com>
Date: 周五, 22 12月 2023 23:47:22 +0800
Subject: [PATCH] improve dark mode on win

---
 src/core/contexts/win32windowcontext.cpp |   39 ++++++++++++++++++++++++++-------------
 1 files changed, 26 insertions(+), 13 deletions(-)

diff --git a/src/core/contexts/win32windowcontext.cpp b/src/core/contexts/win32windowcontext.cpp
index 4ea0b5a..19f1864 100644
--- a/src/core/contexts/win32windowcontext.cpp
+++ b/src/core/contexts/win32windowcontext.cpp
@@ -725,17 +725,7 @@
 #if !QWINDOWKIT_CONFIG(ENABLE_WINDOWS_SYSTEM_BORDER)
         {
             auto style = ::GetWindowLongPtrW(hWnd, GWL_STYLE);
-            ::SetWindowLongPtrW(hWnd, GWL_STYLE, style | WS_THICKFRAME | WS_CAPTION);
-        }
-#endif
-
-#if QT_VERSION < QT_VERSION_CHECK(6, 5, 0)
-        for (const auto attr : {
-                 _DWMWA_USE_IMMERSIVE_DARK_MODE_BEFORE_20H1,
-                 _DWMWA_USE_IMMERSIVE_DARK_MODE,
-             }) {
-            const BOOL enable = TRUE;
-            DynamicApis::instance().pDwmSetWindowAttribute(hWnd, attr, &enable, sizeof(enable));
+            ::SetWindowLongPtrW(hWnd, GWL_STYLE, (style | WS_THICKFRAME) & (~WS_CAPTION));
         }
 #endif
 
@@ -942,6 +932,29 @@
                 }
                 apis.pDwmExtendFrameIntoClientArea(hwnd, &defaultMargins);
             }
+            return true;
+        } else if (key == QStringLiteral("dark-mode")) {
+            if (!isWin101809OrGreater()) {
+                return false;
+            }
+
+            BOOL enable = attribute.toBool();
+
+            if (isWin101903OrGreater()) {
+                apis.pSetPreferredAppMode(enable ? PAM_AUTO : PAM_DEFAULT);
+            } else {
+                apis.pAllowDarkModeForApp(enable);
+            }
+
+            for (const auto attr : {
+                    _DWMWA_USE_IMMERSIVE_DARK_MODE_BEFORE_20H1,
+                    _DWMWA_USE_IMMERSIVE_DARK_MODE,
+            }) {
+                apis.pDwmSetWindowAttribute(hwnd, attr, &enable, sizeof(enable));
+            }
+
+            apis.pFlushMenuThemes();
+
             return true;
         }
         return false;
@@ -1667,7 +1680,6 @@
         Q_UNUSED(message)
         Q_UNUSED(this)
 
-#if QWINDOWKIT_CONFIG(ENABLE_WINDOWS_SYSTEM_BORDER)
         // Windows鏄牴鎹繖涓秷鎭殑杩斿洖鍊兼潵璁剧疆绐楀彛鐨勫鎴峰尯锛堢獥鍙d腑鐪熸鏄剧ず鐨勫唴瀹癸級
         // 鍜岄潪瀹㈡埛鍖猴紙鏍囬鏍忋�佺獥鍙h竟妗嗐�佽彍鍗曟爮鍜岀姸鎬佹爮绛塛indows绯荤粺鑷鎻愪緵鐨勯儴鍒�
         // 锛屼笉杩囧浜嶲t鏉ヨ锛岄櫎浜嗘爣棰樻爮鍜岀獥鍙h竟妗嗭紝闈炲鎴峰尯鍩烘湰涔熼兘鏄嚜缁樼殑锛夌殑鑼�
@@ -1755,6 +1767,7 @@
         // and align it with the upper-left corner of our new client area".
         const auto clientRect = wParam ? &(reinterpret_cast<LPNCCALCSIZE_PARAMS>(lParam))->rgrc[0]
                                        : reinterpret_cast<LPRECT>(lParam);
+#if QWINDOWKIT_CONFIG(ENABLE_WINDOWS_SYSTEM_BORDER)
         if (isWin10OrGreater()) {
             // Store the original top margin before the default window procedure applies the
             // default frame.
@@ -1782,6 +1795,7 @@
             // technique to bring the top border back.
             clientRect->top = originalTop;
         }
+#endif
         const bool max = IsMaximized(hWnd);
         const bool full = isFullScreen(hWnd);
         // We don't need this correction when we're fullscreen. We will
@@ -1875,7 +1889,6 @@
                 }
             }
         }
-#endif
         // We should call this function only before the function returns.
         syncPaintEventWithDwm();
         // By returning WVR_REDRAW we can make the window resizing look

--
Gitblit v1.9.1