Apply only valid min/max sizes

When setting min/max sizes, the minimum size can be larger
than the maximum size. In that case, the size hint won't be
applied to the geometry.
Setting size hint will be pending until the min/max pair is
valid and the actual geometry will not be changed with
the invalid size hint.

Fixes: QTBUG-113233
Pick-to: 6.5 6.5.1 6.2
Change-Id: Ia05944e8342e7f8d794aee7883e0637a4c711c9d
Reviewed-by: David Edmundson <davidedmundson@kde.org>
This commit is contained in:
Inho Lee 2023-05-09 10:58:13 +02:00
parent a6275b00bd
commit a3c665b65a
2 changed files with 17 additions and 7 deletions

View File

@ -410,14 +410,18 @@ void QWaylandXdgSurface::setSizeHints()
if (m_toplevel && m_window) {
const int minWidth = qMax(0, m_window->windowMinimumSize().width());
const int minHeight = qMax(0, m_window->windowMinimumSize().height());
m_toplevel->set_min_size(minWidth, minHeight);
int maxWidth = qMax(minWidth, m_window->windowMaximumSize().width());
int maxWidth = qMax(0, m_window->windowMaximumSize().width());
int maxHeight = qMax(0, m_window->windowMaximumSize().height());
if (maxWidth == QWINDOWSIZE_MAX)
maxWidth = 0;
int maxHeight = qMax(minHeight, m_window->windowMaximumSize().height());
if (maxHeight == QWINDOWSIZE_MAX)
maxHeight = 0;
// It will not change min/max sizes if invalid.
if (minWidth > maxHeight || minHeight > maxHeight)
return;
m_toplevel->set_min_size(minWidth, minHeight);
m_toplevel->set_max_size(maxWidth, maxHeight);
}
}

View File

@ -394,9 +394,15 @@ void QWaylandWindow::setGeometry_helper(const QRect &rect)
{
QSize minimum = windowMinimumSize();
QSize maximum = windowMaximumSize();
QPlatformWindow::setGeometry(QRect(rect.x(), rect.y(),
qBound(minimum.width(), rect.width(), maximum.width()),
qBound(minimum.height(), rect.height(), maximum.height())));
int width = windowGeometry().width();
int height = windowGeometry().height();
if (minimum.width() <= maximum.width()
&& minimum.height() <= maximum.height()) {
width = qBound(minimum.width(), rect.width(), maximum.width());
height = qBound(minimum.height(), rect.height(), maximum.height());
}
QPlatformWindow::setGeometry(QRect(rect.x(), rect.y(), width, height));
if (mViewport)
updateViewport();