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:
parent
516c75d5d0
commit
3572bcb831
@ -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)
|
||||
|
@ -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;
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -120,6 +120,8 @@ public:
|
||||
void handleExpose(const QRegion ®ion);
|
||||
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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user