From fdf38d4c80d2b789f8e355c51066b695fb08ba75 Mon Sep 17 00:00:00 2001 From: Altair Wei Date: Thu, 7 Oct 2021 20:46:13 +0800 Subject: [PATCH] enable set window later --- src/core/framelesshelper.cpp | 40 ++++++++++++++++++++++++++++++++++-- src/core/framelesshelper.h | 3 ++- 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/src/core/framelesshelper.cpp b/src/core/framelesshelper.cpp index 07355d5..6e579cf 100644 --- a/src/core/framelesshelper.cpp +++ b/src/core/framelesshelper.cpp @@ -43,6 +43,8 @@ FRAMELESSHELPER_BEGIN_NAMESPACE +#define ENSURE_WINDOW(x) if (!m_window) return x + FramelessHelper::FramelessHelper(QWindow *window) : QObject(window) , m_window(window) @@ -51,19 +53,29 @@ FramelessHelper::FramelessHelper(QWindow *window) , m_titleBarHeight(-1) , m_resizeBorderThickness(-1) { - Q_ASSERT(window != nullptr && window->isTopLevel()); - #ifdef Q_OS_MAC if(qEnvironmentVariable("QT_MAC_WANTS_LAYER") != QStringLiteral("1")) qputenv("QT_MAC_WANTS_LAYER", "1"); #endif } +void FramelessHelper::setWindow(QWindow *w) +{ + if (m_window == w) + return; + + Q_ASSERT(w != nullptr && w->isTopLevel()); + + m_window = w; +} + /*! Setup the window, make it frameless. */ void FramelessHelper::install() { + ENSURE_WINDOW((void)0); + if (!QCoreApplication::testAttribute(Qt::AA_DontCreateNativeWidgetSiblings)) { QCoreApplication::setAttribute(Qt::AA_DontCreateNativeWidgetSiblings); } @@ -109,6 +121,8 @@ void FramelessHelper::install() */ void FramelessHelper::uninstall() { + ENSURE_WINDOW((void)0); + m_window->setFlags(m_origWindowFlags); m_origWindowFlags = Qt::WindowFlags(); resizeWindow(QSize()); @@ -143,6 +157,8 @@ void FramelessHelper::resizeWindow(const QSize& windowSize) int FramelessHelper::titleBarHeight() { + ENSURE_WINDOW(0); + if (m_titleBarHeight == -1) { return Utilities::getSystemMetric(m_window, SystemMetric::TitleBarHeight, true, false); } @@ -187,6 +203,8 @@ QRegion FramelessHelper::titleBarRegion() int FramelessHelper::resizeBorderThickness() { + ENSURE_WINDOW(0); + if (m_resizeBorderThickness == -1) { return Utilities::getSystemMetric(m_window, SystemMetric::ResizeBorderThickness, true, false); } @@ -251,6 +269,8 @@ static const int kCornerFactor = 2; */ Qt::WindowFrameSection FramelessHelper::mapPosToFrameSection(const QPoint& pos) { + ENSURE_WINDOW(Qt::NoSection); + int border = 0; // On MacOS we use native resize border. @@ -366,12 +386,16 @@ QCursor FramelessHelper::cursorForFrameSection(Qt::WindowFrameSection frameSecti void FramelessHelper::setCursor(const QCursor& cursor) { + ENSURE_WINDOW((void)0); + m_window->setCursor(cursor); m_cursorChanged = true; } void FramelessHelper::unsetCursor() { + ENSURE_WINDOW((void)0); + if (!m_cursorChanged) return; @@ -381,6 +405,8 @@ void FramelessHelper::unsetCursor() void FramelessHelper::updateCursor() { + ENSURE_WINDOW((void)0); + #ifdef Q_OS_LINUX if (isHoverResizeHandler()) { Utilities::setX11CursorShape(m_window, @@ -414,6 +440,8 @@ void FramelessHelper::updateHoverStates(const QPoint& pos) void FramelessHelper::startMove(const QPoint &globalPos) { + ENSURE_WINDOW((void)0); + #ifdef Q_OS_LINUX // On HiDPI screen, X11 ButtonRelease is likely to trigger // a QEvent::MouseMove, so we reset m_clickedFrameSection in advance. @@ -429,6 +457,8 @@ void FramelessHelper::startMove(const QPoint &globalPos) void FramelessHelper::startResize(const QPoint &globalPos, Qt::WindowFrameSection frameSection) { + ENSURE_WINDOW((void)0); + #ifdef Q_OS_LINUX // On HiDPI screen, X11 ButtonRelease is likely to trigger // a QEvent::MouseMove, so we reset m_clickedFrameSection in advance. @@ -485,6 +515,8 @@ QRect FramelessHelper::getHTVObjectRect(QObject *obj) bool FramelessHelper::eventFilter(QObject *object, QEvent *event) { + ENSURE_WINDOW(false); + bool filterOut = false; if (object == m_window) { @@ -574,6 +606,8 @@ bool FramelessHelper::eventFilter(QObject *object, QEvent *event) void FramelessHelper::handleResizeHandlerDblClicked() { + ENSURE_WINDOW((void)0); + QRect screenRect = m_window->screen()->availableGeometry(); QRect winRect = m_window->geometry(); @@ -640,6 +674,8 @@ bool FramelessHelper::handleNativeEvent(QWindow *window, const QByteArray &event bool FramelessHelper::handleNativeEvent(QWindow *window, const QByteArray &eventType, void *message, long *result) #endif { + ENSURE_WINDOW(false); + if ((eventType != QByteArrayLiteral("windows_generic_MSG")) || !message || !result) { return false; } diff --git a/src/core/framelesshelper.h b/src/core/framelesshelper.h index 0362814..73e6e05 100644 --- a/src/core/framelesshelper.h +++ b/src/core/framelesshelper.h @@ -42,12 +42,13 @@ class FRAMELESSHELPER_API FramelessHelper : public QObject Q_DISABLE_COPY_MOVE(FramelessHelper) public: - explicit FramelessHelper(QWindow *window); + explicit FramelessHelper(QWindow *window = nullptr); ~FramelessHelper() override = default; void install(); void uninstall(); + void setWindow(QWindow *w); QWindow *window() { return m_window; } QSize windowSize() { return m_windowSize; }