From b5e497e6ff2e9c5fc4d369b36d669aa916edcdc3 Mon Sep 17 00:00:00 2001 From: Yuhang Zhao <2546789017@qq.com> Date: Thu, 5 Nov 2020 18:25:44 +0800 Subject: [PATCH] UNIX: fall back to traditional way. The startSystemMove and startSystemResize may return false on some systems, just fallback to use the old way to move and resize the window. Signed-off-by: Yuhang Zhao <2546789017@qq.com> --- framelesshelper.cpp | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/framelesshelper.cpp b/framelesshelper.cpp index 4a9c829..83588a8 100644 --- a/framelesshelper.cpp +++ b/framelesshelper.cpp @@ -319,6 +319,7 @@ bool FramelessHelper::eventFilter(QObject *object, QEvent *event) { Q_ASSERT(object); Q_ASSERT(event); + QPointF m_pCurMousePos = {}; const auto isWindowTopLevel = [](QObject *window) -> bool { Q_ASSERT(window); if (window->isWindowType()) { @@ -486,21 +487,32 @@ bool FramelessHelper::eventFilter(QObject *object, QEvent *event) return false; }; const auto moveOrResize = - [this, &getWindowEdges, &isResizePermitted, &isInTitlebarArea](const QPointF &globalPoint, - const QPointF &point, - QObject *object) { + [this, + &getWindowEdges, + &isResizePermitted, + &isInTitlebarArea, + &m_pCurMousePos](const QPointF &globalPoint, const QPointF &point, QObject *object) { Q_ASSERT(object); QWindow *window = getWindowHandle(object); if (window) { + const int deltaX = m_pCurMousePos.x() - globalPoint.x(); + const int deltaY = m_pCurMousePos.y() - globalPoint.y(); const Qt::Edges edges = getWindowEdges(point, window->width(), window->height()); if (edges == Qt::Edges{}) { if (isInTitlebarArea(globalPoint, point, object)) { - window->startSystemMove(); + if (!window->startSystemMove()) { + // Fallback to the traditional way. + window->setX(window->x() + deltaX); + window->setY(window->y() + deltaY); + } } } else { if (window->windowStates().testFlag(Qt::WindowState::WindowNoState) && isResizePermitted(globalPoint, point, object) && getResizable(object)) { - window->startSystemResize(edges); + if (!window->startSystemResize(edges)) { + // Fallback to the traditional way. + window->resize(window->width() + deltaX, window->height() + deltaY); + } } } } else { @@ -568,6 +580,7 @@ bool FramelessHelper::eventFilter(QObject *object, QEvent *event) case QEvent::MouseMove: { const auto mouseEvent = static_cast(event); if (mouseEvent) { + m_pCurMousePos = mouseEvent->screenPos(); QWindow *window = getWindowHandle(object); if (window) { if (window->windowStates().testFlag(Qt::WindowState::WindowNoState)