From 38700ac4e6864e94a5435b19b803282bac2f6f5b Mon Sep 17 00:00:00 2001
From: Sine Striker <trueful@163.com>
Date: 周日, 17 12月 2023 22:35:17 +0800
Subject: [PATCH] Add TODO encounting a new bug

---
 src/core/contexts/win32windowcontext.cpp |   49 +++++++++++++++++++++++++++++--------------------
 1 files changed, 29 insertions(+), 20 deletions(-)

diff --git a/src/core/contexts/win32windowcontext.cpp b/src/core/contexts/win32windowcontext.cpp
index 161903e..95f6e1a 100644
--- a/src/core/contexts/win32windowcontext.cpp
+++ b/src/core/contexts/win32windowcontext.cpp
@@ -79,16 +79,6 @@
     // Original Qt window proc function
     static WNDPROC g_qtWindowProc = nullptr;
 
-    // ### FIXME FIXME FIXME
-    // ### FIXME: Tell the user to call in the documentation, instead of automatically
-    // calling it directly.
-    // ### FIXME FIXME FIXME
-    static const struct QWK_Hook {
-        QWK_Hook() {
-            qApp->setAttribute(Qt::AA_DontCreateNativeWidgetSiblings);
-        }
-    } g_hook{};
-
     struct DynamicApis {
         static const DynamicApis &instance() {
             static const DynamicApis inst{};
@@ -114,6 +104,7 @@
         DYNAMIC_API_DECLARE(DwmIsCompositionEnabled);
         DYNAMIC_API_DECLARE(DwmGetCompositionTimingInfo);
         DYNAMIC_API_DECLARE(DwmGetWindowAttribute);
+        DYNAMIC_API_DECLARE(DwmSetWindowAttribute);
         DYNAMIC_API_DECLARE(GetDpiForWindow);
         DYNAMIC_API_DECLARE(GetSystemMetricsForDpi);
         DYNAMIC_API_DECLARE(GetDpiForMonitor);
@@ -140,6 +131,7 @@
             DYNAMIC_API_RESOLVE(dwmapi, DwmIsCompositionEnabled);
             DYNAMIC_API_RESOLVE(dwmapi, DwmGetCompositionTimingInfo);
             DYNAMIC_API_RESOLVE(dwmapi, DwmGetWindowAttribute);
+            DYNAMIC_API_RESOLVE(dwmapi, DwmSetWindowAttribute);
 
             QSystemLibrary winmm(QStringLiteral("winmm"));
             DYNAMIC_API_RESOLVE(winmm, timeGetDevCaps);
@@ -428,8 +420,10 @@
         const auto 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;
+        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);
     }
@@ -792,15 +786,21 @@
     void Win32WindowContext::virtual_hook(int id, void *data) {
         switch (id) {
             case CentralizeHook: {
-                const auto hwnd = reinterpret_cast<HWND>(m_windowHandle->winId());
+                const auto hwnd = reinterpret_cast<HWND>(windowId);
                 moveToDesktopCenter(hwnd);
                 return;
             }
 
             case ShowSystemMenuHook: {
                 const auto &pos = *static_cast<const QPoint *>(data);
-                auto hWnd = reinterpret_cast<HWND>(m_windowHandle->winId());
-                showSystemMenu2(hWnd, qpoint2point(pos), false,
+                auto hWnd = reinterpret_cast<HWND>(windowId);
+#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
+                const QPoint nativeGlobalPos =
+                    QHighDpi::toNativeGlobalPosition(pos, m_windowHandle);
+#else
+                const QPoint nativeGlobalPos = QHighDpi::toNativePixels(pos, m_windowHandle);
+#endif
+                showSystemMenu2(hWnd, qpoint2point(nativeGlobalPos), false,
                                 m_delegate->isHostSizeFixed(m_host));
                 return;
             }
@@ -820,7 +820,7 @@
                 auto &painter = *static_cast<QPainter *>(args[0]);
                 const auto &rect = *static_cast<const QRect *>(args[1]);
                 const auto &region = *static_cast<const QRegion *>(args[2]);
-                const auto hwnd = reinterpret_cast<HWND>(m_windowHandle->winId());
+                const auto hwnd = reinterpret_cast<HWND>(windowId);
 
                 QPen pen;
                 pen.setWidth(getWindowFrameBorderThickness(hwnd) * 2);
@@ -875,6 +875,14 @@
         // Install window hook
         auto winId = m_windowHandle->winId();
         auto hWnd = reinterpret_cast<HWND>(winId);
+
+#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));
+        }
+#endif
 
         // Inform Qt we want and have set custom margins
         updateInternalWindowFrameMargins(hWnd, m_windowHandle);
@@ -1157,7 +1165,7 @@
                 const WindowPart currentWindowPart = lastHitTestResult;
                 if (message == WM_NCMOUSEMOVE) {
                     if (currentWindowPart != WindowPart::ChromeButton) {
-                        m_delegate->resetQtGrabbedControl();
+                        m_delegate->resetQtGrabbedControl(m_host);
                         if (mouseLeaveBlocked) {
                             emulateClientAreaMessage(hWnd, message, wParam, lParam,
                                                      WM_NCMOUSELEAVE);
@@ -1219,7 +1227,7 @@
                         // window from client area, which means we will get previous window part as
                         // HTCLIENT if the mouse leaves window from client area and enters window
                         // from non-client area, but it has no bad effect.
-                        m_delegate->resetQtGrabbedControl();
+                        m_delegate->resetQtGrabbedControl(m_host);
                     }
                 }
                 break;
@@ -1544,9 +1552,10 @@
                 // the client area as a whole will shift to the left, which looks very abnormal if
                 // we don't repaint it. This exception disappears if we add SWP_NOCOPYBITS flag.
                 // But I don't know what caused the problem, or why this would solve it.
+                static constexpr const auto kBadWindowPosFlag =
+                    SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED;
                 const auto windowPos = reinterpret_cast<LPWINDOWPOS>(lParam);
-                if (windowPos->flags ==
-                    (SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED)) {
+                if (windowPos->flags == kBadWindowPosFlag) {
                     windowPos->flags |= SWP_NOCOPYBITS;
                 }
                 break;

--
Gitblit v1.9.1