From d61db440e1c757a656ec2ab91f0c2f39ccd5d5f3 Mon Sep 17 00:00:00 2001
From: Yuhang Zhao <zhaoyuhang@rankyee.com>
Date: 摹曛, 28 12月 2023 15:19:56 +0800
Subject: [PATCH] minor tweaks

---
 src/widgets/widgetwindowagent_mac.cpp |   29 +++++++++++++++++++++++------
 1 files changed, 23 insertions(+), 6 deletions(-)

diff --git a/src/widgets/widgetwindowagent_mac.cpp b/src/widgets/widgetwindowagent_mac.cpp
index d09f7b3..97b6028 100644
--- a/src/widgets/widgetwindowagent_mac.cpp
+++ b/src/widgets/widgetwindowagent_mac.cpp
@@ -4,6 +4,10 @@
 
 namespace QWK {
 
+    static inline QRect getWidgetSceneRect(QWidget *widget) {
+        return {widget->mapTo(widget->window(), QPoint()), widget->size()};
+    }
+
     class SystemButtonAreaWidgetEventFilter : public QObject {
     public:
         SystemButtonAreaWidgetEventFilter(QWidget *widget, AbstractWindowContext *ctx,
@@ -15,17 +19,18 @@
 
     protected:
         bool eventFilter(QObject *obj, QEvent *event) override {
+            Q_UNUSED(obj)
             switch (event->type()) {
                 case QEvent::Move:
                 case QEvent::Resize: {
-                    ctx->setSystemButtonArea(widget->geometry());
+                    ctx->setSystemButtonArea(getWidgetSceneRect(widget));
                     break;
                 }
 
                 default:
                     break;
             }
-            return QObject::eventFilter(obj, event);
+            return false;
         }
 
     protected:
@@ -33,21 +38,33 @@
         AbstractWindowContext *ctx;
     };
 
+    /*!
+        Returns the widget that acts as the system button area.
+    */
     QWidget *WidgetWindowAgent::systemButtonArea() const {
         Q_D(const WidgetWindowAgent);
         return d->systemButtonAreaWidget;
     }
 
+    /*!
+        Sets the widget that acts as the system button area. The system button will be centered in
+        its area, it is recommended to place the widget in a layout and set a fixed size policy.
+    */
     void WidgetWindowAgent::setSystemButtonArea(QWidget *widget) {
         Q_D(WidgetWindowAgent);
+        if (d->systemButtonAreaWidget == widget)
+            return;
+
+        auto ctx = d->context.get();
         d->systemButtonAreaWidget = widget;
         if (!widget) {
-            systemButtonAreaWidgetEventFilter.reset();
-            d->context->setSystemButtonArea({});
+            d->systemButtonAreaWidgetEventFilter.reset();
+            ctx->setSystemButtonArea({});
             return;
         }
-        systemButtonAreaWidgetEventFilter =
-            std::make_unique<SystemButtonAreaWidgetEventFilter>(widget, d->context);
+        d->systemButtonAreaWidgetEventFilter =
+            std::make_unique<SystemButtonAreaWidgetEventFilter>(widget, ctx);
+        ctx->setSystemButtonArea(getWidgetSceneRect(widget));
     }
 
 }
\ No newline at end of file

--
Gitblit v1.9.1