Set size hints for xdg-shell and xdg-shell-v6

Send minimum and maximum size hints to compositors.

[ChangeLog][QPA plugin] Implement minimum and maximum size in
the xdg-shell and xdg-shell-v6 shell integrations.

Change-Id: I631c3348c8333d7a246b21228a92c436f5adb5dc
Reviewed-by: Johan Helsing <johan.helsing@qt.io>
This commit is contained in:
Pier Luigi Fiorini 2019-01-06 19:21:20 +01:00
parent 516c75d5d0
commit 3572bcb831
7 changed files with 82 additions and 1 deletions

View File

@ -46,6 +46,8 @@
#include <QtWaylandClient/private/qwaylandscreen_p.h>
#include <QtWaylandClient/private/qwaylandabstractdecoration_p.h>
#include <QtGui/private/qwindow_p.h>
QT_BEGIN_NAMESPACE
namespace QtWaylandClient {
@ -94,6 +96,9 @@ void QWaylandXdgSurfaceV6::Toplevel::applyConfigure()
QSize windowGeometrySize = m_xdgSurface->m_window->window()->frameGeometry().size();
m_xdgSurface->set_window_geometry(0, 0, windowGeometrySize.width(), windowGeometrySize.height());
m_xdgSurface->setSizeHints();
m_applied = m_pending;
qCDebug(lcQpaWayland) << "Applied pending zxdg_toplevel_v6 configure event:" << m_applied.size << m_applied.states;
}
@ -305,6 +310,31 @@ bool QWaylandXdgSurfaceV6::wantsDecorations() const
return m_toplevel && !(m_toplevel->m_pending.states & Qt::WindowFullScreen);
}
void QWaylandXdgSurfaceV6::propagateSizeHints()
{
setSizeHints();
if (m_toplevel && m_window)
m_window->commit();
}
void QWaylandXdgSurfaceV6::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(0, m_window->windowMaximumSize().width());
if (maxWidth == QWINDOWSIZE_MAX)
maxWidth = 0;
int maxHeight = qMax(0, m_window->windowMaximumSize().height());
if (maxHeight == QWINDOWSIZE_MAX)
maxHeight = 0;
m_toplevel->set_max_size(maxWidth, maxHeight);
}
}
void QWaylandXdgSurfaceV6::requestWindowStates(Qt::WindowStates states)
{
if (m_toplevel)

View File

@ -88,6 +88,9 @@ public:
bool handlesActiveState() const { return m_toplevel; }
void applyConfigure() override;
bool wantsDecorations() const override;
void propagateSizeHints() override;
void setSizeHints();
protected:
void requestWindowStates(Qt::WindowStates states) override;

View File

@ -46,6 +46,8 @@
#include <QtWaylandClient/private/qwaylandscreen_p.h>
#include <QtWaylandClient/private/qwaylandabstractdecoration_p.h>
#include <QtGui/private/qwindow_p.h>
QT_BEGIN_NAMESPACE
namespace QtWaylandClient {
@ -104,6 +106,9 @@ void QWaylandXdgSurface::Toplevel::applyConfigure()
QSize windowGeometrySize = m_xdgSurface->m_window->window()->frameGeometry().size();
m_xdgSurface->set_window_geometry(0, 0, windowGeometrySize.width(), windowGeometrySize.height());
m_xdgSurface->setSizeHints();
m_applied = m_pending;
qCDebug(lcQpaWayland) << "Applied pending xdg_toplevel configure event:" << m_applied.size << m_applied.states;
}
@ -339,6 +344,31 @@ bool QWaylandXdgSurface::wantsDecorations() const
return m_toplevel && m_toplevel->wantsDecorations();
}
void QWaylandXdgSurface::propagateSizeHints()
{
setSizeHints();
if (m_toplevel && m_window)
m_window->commit();
}
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(0, m_window->windowMaximumSize().width());
if (maxWidth == QWINDOWSIZE_MAX)
maxWidth = 0;
int maxHeight = qMax(0, m_window->windowMaximumSize().height());
if (maxHeight == QWINDOWSIZE_MAX)
maxHeight = 0;
m_toplevel->set_max_size(maxWidth, maxHeight);
}
}
void QWaylandXdgSurface::requestWindowStates(Qt::WindowStates states)
{
if (m_toplevel)

View File

@ -92,6 +92,9 @@ public:
bool handlesActiveState() const { return m_toplevel; }
void applyConfigure() override;
bool wantsDecorations() const override;
void propagateSizeHints() override;
void setSizeHints();
protected:
void requestWindowStates(Qt::WindowStates states) override;

View File

@ -97,6 +97,8 @@ public:
virtual void requestWindowStates(Qt::WindowStates states) {Q_UNUSED(states);}
virtual bool wantsDecorations() const { return false; }
virtual void propagateSizeHints() {}
private:
QWaylandWindow *m_window = nullptr;
friend class QWaylandWindow;

View File

@ -605,6 +605,11 @@ void QWaylandWindow::commit(QWaylandBuffer *buffer, const QRegion &damage)
wl_surface::commit();
}
void QWaylandWindow::commit()
{
wl_surface::commit();
}
const wl_callback_listener QWaylandWindow::callbackListener = {
QWaylandWindow::frameCallback
};
@ -1118,6 +1123,12 @@ void QWaylandWindow::addAttachOffset(const QPoint point)
mOffset += point;
}
void QWaylandWindow::propagateSizeHints()
{
if (mShellSurface)
mShellSurface->propagateSizeHints();
}
bool QtWaylandClient::QWaylandWindow::startSystemMove(const QPoint &pos)
{
Q_UNUSED(pos);

View File

@ -120,6 +120,8 @@ public:
void handleExpose(const QRegion &region);
void commit(QWaylandBuffer *buffer, const QRegion &damage);
void commit();
void waitForFrameSync();
QMargins frameMargins() const override;
@ -186,7 +188,7 @@ public:
QWaylandShmBackingStore *backingStore() const { return mBackingStore; }
bool setKeyboardGrabEnabled(bool) override { return false; }
void propagateSizeHints() override { }
void propagateSizeHints() override;
void addAttachOffset(const QPoint point);
bool startSystemMove(const QPoint &pos) override;