From abae836d3f0a1818e5404936ef298f93221b68fe Mon Sep 17 00:00:00 2001
From: Sine Striker <trueful@163.com>
Date: 周日, 25 2月 2024 00:46:18 +0800
Subject: [PATCH] minor tweaks

---
 src/core/contexts/win32windowcontext.cpp |   35 ++++++++++++++++++++++++++++-------
 1 files changed, 28 insertions(+), 7 deletions(-)

diff --git a/src/core/contexts/win32windowcontext.cpp b/src/core/contexts/win32windowcontext.cpp
index 841273a..4fda1eb 100644
--- a/src/core/contexts/win32windowcontext.cpp
+++ b/src/core/contexts/win32windowcontext.cpp
@@ -6,13 +6,16 @@
 
 #include <optional>
 
+#include <QtCore/QAbstractEventDispatcher>
+#include <QtCore/QDateTime>
 #include <QtCore/QHash>
 #include <QtCore/QScopeGuard>
 #include <QtCore/QTimer>
-#include <QtCore/QDateTime>
 #include <QtGui/QGuiApplication>
 #include <QtGui/QPainter>
 #include <QtGui/QPalette>
+
+#include <QtGui/qpa/qwindowsysteminterface.h>
 
 #include <QtGui/private/qhighdpiscaling_p.h>
 #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
@@ -29,6 +32,14 @@
 
 #include "qwkglobal_p.h"
 #include "qwkwindowsextra_p.h"
+
+// https://github.com/qt/qtbase/blob/6.6.1/src/plugins/platforms/windows/qwindowswindow.cpp#L2791
+// https://github.com/qt/qtbase/blob/6.6.1/src/plugins/platforms/windows/qwindowswindow.cpp#L3321
+// This issue exists only in Qt 6.6.1, and was introduced by QTBUG-113736 patch and fixed by
+// QTBUG-117704 patch.
+#if !QWINDOWKIT_CONFIG(ENABLE_WINDOWS_SYSTEM_BORDERS) && QT_VERSION == QT_VERSION_CHECK(6, 6, 1)
+#  define QTBUG_113736_WORKAROUND
+#endif
 
 namespace QWK {
 
@@ -153,7 +164,7 @@
         [[maybe_unused]] const auto &cleaner =
             qScopeGuard([windowThreadProcessId, currentThreadId]() {
                 ::AttachThreadInput(windowThreadProcessId, currentThreadId, FALSE); //
-            });
+            }); // TODO: Remove it
 
         ::BringWindowToTop(hwnd);
         // Activate the window too. This will force us to the virtual desktop this
@@ -441,9 +452,12 @@
         return false;
     }
 
-    static inline bool forwardFilteredEvents(QWindow *window, HWND hWnd, UINT message,
-                                             WPARAM wParam, LPARAM lParam, LRESULT *result) {
+    static inline bool forwardFilteredEvent(QWindow *window, HWND hWnd, UINT message, WPARAM wParam,
+                                            LPARAM lParam, LRESULT *result) {
         MSG msg = createMessageBlock(hWnd, message, wParam, lParam);
+
+        // https://github.com/qt/qtbase/blob/e26a87f1ecc40bc8c6aa5b889fce67410a57a702/src/plugins/platforms/windows/qwindowscontext.cpp#L1025
+        // Do exact the same as what Qt Windows plugin does.
 
         // Run the native event filters. QTBUG-67095: Exclude input messages which are sent
         // by QEventDispatcherWin32::processEvents()
@@ -590,7 +604,7 @@
             // Forward the event to user-defined native event filters, there may be some messages
             // that need to be processed by the user.
             std::ignore =
-                forwardFilteredEvents(ctx->window(), hWnd, message, wParam, lParam, &result);
+                forwardFilteredEvent(ctx->window(), hWnd, message, wParam, lParam, &result);
             return result;
         }
 
@@ -599,7 +613,8 @@
     }
 
     static inline void addManagedWindow(QWindow *window, HWND hWnd, Win32WindowContext *ctx) {
-        const auto margins = [hWnd]() -> QMargins {
+#ifndef QTBUG_113736_WORKAROUND
+        const auto margins = [](HWND hWnd) -> QMargins {
             const auto titleBarHeight = int(getTitleBarHeight(hWnd));
             if (isSystemBorderEnabled()) {
                 return {0, -titleBarHeight, 0, 0};
@@ -607,10 +622,11 @@
                 const auto frameSize = int(getResizeBorderThickness(hWnd));
                 return {-frameSize, -titleBarHeight, -frameSize, -frameSize};
             }
-        }();
+        }(hWnd);
 
         // Inform Qt we want and have set custom margins
         setInternalWindowFrameMargins(window, margins);
+#endif
 
         // Store original window proc
         if (!g_qtWindowProc) {
@@ -801,6 +817,11 @@
         mouseLeaveBlocked = false;
         lastHitTestResult = WindowPart::Outside;
 
+#ifdef QTBUG_113736_WORKAROUND
+        m_delegate->setWindowFlags(m_host,
+                                   m_delegate->getWindowFlags(m_host) | Qt::FramelessWindowHint);
+#endif
+
         // If the original window id is valid, remove all resources related
         if (oldWinId) {
             removeManagedWindow(reinterpret_cast<HWND>(oldWinId));

--
Gitblit v1.9.1