From 2d2fc799bc698ebf7e7c8bcc394366d0d7bf071b Mon Sep 17 00:00:00 2001
From: Sine Striker <trueful@163.com>
Date: 周二, 20 2月 2024 18:18:39 +0800
Subject: [PATCH] Partially finish the bug after window close and reshow

---
 src/core/contexts/win32windowcontext.cpp |   92 ++++++++++++++++------------------------------
 1 files changed, 32 insertions(+), 60 deletions(-)

diff --git a/src/core/contexts/win32windowcontext.cpp b/src/core/contexts/win32windowcontext.cpp
index 00d42c1..4a859c7 100644
--- a/src/core/contexts/win32windowcontext.cpp
+++ b/src/core/contexts/win32windowcontext.cpp
@@ -1,3 +1,7 @@
+// Copyright (C) 2023-2024 Stdware Collections (https://www.github.com/stdware)
+// Copyright (C) 2021-2023 wangwenx190 (Yuhang Zhao)
+// SPDX-License-Identifier: Apache-2.0
+
 #include "win32windowcontext_p.h"
 
 #include <optional>
@@ -92,18 +96,6 @@
         monitorInfo.cbSize = sizeof(monitorInfo);
         ::GetMonitorInfoW(monitor, &monitorInfo);
         return monitorInfo;
-    }
-
-    static inline void moveWindowToDesktopCenter(HWND hwnd) {
-        MONITORINFOEXW monitorInfo = getMonitorForWindow(hwnd);
-        RECT windowRect{};
-        ::GetWindowRect(hwnd, &windowRect);
-        const auto newX = monitorInfo.rcMonitor.left +
-                          (RECT_WIDTH(monitorInfo.rcMonitor) - RECT_WIDTH(windowRect)) / 2;
-        const auto newY = monitorInfo.rcMonitor.top +
-                          (RECT_HEIGHT(monitorInfo.rcMonitor) - RECT_HEIGHT(windowRect)) / 2;
-        ::SetWindowPos(hwnd, nullptr, newX, newY, 0, 0,
-                       SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER);
     }
 
     static inline void moveWindowToMonitor(HWND hwnd, const MONITORINFOEXW &activeMonitor) {
@@ -559,14 +551,6 @@
 
     void Win32WindowContext::virtual_hook(int id, void *data) {
         switch (id) {
-            case CentralizeHook: {
-                if (!windowId)
-                    return;
-                const auto hwnd = reinterpret_cast<HWND>(windowId);
-                moveWindowToDesktopCenter(hwnd);
-                return;
-            }
-
             case RaiseWindowHook: {
                 if (!windowId)
                     return;
@@ -602,8 +586,8 @@
                 return;
             }
 
-            case DrawWindows10BorderHook: {
 #if QWINDOWKIT_CONFIG(ENABLE_WINDOWS_SYSTEM_BORDERS)
+            case DrawWindows10BorderHook: {
                 if (!windowId)
                     return;
 
@@ -643,12 +627,10 @@
                     QPoint{m_windowHandle->width(), 0}
                 });
                 painter.restore();
-#endif
                 return;
             }
 
             case DrawWindows10BorderHook2: {
-#if QWINDOWKIT_CONFIG(ENABLE_WINDOWS_SYSTEM_BORDERS)
                 if (!m_windowHandle)
                     return;
 
@@ -669,9 +651,9 @@
                 ::FillRect(hdc, &rcTopBorder,
                            reinterpret_cast<HBRUSH>(::GetStockObject(BLACK_BRUSH)));
                 ::ReleaseDC(hWnd, hdc);
-#endif
                 return;
             }
+#endif
 
             default:
                 break;
@@ -680,24 +662,22 @@
     }
 
     QVariant Win32WindowContext::windowAttribute(const QString &key) const {
-        if (key == QStringLiteral("title-bar-rect")) {
+        if (key == QStringLiteral("window-rect")) {
             if (!m_windowHandle)
                 return {};
 
-            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;
-            }();
+            RECT frame{};
+            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));
+            const DynamicApis &apis = DynamicApis::instance();
+            if (apis.pAdjustWindowRectExForDpi) {
+                apis.pAdjustWindowRectExForDpi(&frame, style, FALSE, exStyle,
+                                               getDpiForWindow(hwnd));
+            } else {
+                ::AdjustWindowRectEx(&frame, style, FALSE, exStyle);
+            }
             return QVariant::fromValue(rect2qrect(frame));
         }
 
@@ -731,17 +711,23 @@
 
         if (!isSystemBorderEnabled()) {
             static auto margins = QVariant::fromValue(QMargins(1, 1, 1, 1));
+
+            // If we remove the system border, the window will lose its shadow. If dwm is enabled,
+            // then we need to set at least 1px margins, otherwise the following operation will
+            // fail with no effect.
             setWindowAttribute(QStringLiteral("extra-margins"), margins);
         }
 
+        // We should disable WS_SYSMENU, otherwise the system button icons will be visible if mica
+        // is enabled and the title bar is transparent.
         {
             auto style = ::GetWindowLongPtrW(hWnd, GWL_STYLE);
-#if QWINDOWKIT_CONFIG(ENABLE_WINDOWS_SYSTEM_BORDERS)
-            ::SetWindowLongPtrW(hWnd, GWL_STYLE, style & (~WS_SYSMENU));
-#else
-            ::SetWindowLongPtrW(hWnd, GWL_STYLE,
-                                (style | WS_THICKFRAME | WS_CAPTION) & (~WS_SYSMENU));
-#endif
+            if (isSystemBorderEnabled()) {
+                ::SetWindowLongPtrW(hWnd, GWL_STYLE, style & (~WS_SYSMENU));
+            } else {
+                ::SetWindowLongPtrW(hWnd, GWL_STYLE,
+                                    (style | WS_THICKFRAME | WS_CAPTION) & (~WS_SYSMENU));
+            }
         }
 
         // Add managed window
@@ -819,8 +805,7 @@
 
         if (key == QStringLiteral("extra-margins")) {
             auto margins = qmargins2margins(attribute.value<QMargins>());
-            apis.pDwmExtendFrameIntoClientArea(hwnd, &margins);
-            return true;
+            return apis.pDwmExtendFrameIntoClientArea(hwnd, &margins) == S_OK;
         }
 
         if (key == QStringLiteral("dark-mode")) {
@@ -1321,19 +1306,6 @@
     bool Win32WindowContext::customWindowHandler(HWND hWnd, UINT message, WPARAM wParam,
                                                  LPARAM lParam, LRESULT *result) {
         switch (message) {
-            case WM_SHOWWINDOW: {
-                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) {
-                        initialCentered = true;
-                        moveWindowToDesktopCenter(hWnd);
-                    }
-                }
-                break;
-            }
-
             case WM_NCHITTEST: {
                 // 鍘熺敓Win32绐楀彛鍙湁椤惰竟鏄湪绐楀彛鍐呴儴resize鐨勶紝鍏朵綑涓夎竟閮芥槸鍦ㄧ獥鍙�
                 // 澶栭儴杩涜resize鐨勶紝鍏跺師鐞嗘槸锛學S_THICKFRAME杩欎釜绐楀彛鏍峰紡浼氬湪绐�

--
Gitblit v1.9.1