From d905187230c893bd387656278f57c60ffe6f2507 Mon Sep 17 00:00:00 2001
From: Sine Striker <trueful@163.com>
Date: 周三, 27 12月 2023 21:07:42 +0800
Subject: [PATCH] minor tweaks

---
 src/widgets/widgetwindowagent_mac.cpp |   11 +++++++++--
 src/widgets/widgetwindowagent.cpp     |    3 +++
 src/core/windowagentbase.cpp          |   25 ++++++++++++++-----------
 3 files changed, 26 insertions(+), 13 deletions(-)

diff --git a/src/core/windowagentbase.cpp b/src/core/windowagentbase.cpp
index 60ade6a..336f2b7 100644
--- a/src/core/windowagentbase.cpp
+++ b/src/core/windowagentbase.cpp
@@ -27,8 +27,8 @@
         \brief WindowAgentBase is the base class of the specifiy window agent for QtWidgets and
         QtQuick.
 
-        It processes some system events and the implements of frameless logic, and provides some
-        common methods for derived classes to call.
+        It processes some system events to remove the window's default title bar, and provides some
+        shared methods for derived classes to call.
     */
 
     WindowAgentBasePrivate::WindowContextFactoryMethod
@@ -83,17 +83,20 @@
         Available attributes:
 
         On Windows,
-            \li \c acrylic-material: Specify a boolean value to enable or disable acrylic material,
-                    this attribute is only available on Windows 11.
-            \li \c mica: Specify a boolean value to enable or disable mica material,
-                    this attribute is only available on Windows 11.
-            \li \c mica-alt: Specify a boolean value to enable or disable mica-alt material,
-                    this attribute is only available on Windows 11.
+            \li \c dwm-blur: Specify a boolean value to enable or disable dwm blur effect, this
+                   attribute is available on Windows 10 or later.
             \li \c dark-mode: Specify a boolean value to enable or disable the dark mode, it is
-                    enabled by default on Windows 10 if the system borders config is enabled.
+                   enabled by default on Windows 10 if the system borders config is enabled. This
+                   attribute is available on Windows 10 or later.
+            \li \c acrylic-material: Specify a boolean value to enable or disable acrylic material,
+                   this attribute is only available on Windows 11.
+            \li \c mica: Specify a boolean value to enable or disable mica material,
+                   this attribute is only available on Windows 11.
+            \li \c mica-alt: Specify a boolean value to enable or disable mica-alt material,
+                   this attribute is only available on Windows 11.
             \li \c extra-margins: Specify a margin value to change the \c dwm extended area
-                    geometry, you shouldn't change this attribute because it may break the
-                    internal state.
+                   geometry, you shouldn't change this attribute because it may break the
+                   internal state.
 
         On macOS,
             \li \c no-system-buttons: Specify a boolean value to set the system buttons' visibility.
diff --git a/src/widgets/widgetwindowagent.cpp b/src/widgets/widgetwindowagent.cpp
index e2b6db1..d78219f 100644
--- a/src/widgets/widgetwindowagent.cpp
+++ b/src/widgets/widgetwindowagent.cpp
@@ -80,6 +80,9 @@
         if (!d->context->setTitleBar(w)) {
             return;
         }
+#ifdef Q_OS_MAC
+        setSystemButtonArea(nullptr);
+#endif
         Q_EMIT titleBarChanged(w);
     }
 
diff --git a/src/widgets/widgetwindowagent_mac.cpp b/src/widgets/widgetwindowagent_mac.cpp
index 31f45e6..42f8dad 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(), {}), widget->size()};
+    }
+
     class SystemButtonAreaWidgetEventFilter : public QObject {
     public:
         SystemButtonAreaWidgetEventFilter(QWidget *widget, AbstractWindowContext *ctx,
@@ -19,8 +23,7 @@
             switch (event->type()) {
                 case QEvent::Move:
                 case QEvent::Resize: {
-                    QRect rect(widget->mapTo(widget->window(), {}), widget->size());
-                    ctx->setSystemButtonArea(rect);
+                    ctx->setSystemButtonArea(getWidgetSceneRect(widget));
                     break;
                 }
 
@@ -49,6 +52,9 @@
     */
     void WidgetWindowAgent::setSystemButtonArea(QWidget *widget) {
         Q_D(WidgetWindowAgent);
+        if (d->systemButtonAreaWidget == widget)
+            return;
+
         auto ctx = d->context.get();
         d->systemButtonAreaWidget = widget;
         if (!widget) {
@@ -58,6 +64,7 @@
         }
         d->systemButtonAreaWidgetEventFilter =
             std::make_unique<SystemButtonAreaWidgetEventFilter>(widget, ctx);
+        ctx->setSystemButtonArea(getWidgetSceneRect(widget));
     }
 
 }
\ No newline at end of file

--
Gitblit v1.9.1