From e9999fa61ea0ffa602c69e10e54996b3a636a5e6 Mon Sep 17 00:00:00 2001
From: Yuhang Zhao <2546789017@qq.com>
Date: 周五, 09 5月 2025 16:03:45 +0800
Subject: [PATCH] fix window reopen issue (#179)

---
 src/core/contexts/win32windowcontext.cpp |   36 +++++++++++++++++++++++++-----------
 1 files changed, 25 insertions(+), 11 deletions(-)

diff --git a/src/core/contexts/win32windowcontext.cpp b/src/core/contexts/win32windowcontext.cpp
index 3360b9d..e155d3d 100644
--- a/src/core/contexts/win32windowcontext.cpp
+++ b/src/core/contexts/win32windowcontext.cpp
@@ -37,6 +37,14 @@
 #  error Current Qt version has a critical bug which will break QWK functionality. Please upgrade to > 6.6.1 or downgrade to < 6.6.0
 #endif
 
+#ifndef DWM_BB_ENABLE
+#  define DWM_BB_ENABLE 0x00000001
+#endif
+
+#ifndef ABM_GETAUTOHIDEBAREX
+#  define ABM_GETAUTOHIDEBAREX 0x0000000b
+#endif
+
 namespace QWK {
 
     enum IconButtonClickLevelFlag {
@@ -916,19 +924,12 @@
         Q_UNUSED(oldAttribute)
 
         const auto hwnd = reinterpret_cast<HWND>(m_windowId);
-        if (!hwnd) {
-            return false;
-        }
+        Q_ASSERT(hwnd);
 
         const DynamicApis &apis = DynamicApis::instance();
         const auto &extendMargins = [this, &apis, hwnd]() {
-            // For some unknown reason, the window background is totally black when the host object
-            // is a QWidget. And extending the window frame into the client area seems to fix it
-            // magically.
-            // We don't need the following *HACK* for QtQuick windows.
-            if (!m_host->isWidgetType()) {
-                return;
-            }
+            // For some unknown reason, the window background is totally black and extending
+            // the window frame into the client area seems to fix it magically.
             // After many times of trying, we found that the Acrylic/Mica/Mica Alt background
             // only appears on the native Win32 window's background, so naturally we want to
             // extend the window frame into the whole client area to be able to let the special
@@ -957,6 +958,7 @@
 
         const auto &effectBugWorkaround = [this, hwnd]() {
             // We don't need the following *HACK* for QWidget windows.
+            // Completely based on actual experiments, root reason is totally unknown.
             if (m_host->isWidgetType()) {
                 return;
             }
@@ -1907,6 +1909,18 @@
                 break;
             }
 
+            case WM_SHOWWINDOW: {
+                if (!wParam || !isWindowNoState(hWnd) || isFullScreen(hWnd)) {
+                    break;
+                }
+                RECT windowRect{};
+                ::GetWindowRect(hWnd, &windowRect);
+                static constexpr const auto swpFlags = SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED | SWP_NOOWNERZORDER;
+                ::SetWindowPos(hWnd, nullptr, 0, 0, RECT_WIDTH(windowRect) + 1, RECT_HEIGHT(windowRect) + 1, swpFlags);
+                ::SetWindowPos(hWnd, nullptr, 0, 0, RECT_WIDTH(windowRect), RECT_HEIGHT(windowRect), swpFlags);
+                break;
+            }
+
             default:
                 break;
         }
@@ -2327,7 +2341,7 @@
                 if (!mouseHook) {
                     mouseHook = ::SetWindowsHookExW(
                         WH_MOUSE,
-                        [](int nCode, WPARAM wParam, LPARAM lParam) {
+                        [](int nCode, WPARAM wParam, LPARAM lParam) -> LRESULT {
                             if (nCode >= 0) {
                                 switch (wParam) {
                                     case WM_LBUTTONDBLCLK:

--
Gitblit v1.9.1