From fd9504f6499968b849d51a717de724a4b7a90408 Mon Sep 17 00:00:00 2001 From: Vlad Zahorodnii Date: Mon, 6 Mar 2023 10:51:28 +0200 Subject: [PATCH] wayland: Fix interactive resize of debug console The internal window doesn't gravitate the geometry during interactive resize so it can produce unexpected results when dragging the top-left window corner. --- src/internalwindow.cpp | 12 ++++++++++-- src/utils/common.cpp | 31 +++++++++++++++++++++++++++++++ src/utils/common.h | 1 + src/xdgshellwindow.cpp | 31 ------------------------------- 4 files changed, 42 insertions(+), 33 deletions(-) diff --git a/src/internalwindow.cpp b/src/internalwindow.cpp index c30828f6fb..e85e9e605c 100644 --- a/src/internalwindow.cpp +++ b/src/internalwindow.cpp @@ -392,8 +392,12 @@ void InternalWindow::present(const std::shared_ptr fbo Q_ASSERT(m_internalImage.isNull()); const QSizeF bufferSize = fbo->size() / bufferScale(); + QRectF geometry(pos(), clientSizeToFrameSize(bufferSize)); + if (isInteractiveResize()) { + geometry = gravitateGeometry(geometry, moveResizeGeometry(), interactiveMoveResizeGravity()); + } - commitGeometry(QRectF(pos(), clientSizeToFrameSize(bufferSize))); + commitGeometry(geometry); markAsMapped(); m_internalFBO = fbo; @@ -407,8 +411,12 @@ void InternalWindow::present(const QImage &image, const QRegion &damage) Q_ASSERT(m_internalFBO == nullptr); const QSize bufferSize = image.size() / bufferScale(); + QRectF geometry(pos(), clientSizeToFrameSize(bufferSize)); + if (isInteractiveResize()) { + geometry = gravitateGeometry(geometry, moveResizeGeometry(), interactiveMoveResizeGravity()); + } - commitGeometry(QRectF(pos(), clientSizeToFrameSize(bufferSize))); + commitGeometry(geometry); markAsMapped(); m_internalImage = image; diff --git a/src/utils/common.cpp b/src/utils/common.cpp index 11c26e8e24..ec64aa4747 100644 --- a/src/utils/common.cpp +++ b/src/utils/common.cpp @@ -242,6 +242,37 @@ QPointF popupOffset(const QRectF &anchorRect, const Qt::Edges anchorEdge, const return anchorPoint + popupPosAdjust; } +QRectF gravitateGeometry(const QRectF &rect, const QRectF &bounds, Gravity gravity) +{ + QRectF geometry = rect; + + switch (gravity) { + case Gravity::TopLeft: + geometry.moveRight(bounds.right()); + geometry.moveBottom(bounds.bottom()); + break; + case Gravity::Top: + case Gravity::TopRight: + geometry.moveLeft(bounds.left()); + geometry.moveBottom(bounds.bottom()); + break; + case Gravity::Right: + case Gravity::BottomRight: + case Gravity::Bottom: + case Gravity::None: + geometry.moveLeft(bounds.left()); + geometry.moveTop(bounds.top()); + break; + case Gravity::BottomLeft: + case Gravity::Left: + geometry.moveRight(bounds.right()); + geometry.moveTop(bounds.top()); + break; + } + + return geometry; +} + } // namespace #ifndef KCMRULES diff --git a/src/utils/common.h b/src/utils/common.h index 131e9d5aba..b1b4d6de25 100644 --- a/src/utils/common.h +++ b/src/utils/common.h @@ -123,6 +123,7 @@ Qt::MouseButtons KWIN_EXPORT x11ToQtMouseButtons(int state); Qt::KeyboardModifiers KWIN_EXPORT x11ToQtKeyboardModifiers(int state); KWIN_EXPORT QPointF popupOffset(const QRectF &anchorRect, const Qt::Edges anchorEdge, const Qt::Edges gravity, const QSizeF popupSize); +KWIN_EXPORT QRectF gravitateGeometry(const QRectF &rect, const QRectF &bounds, Gravity gravity); } // namespace diff --git a/src/xdgshellwindow.cpp b/src/xdgshellwindow.cpp index 4201862997..f8f24f8d12 100644 --- a/src/xdgshellwindow.cpp +++ b/src/xdgshellwindow.cpp @@ -204,37 +204,6 @@ void XdgSurfaceWindow::maybeUpdateMoveResizeGeometry(const QRectF &rect) setMoveResizeGeometry(rect); } -static QRectF gravitateGeometry(const QRectF &rect, const QRectF &bounds, Gravity gravity) -{ - QRectF geometry = rect; - - switch (gravity) { - case Gravity::TopLeft: - geometry.moveRight(bounds.right()); - geometry.moveBottom(bounds.bottom()); - break; - case Gravity::Top: - case Gravity::TopRight: - geometry.moveLeft(bounds.left()); - geometry.moveBottom(bounds.bottom()); - break; - case Gravity::Right: - case Gravity::BottomRight: - case Gravity::Bottom: - case Gravity::None: - geometry.moveLeft(bounds.left()); - geometry.moveTop(bounds.top()); - break; - case Gravity::BottomLeft: - case Gravity::Left: - geometry.moveRight(bounds.right()); - geometry.moveTop(bounds.top()); - break; - } - - return geometry; -} - void XdgSurfaceWindow::handleNextWindowGeometry() { const QRectF boundingGeometry = surface()->boundingRect();