From 564f33e8b29a6f73050f4da3f843b942aaf0d739 Mon Sep 17 00:00:00 2001 From: Sine Striker <trueful@163.com> Date: 周三, 08 5月 2024 19:36:16 +0800 Subject: [PATCH] Improve event filter handling --- src/core/contexts/abstractwindowcontext.cpp | 59 +++++++++++++++++++---------------------------------------- 1 files changed, 19 insertions(+), 40 deletions(-) diff --git a/src/core/contexts/abstractwindowcontext.cpp b/src/core/contexts/abstractwindowcontext.cpp index 3b441c0..71818c2 100644 --- a/src/core/contexts/abstractwindowcontext.cpp +++ b/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) { -- Gitblit v1.9.1