From a0bede6ff6a700a6eea9702c49d378f07de22f63 Mon Sep 17 00:00:00 2001
From: Sine Striker <trueful@163.com>
Date: 周三, 06 12月 2023 12:11:37 +0800
Subject: [PATCH] Fix title bar hover bug

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

diff --git a/src/core/contexts/win32windowcontext.cpp b/src/core/contexts/win32windowcontext.cpp
index 605a4ac..8800a7f 100644
--- a/src/core/contexts/win32windowcontext.cpp
+++ b/src/core/contexts/win32windowcontext.cpp
@@ -262,10 +262,10 @@
         const auto margins = [hwnd]() -> QMargins {
             const int titleBarHeight = getTitleBarHeight(hwnd);
             if (isWin10OrGreater()) {
-                return { 0, -titleBarHeight, 0, 0 };
+                return {0, -titleBarHeight, 0, 0};
             } else {
                 const int frameSize = getResizeBorderThickness(hwnd);
-                return { -frameSize, -titleBarHeight, -frameSize, -frameSize };
+                return {-frameSize, -titleBarHeight, -frameSize, -frameSize};
             }
         }();
         const QVariant marginsVar = QVariant::fromValue(margins);
@@ -273,11 +273,13 @@
 #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
         if (QPlatformWindow *platformWindow = window->handle()) {
             if (const auto ni = QGuiApplication::platformNativeInterface()) {
-                ni->setWindowProperty(platformWindow, QStringLiteral("_q_windowsCustomMargins"), marginsVar);
+                ni->setWindowProperty(platformWindow, QStringLiteral("_q_windowsCustomMargins"),
+                                      marginsVar);
             }
         }
 #else
-        if (const auto platformWindow = dynamic_cast<QNativeInterface::Private::QWindowsWindow *>(window->handle())) {
+        if (const auto platformWindow =
+                dynamic_cast<QNativeInterface::Private::QWindowsWindow *>(window->handle())) {
             platformWindow->setCustomMargins(margins);
         }
 #endif
@@ -409,11 +411,14 @@
     public:
         bool nativeEventFilter(const QByteArray &eventType, void *message,
                                QT_NATIVE_EVENT_RESULT_TYPE *result) override {
+            Q_UNUSED(eventType);
+
             // It has been observed that the pointer that Qt gives us is sometimes null on some
             // machines. We need to guard against it in such scenarios.
             if (!result) {
                 return false;
             }
+
             if (lastMessageHandled) {
                 *result = static_cast<QT_NATIVE_EVENT_RESULT_TYPE>(lastMessageResult);
                 return true;
@@ -514,8 +519,11 @@
         // TODO: Determine whether to show system menu
         // ...
 
-        // Since Qt does the necessary processing of the message afterward, we still need to
+        // Since Qt does the necessary processing of the WM_NCCALCSIZE afterward, we still need to
         // continue dispatching it.
+        if (message != WM_NCCALCSIZE && handled) {
+            return result;
+        }
         return ::CallWindowProcW(g_qtWindowProc, hWnd, message, wParam, lParam);
     }
 
@@ -566,7 +574,7 @@
         // Save window handle mapping
         g_wndProcHash->insert(hWnd, this);
 
-        QTimer::singleShot(0, m_windowHandle, [hWnd](){ triggerFrameChange(hWnd); });
+        QTimer::singleShot(0, m_windowHandle, [hWnd]() { triggerFrameChange(hWnd); });
 
         return true;
     }
@@ -760,9 +768,10 @@
                     // actually lost the hover state. So we filter out these superfluous mouse leave
                     // events here to avoid this issue.
                     DWORD dwScreenPos = ::GetMessagePos();
+                    POINT screenPoint{GET_X_LPARAM(dwScreenPos), GET_Y_LPARAM(dwScreenPos)};
+                    ::ScreenToClient(hWnd, &screenPoint);
                     QPoint qtScenePos =
-                        fromNativeLocalPosition(m_windowHandle, QPoint(GET_X_LPARAM(dwScreenPos),
-                                                                       GET_Y_LPARAM(dwScreenPos)));
+                        fromNativeLocalPosition(m_windowHandle, {screenPoint.x, screenPoint.y});
                     auto dummy = CoreWindowAgent::Unknown;
                     if (isInSystemButtons(qtScenePos, &dummy)) {
                         // We must record whether the last WM_MOUSELEAVE was filtered, because if
@@ -1214,7 +1223,7 @@
 
                 bool isFixedSize = m_delegate->isHostSizeFixed(m_host);
                 bool isTitleBar = isInTitleBarDraggableArea(qtScenePos);
-                bool dontOverrideCursor = false;                  // ### TODO
+                bool dontOverrideCursor = false; // ### TODO
 
                 CoreWindowAgent::SystemButton sysButtonType = CoreWindowAgent::Unknown;
                 if (!isFixedSize && isInSystemButtons(qtScenePos, &sysButtonType)) {
@@ -1460,4 +1469,4 @@
         return false;
     }
 
-}
\ No newline at end of file
+}

--
Gitblit v1.9.1