From 5e1c012c539e74804454d45a1b945093afdb8f4f Mon Sep 17 00:00:00 2001
From: Zhao Yuhang <2546789017@qq.com>
Date: 周日, 09 2月 2025 11:15:59 +0800
Subject: [PATCH] apply some fixes and workarounds

---
 src/widgets/widgetwindowagent_win.cpp |   23 ++++++++++++++++++++---
 1 files changed, 20 insertions(+), 3 deletions(-)

diff --git a/src/widgets/widgetwindowagent_win.cpp b/src/widgets/widgetwindowagent_win.cpp
index 7922cfe..1522cab 100644
--- a/src/widgets/widgetwindowagent_win.cpp
+++ b/src/widgets/widgetwindowagent_win.cpp
@@ -55,8 +55,16 @@
         }
 
         void updateGeometry() override {
-            widget->setContentsMargins(isNormalWindow() ? QMargins(0, borderThickness(), 0, 0)
-                                                        : QMargins());
+            // The window top border is manually painted by QWK so we want to give
+            // some margins to avoid it covering real window contents, however, we
+            // found that there are some rounding issues for the thin border and
+            // thus this small trick doesn't work very well when the DPR is not
+            // integer. So far we haven't found a perfect solution, so just don't
+            // set any margins. In theory the window content will only be covered
+            // by 1px or so, it should not be a serious issue in the real world.
+            //
+            // widget->setContentsMargins(isNormalWindow() ? QMargins(0, borderThickness(), 0, 0)
+            //                                             : QMargins());
         }
 
         bool isWindowActive() const override {
@@ -105,9 +113,18 @@
 
                     // Since a QExposeEvent will be sent immediately after the QResizeEvent, we can
                     // simply ignore it.
+#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
+                    struct ExposeEvent : public QExposeEvent {
+                        inline const QRegion &getRegion() const { return m_region; }
+                    };
+                    auto ee = static_cast<ExposeEvent *>(event);
+                    bool exposeRegionValid = !ee->getRegion().isNull();
+#else
                     auto ee = static_cast<QExposeEvent *>(event);
+                    bool exposeRegionValid = !ee->region().isNull();
+#endif
                     auto window = widget->windowHandle();
-                    if (window->isExposed() && isNormalWindow() && !ee->region().isNull()) {
+                    if (window->isExposed() && isNormalWindow() && exposeRegionValid) {
                         forwardEventToWindowAndDraw(window, event);
                         return true;
                     }

--
Gitblit v1.9.1