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.
This commit is contained in:
Vlad Zahorodnii 2023-03-06 10:51:28 +02:00
parent fdbfd2fd5a
commit fd9504f649
4 changed files with 42 additions and 33 deletions

View file

@ -392,8 +392,12 @@ void InternalWindow::present(const std::shared_ptr<QOpenGLFramebufferObject> 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;

View file

@ -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

View file

@ -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

View file

@ -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();