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:
parent
fdbfd2fd5a
commit
fd9504f649
4 changed files with 42 additions and 33 deletions
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in a new issue