From 88b5b56b6a67d93208eae3980af2f30da09dd8ae Mon Sep 17 00:00:00 2001 From: SineStriker <trueful@163.com> Date: 周三, 27 12月 2023 01:10:59 +0800 Subject: [PATCH] Add notification observer on Mac --- src/core/contexts/qtwindowcontext.cpp | 61 +++++++++++++++--------------- 1 files changed, 31 insertions(+), 30 deletions(-) diff --git a/src/core/contexts/qtwindowcontext.cpp b/src/core/contexts/qtwindowcontext.cpp index 35fc2d1..bd7b3e1 100644 --- a/src/core/contexts/qtwindowcontext.cpp +++ b/src/core/contexts/qtwindowcontext.cpp @@ -2,6 +2,9 @@ #include <QtCore/QDebug> +#include "qwkglobal_p.h" +#include "systemwindow_p.h" + namespace QWK { static constexpr const quint8 kDefaultResizeBorderThickness = 8; @@ -74,9 +77,9 @@ #endif } - class QtWindowEventFilter : public QObject { + class QtWindowEventFilter : public SharedEventFilter { public: - explicit QtWindowEventFilter(AbstractWindowContext *context, QObject *parent = nullptr); + explicit QtWindowEventFilter(AbstractWindowContext *context); ~QtWindowEventFilter() override; enum WindowStatus { @@ -88,7 +91,7 @@ }; protected: - bool eventFilter(QObject *object, QEvent *event) override; + bool sharedEventFilter(QObject *object, QEvent *event) override; private: AbstractWindowContext *m_context; @@ -96,31 +99,29 @@ WindowStatus m_windowStatus; }; - QtWindowEventFilter::QtWindowEventFilter(AbstractWindowContext *context, QObject *parent) - : QObject(parent), m_context(context), m_cursorShapeChanged(false), m_windowStatus(Idle) { - m_context->window()->installEventFilter(this); + QtWindowEventFilter::QtWindowEventFilter(AbstractWindowContext *context) + : m_context(context), m_cursorShapeChanged(false), m_windowStatus(Idle) { + m_context->installSharedEventFilter(this); } QtWindowEventFilter::~QtWindowEventFilter() = default; - bool QtWindowEventFilter::eventFilter(QObject *obj, QEvent *event) { + bool QtWindowEventFilter::sharedEventFilter(QObject *obj, QEvent *event) { Q_UNUSED(obj) + auto type = event->type(); if (type < QEvent::MouseButtonPress || type > QEvent::MouseMove) { return false; } - QObject *host = m_context->host(); - QWindow *window = m_context->window(); - WindowItemDelegate *delegate = m_context->delegate(); - bool fixedSize = delegate->isHostSizeFixed(host); + auto host = m_context->host(); + auto window = m_context->window(); + auto delegate = m_context->delegate(); auto me = static_cast<const QMouseEvent *>(event); -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) - QPoint scenePos = me->scenePosition().toPoint(); - QPoint globalPos = me->globalPosition().toPoint(); -#else - QPoint scenePos = me->windowPos().toPoint(); - QPoint globalPos = me->screenPos().toPoint(); -#endif + bool fixedSize = delegate->isHostSizeFixed(host); + + QPoint scenePos = getMouseEventScenePos(me); + QPoint globalPos = getMouseEventGlobalPos(me); + bool inTitleBar = m_context->isInTitleBarDraggableArea(scenePos); switch (type) { case QEvent::MouseButtonPress: { @@ -130,7 +131,7 @@ Qt::Edges edges = calculateWindowEdges(window, scenePos); if (edges != Qt::Edges()) { m_windowStatus = Resizing; - window->startSystemResize(edges); + startSystemResize(window, edges); event->accept(); return true; } @@ -143,7 +144,6 @@ event->accept(); return true; } - m_windowStatus = WaitingRelease; break; } case Qt::RightButton: { @@ -153,6 +153,7 @@ default: break; } + m_windowStatus = WaitingRelease; break; } @@ -187,7 +188,7 @@ } case PreparingMove: { m_windowStatus = Moving; - window->startSystemMove(); + startSystemMove(window); event->accept(); return true; } @@ -235,6 +236,7 @@ } QtWindowContext::QtWindowContext() : AbstractWindowContext() { + qtWindowEventFilter = std::make_unique<QtWindowEventFilter>(this); } QtWindowContext::~QtWindowContext() = default; @@ -244,20 +246,19 @@ } void QtWindowContext::virtual_hook(int id, void *data) { - switch (id) { - case ShowSystemMenuHook: - return; - default: - break; - } AbstractWindowContext::virtual_hook(id, data); } - void QtWindowContext::winIdChanged(QWindow *oldWindow) { - Q_UNUSED(oldWindow) + void QtWindowContext::winIdChanged() { + if (!m_windowHandle) { + m_delegate->setWindowFlags(m_host, m_delegate->getWindowFlags(m_host) & + ~Qt::FramelessWindowHint); + return; + } + + // Allocate new resources m_delegate->setWindowFlags(m_host, m_delegate->getWindowFlags(m_host) | Qt::FramelessWindowHint); - qtWindowEventFilter = std::make_unique<QtWindowEventFilter>(this); } } -- Gitblit v1.9.1