From e5370435a9d4297d0ba227f2237d7ed16bba7e82 Mon Sep 17 00:00:00 2001
From: Yuhang Zhao <zhaoyuhang@rankyee.com>
Date: 周三, 27 12月 2023 17:15:52 +0800
Subject: [PATCH] fix some win32 issues

---
 src/core/contexts/win32windowcontext.cpp |   51 +++++++++++++++++++++++++++------------------------
 1 files changed, 27 insertions(+), 24 deletions(-)

diff --git a/src/core/contexts/win32windowcontext.cpp b/src/core/contexts/win32windowcontext.cpp
index 98f47d6..00d42c1 100644
--- a/src/core/contexts/win32windowcontext.cpp
+++ b/src/core/contexts/win32windowcontext.cpp
@@ -9,7 +9,6 @@
 #include <QtGui/QGuiApplication>
 #include <QtGui/QPainter>
 #include <QtGui/QPalette>
-#include <QtGui/QStyleHints>
 
 #include <QtGui/private/qhighdpiscaling_p.h>
 #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
@@ -47,13 +46,13 @@
     static WNDPROC g_qtWindowProc = nullptr;
 
     static inline bool
-#if !QWINDOWKIT_CONFIG(ENABLE_WINDOWS_SYSTEM_BORDER)
+#if !QWINDOWKIT_CONFIG(ENABLE_WINDOWS_SYSTEM_BORDERS)
         constexpr
 #endif
 
         isSystemBorderEnabled() {
         return
-#if QWINDOWKIT_CONFIG(ENABLE_WINDOWS_SYSTEM_BORDER)
+#if QWINDOWKIT_CONFIG(ENABLE_WINDOWS_SYSTEM_BORDERS)
             isWin10OrGreater()
 #else
             false
@@ -402,8 +401,8 @@
             return false;
         }
 
-        static WindowsNativeEventFilter *instance;
-        static Win32WindowContext *lastMessageContext;
+        static inline WindowsNativeEventFilter *instance = nullptr;
+        static inline Win32WindowContext *lastMessageContext = nullptr;
 
         static inline void install() {
             if (instance) {
@@ -420,9 +419,6 @@
             instance = nullptr;
         }
     };
-
-    WindowsNativeEventFilter *WindowsNativeEventFilter::instance = nullptr;
-    Win32WindowContext *WindowsNativeEventFilter::lastMessageContext = nullptr;
 
     // https://github.com/qt/qtbase/blob/e26a87f1ecc40bc8c6aa5b889fce67410a57a702/src/plugins/platforms/windows/qwindowscontext.cpp#L1025
     // We can see from the source code that Qt will filter out some messages first and then send the
@@ -574,6 +570,7 @@
             case RaiseWindowHook: {
                 if (!windowId)
                     return;
+                m_delegate->setWindowVisible(m_host, true);
                 const auto hwnd = reinterpret_cast<HWND>(windowId);
                 bringWindowToFront(hwnd);
                 return;
@@ -606,7 +603,7 @@
             }
 
             case DrawWindows10BorderHook: {
-#if QWINDOWKIT_CONFIG(ENABLE_WINDOWS_SYSTEM_BORDER)
+#if QWINDOWKIT_CONFIG(ENABLE_WINDOWS_SYSTEM_BORDERS)
                 if (!windowId)
                     return;
 
@@ -651,7 +648,7 @@
             }
 
             case DrawWindows10BorderHook2: {
-#if QWINDOWKIT_CONFIG(ENABLE_WINDOWS_SYSTEM_BORDER)
+#if QWINDOWKIT_CONFIG(ENABLE_WINDOWS_SYSTEM_BORDERS)
                 if (!m_windowHandle)
                     return;
 
@@ -687,10 +684,20 @@
             if (!m_windowHandle)
                 return {};
 
-            auto hwnd = reinterpret_cast<HWND>(windowId);
-            RECT frame{};
-            ::AdjustWindowRectExForDpi(&frame, ::GetWindowLongPtrW(hwnd, GWL_STYLE), FALSE, 0,
-                                       getDpiForWindow(hwnd));
+            auto frame = [this]() -> RECT {
+                auto hwnd = reinterpret_cast<HWND>(windowId);
+                // According to MSDN, WS_OVERLAPPED is not allowed for AdjustWindowRect.
+                auto style = static_cast<DWORD>(::GetWindowLongPtrW(hwnd, GWL_STYLE) & ~WS_OVERLAPPED);
+                auto exStyle = static_cast<DWORD>(::GetWindowLongPtrW(hwnd, GWL_EXSTYLE));
+                RECT result{};
+                const DynamicApis &apis = DynamicApis::instance();
+                if (apis.pAdjustWindowRectExForDpi) {
+                    apis.pAdjustWindowRectExForDpi(&result, style, FALSE, exStyle, getDpiForWindow(hwnd));
+                } else {
+                    ::AdjustWindowRectEx(&result, style, FALSE, exStyle);
+                }
+                return result;
+            }();
             return QVariant::fromValue(rect2qrect(frame));
         }
 
@@ -729,7 +736,7 @@
 
         {
             auto style = ::GetWindowLongPtrW(hWnd, GWL_STYLE);
-#if QWINDOWKIT_CONFIG(ENABLE_WINDOWS_SYSTEM_BORDER)
+#if QWINDOWKIT_CONFIG(ENABLE_WINDOWS_SYSTEM_BORDERS)
             ::SetWindowLongPtrW(hWnd, GWL_STYLE, style & (~WS_SYSMENU));
 #else
             ::SetWindowLongPtrW(hWnd, GWL_STYLE,
@@ -812,7 +819,7 @@
 
         if (key == QStringLiteral("extra-margins")) {
             auto margins = qmargins2margins(attribute.value<QMargins>());
-            DynamicApis::instance().pDwmExtendFrameIntoClientArea(hwnd, &margins);
+            apis.pDwmExtendFrameIntoClientArea(hwnd, &margins);
             return true;
         }
 
@@ -943,12 +950,9 @@
         }
 
         if (key == QStringLiteral("dwm-blur")) {
-            // TODO: Optimize
-            // Currently not available!!!
             if (attribute.toBool()) {
-                // We need to extend the window frame into the whole client area to be able
-                // to see the blurred window background.
-                apis.pDwmExtendFrameIntoClientArea(hwnd, &extendedMargins);
+                // We can't extend the window frame for this effect.
+                restoreMargins();
                 if (isWin8OrGreater()) {
                     ACCENT_POLICY policy{};
                     policy.dwAccentState = ACCENT_ENABLE_BLURBEHIND;
@@ -980,7 +984,6 @@
                     bb.dwFlags = DWM_BB_ENABLE;
                     apis.pDwmEnableBlurBehindWindow(hwnd, &bb);
                 }
-                restoreMargins();
             }
             return true;
         }
@@ -1319,12 +1322,12 @@
                                                  LPARAM lParam, LRESULT *result) {
         switch (message) {
             case WM_SHOWWINDOW: {
-                if (!centered) {
+                if (!initialCentered) {
                     // If wParam is TRUE, the window is being shown.
                     // If lParam is zero, the message was sent because of a call to the ShowWindow
                     // function.
                     if (wParam && !lParam) {
-                        centered = true;
+                        initialCentered = true;
                         moveWindowToDesktopCenter(hWnd);
                     }
                 }

--
Gitblit v1.9.1