diff --git a/abstract_client.cpp b/abstract_client.cpp --- a/abstract_client.cpp +++ b/abstract_client.cpp @@ -3106,6 +3106,8 @@ /** * Constrains the client size @p size according to a set of the window's size hints. + * + * Default implementation applies only minimum and maximum size constraints. */ QSize AbstractClient::constrainClientSize(const QSize &size, SizeMode mode) const { @@ -3123,6 +3125,12 @@ height = 1; } + const QSize minimumSize = minSize(); + const QSize maximumSize = maxSize(); + + width = qBound(minimumSize.width(), width, maximumSize.width()); + height = qBound(minimumSize.height(), height, maximumSize.height()); + return QSize(width, height); } diff --git a/xdgshellclient.h b/xdgshellclient.h --- a/xdgshellclient.h +++ b/xdgshellclient.h @@ -63,6 +63,8 @@ QStringList activities() const override; QPoint clientContentPos() const override; QSize clientSize() const override; + QSize minSize() const override; + QSize maxSize() const override; QRect transparentRect() const override; NET::WindowType windowType(bool direct = false, int supported_types = 0) const override; void debug(QDebug &stream) const override; diff --git a/xdgshellclient.cpp b/xdgshellclient.cpp --- a/xdgshellclient.cpp +++ b/xdgshellclient.cpp @@ -345,6 +345,22 @@ return m_windowGeometry.size().boundedTo(boundingRect.size()); } +QSize XdgShellClient::minSize() const +{ + if (m_xdgShellToplevel) { + return rules()->checkMinSize(m_xdgShellToplevel->minimumSize()); + } + return QSize(0, 0); +} + +QSize XdgShellClient::maxSize() const +{ + if (m_xdgShellToplevel) { + return rules()->checkMaxSize(m_xdgShellToplevel->maximumSize()); + } + return QSize(INT_MAX, INT_MAX); +} + void XdgShellClient::debug(QDebug &stream) const { stream.nospace();