Zhao Yuhang
2024-05-23 6002cd46a2c5a1c2c4afdbf8e491e76f68b9bfd8
src/core/contexts/abstractwindowcontext.cpp
@@ -12,39 +12,6 @@
namespace QWK {
    namespace {
        class WindowEventFilter : public QObject {
        public:
            explicit WindowEventFilter(QWindow *window, AbstractWindowContext *ctx,
                                       QObject *parent = nullptr)
                : QObject(parent), ctx(ctx), window(window) {
                if (window)
                    window->installEventFilter(this);
            }
            inline void setWindow(QWindow *win) {
                if (auto oldWin = window.data(); oldWin) {
                    oldWin->removeEventFilter(this);
                }
                window = win;
                if (win) {
                    win->installEventFilter(this);
                }
            }
        protected:
            bool eventFilter(QObject *obj, QEvent *event) override {
                return ctx->sharedDispatch(obj, event);
            }
        protected:
            AbstractWindowContext *ctx;
            QPointer<QWindow> window;
        };
    }
    AbstractWindowContext::AbstractWindowContext() = default;
    AbstractWindowContext::~AbstractWindowContext() = default;
@@ -56,7 +23,6 @@
        m_host = host;
        m_delegate.reset(delegate);
        m_winIdChangeEventFilter.reset(delegate->createWinIdEventFilter(host, this));
        m_windowEventFilter = std::make_unique<WindowEventFilter>(m_windowHandle, this);
        notifyWinIdChange();
    }
@@ -185,7 +151,7 @@
    void AbstractWindowContext::virtual_hook(int id, void *data) {
        switch (id) {
            case CentralizeHook: {
                if (!m_windowHandle)
                if (!m_windowId)
                    return;
                QRect windowGeometry = m_delegate->getGeometry(m_host);
@@ -199,7 +165,7 @@
            }
            case RaiseWindowHook: {
                if (!m_windowHandle)
                if (!m_windowId)
                    return;
                m_delegate->setWindowVisible(m_host, true);
@@ -238,17 +204,17 @@
        // platform window will be removed, and the WinId will be set to 0. After that, when the
        // QWidget is shown again, the whole things will be recreated again.
        // As a result, we must update our WindowContext each time the WinId changes.
        if (m_windowHandle) {
            removeEventFilter(m_windowHandle);
        }
        m_windowHandle = m_delegate->hostWindow(m_host);
        auto windowEventFilter = static_cast<WindowEventFilter *>(m_windowEventFilter.get());
        windowEventFilter->setWindow(nullptr);
        if (oldWinId != m_windowId) {
            winIdChanged(m_windowId, oldWinId);
        }
        if (m_windowHandle) {
            windowEventFilter->setWindow(m_windowHandle);
            m_windowHandle->installEventFilter(this);
            // Refresh window attributes
            auto attributes = m_windowAttributes;
@@ -259,6 +225,12 @@
                }
                m_windowAttributes.insert(it.key(), it.value());
            }
        }
        // Send to shared dispatchers
        if (oldWinId != m_windowId) {
            QEvent e(QEvent::WinIdChange);
            sharedDispatch(m_host, &e);
        }
    }
@@ -293,6 +265,13 @@
        return true;
    }
    bool AbstractWindowContext::eventFilter(QObject *obj, QEvent *event) {
        if (obj == m_windowHandle && sharedDispatch(obj, event)) {
            return true;
        }
        return QObject::eventFilter(obj, event);
    }
    bool AbstractWindowContext::windowAttributeChanged(const QString &key,
                                                       const QVariant &attribute,
                                                       const QVariant &oldAttribute) {