From 921dbf5719c9b734fbd26d7b6300e29c943093f3 Mon Sep 17 00:00:00 2001
From: SineStriker <55847490+SineStriker@users.noreply.github.com>
Date: 周二, 11 3月 2025 19:54:51 +0800
Subject: [PATCH] update

---
 src/core/contexts/abstractwindowcontext.cpp |   66 +++++---------------------------
 src/core/contexts/abstractwindowcontext_p.h |   13 ++----
 src/core/contexts/win32windowcontext.cpp    |    2 
 3 files changed, 16 insertions(+), 65 deletions(-)

diff --git a/src/core/contexts/abstractwindowcontext.cpp b/src/core/contexts/abstractwindowcontext.cpp
index beea180..2d89ae1 100644
--- a/src/core/contexts/abstractwindowcontext.cpp
+++ b/src/core/contexts/abstractwindowcontext.cpp
@@ -32,21 +32,16 @@
             return false;
         }
 
-        auto it = m_hitTestVisibleItems.find(obj);
         if (visible) {
-            if (it != m_hitTestVisibleItems.end()) {
-                return true;
-            }
-            connect(obj, &QObject::destroyed, this,
-                    &AbstractWindowContext::_q_hitTestVisibleItemDestroyed);
-            m_hitTestVisibleItems.insert(obj);
+            m_hitTestVisibleItems.removeAll(nullptr);
+            m_hitTestVisibleItems.removeAll(obj);
+            m_hitTestVisibleItems.append(obj);
         } else {
-            if (it == m_hitTestVisibleItems.end()) {
-                return false;
+            for (auto &item : m_hitTestVisibleItems) {
+                if (item == obj) {
+                    item = nullptr;
+                }
             }
-            disconnect(obj, &QObject::destroyed, this,
-                       &AbstractWindowContext::_q_hitTestVisibleItemDestroyed);
-            m_hitTestVisibleItems.erase(it);
         }
         return true;
     }
@@ -60,16 +55,7 @@
 
         auto org = m_systemButtons[button];
         if (org == obj) {
-            return true;
-        }
-
-        if (org) {
-            disconnect(org, &QObject::destroyed, this,
-                       &AbstractWindowContext::_q_systemButtonDestroyed);
-        }
-        if (obj) {
-            connect(obj, &QObject::destroyed, this,
-                    &AbstractWindowContext::_q_systemButtonDestroyed);
+            return false;
         }
         m_systemButtons[button] = obj;
         return true;
@@ -85,11 +71,6 @@
         if (org) {
             // Since the title bar is changed, all items inside it should be dereferenced right away
             removeSystemButtonsAndHitTestItems();
-            disconnect(org, &QObject::destroyed, this,
-                       &AbstractWindowContext::_q_titleBarDistroyed);
-        }
-        if (item) {
-            connect(item, &QObject::destroyed, this, &AbstractWindowContext::_q_titleBarDistroyed);
         }
         m_titleBar = item;
         return true;
@@ -150,13 +131,12 @@
             }
         }
 
-        for (auto widget : m_hitTestVisibleItems) {
-            if (widget && m_delegate->isVisible(widget) && m_delegate->isEnabled(widget) &&
-                m_delegate->mapGeometryToScene(widget).contains(pos)) {
+        for (auto item : m_hitTestVisibleItems) {
+            if (item && m_delegate->isVisible(item) && m_delegate->isEnabled(item) &&
+                m_delegate->mapGeometryToScene(item).contains(pos)) {
                 return false;
             }
         }
-
         return true;
     }
 
@@ -315,33 +295,9 @@
             if (!button) {
                 continue;
             }
-            disconnect(button, &QObject::destroyed, this,
-                       &AbstractWindowContext::_q_systemButtonDestroyed);
             button = nullptr;
         }
-        for (auto &item : m_hitTestVisibleItems) {
-            disconnect(item, &QObject::destroyed, this,
-                       &AbstractWindowContext::_q_hitTestVisibleItemDestroyed);
-        }
         m_hitTestVisibleItems.clear();
-    }
-
-    void AbstractWindowContext::_q_titleBarDistroyed(QObject *obj) {
-        Q_UNUSED(obj)
-        removeSystemButtonsAndHitTestItems();
-        m_titleBar = nullptr;
-    }
-
-    void AbstractWindowContext::_q_hitTestVisibleItemDestroyed(QObject *obj) {
-        m_hitTestVisibleItems.remove(obj);
-    }
-
-    void AbstractWindowContext::_q_systemButtonDestroyed(QObject *obj) {
-        for (auto &item : m_systemButtons) {
-            if (item == obj) {
-                item = nullptr;
-            }
-        }
     }
 
 }
diff --git a/src/core/contexts/abstractwindowcontext_p.h b/src/core/contexts/abstractwindowcontext_p.h
index e978cb4..dc18f37 100644
--- a/src/core/contexts/abstractwindowcontext_p.h
+++ b/src/core/contexts/abstractwindowcontext_p.h
@@ -116,13 +116,13 @@
         QPointer<QWindow> m_windowHandle;
         WId m_windowId{};
 
-        QSet<const QObject *> m_hitTestVisibleItems;
+        QVector<QPointer<QObject>> m_hitTestVisibleItems;
 #ifdef Q_OS_MAC
         ScreenRectCallback m_systemButtonAreaCallback;
 #endif
 
-        QObject *m_titleBar{};
-        std::array<QObject *, WindowAgentBase::Close + 1> m_systemButtons{};
+        QPointer<QObject> m_titleBar{};
+        std::array<QPointer<QObject>, WindowAgentBase::Close + 1> m_systemButtons{};
 
         std::list<std::pair<QString, QVariant>> m_windowAttributesOrder;
         QHash<QString, decltype(m_windowAttributesOrder)::iterator> m_windowAttributes;
@@ -130,11 +130,6 @@
         std::unique_ptr<WinIdChangeEventFilter> m_winIdChangeEventFilter;
 
         void removeSystemButtonsAndHitTestItems();
-
-    private:
-        void _q_titleBarDistroyed(QObject *obj);
-        void _q_hitTestVisibleItemDestroyed(QObject *obj);
-        void _q_systemButtonDestroyed(QObject *obj);
     };
 
     inline QObject *AbstractWindowContext::host() const {
@@ -154,7 +149,7 @@
     }
 
     inline bool AbstractWindowContext::isHitTestVisible(const QObject *obj) const {
-        return m_hitTestVisibleItems.contains(obj);
+        return m_hitTestVisibleItems.contains(const_cast<QObject *>(obj));
     }
 
     inline QObject *
diff --git a/src/core/contexts/win32windowcontext.cpp b/src/core/contexts/win32windowcontext.cpp
index 7dd6b0c..fa2b53f 100644
--- a/src/core/contexts/win32windowcontext.cpp
+++ b/src/core/contexts/win32windowcontext.cpp
@@ -2329,7 +2329,7 @@
                 if (!mouseHook) {
                     mouseHook = ::SetWindowsHookExW(
                         WH_MOUSE,
-                        [](int nCode, WPARAM wParam, LPARAM lParam) {
+                        [](int nCode, WPARAM wParam, LPARAM lParam) -> LRESULT WINAPI {
                             if (nCode >= 0) {
                                 switch (wParam) {
                                     case WM_LBUTTONDBLCLK:

--
Gitblit v1.9.1