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/qwaylandscreen_p.h>
|
||||||
#include <QtWaylandClient/private/qwaylandabstractdecoration_p.h>
|
#include <QtWaylandClient/private/qwaylandabstractdecoration_p.h>
|
||||||
|
|
||||||
|
#include <QtGui/private/qwindow_p.h>
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
namespace QtWaylandClient {
|
namespace QtWaylandClient {
|
||||||
@ -94,6 +96,9 @@ void QWaylandXdgSurfaceV6::Toplevel::applyConfigure()
|
|||||||
|
|
||||||
QSize windowGeometrySize = m_xdgSurface->m_window->window()->frameGeometry().size();
|
QSize windowGeometrySize = m_xdgSurface->m_window->window()->frameGeometry().size();
|
||||||
m_xdgSurface->set_window_geometry(0, 0, windowGeometrySize.width(), windowGeometrySize.height());
|
m_xdgSurface->set_window_geometry(0, 0, windowGeometrySize.width(), windowGeometrySize.height());
|
||||||
|
|
||||||
|
m_xdgSurface->setSizeHints();
|
||||||
|
|
||||||
m_applied = m_pending;
|
m_applied = m_pending;
|
||||||
qCDebug(lcQpaWayland) << "Applied pending zxdg_toplevel_v6 configure event:" << m_applied.size << m_applied.states;
|
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);
|
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)
|
void QWaylandXdgSurfaceV6::requestWindowStates(Qt::WindowStates states)
|
||||||
{
|
{
|
||||||
if (m_toplevel)
|
if (m_toplevel)
|
||||||
|
@ -88,6 +88,9 @@ public:
|
|||||||
bool handlesActiveState() const { return m_toplevel; }
|
bool handlesActiveState() const { return m_toplevel; }
|
||||||
void applyConfigure() override;
|
void applyConfigure() override;
|
||||||
bool wantsDecorations() const override;
|
bool wantsDecorations() const override;
|
||||||
|
void propagateSizeHints() override;
|
||||||
|
|
||||||
|
void setSizeHints();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void requestWindowStates(Qt::WindowStates states) override;
|
void requestWindowStates(Qt::WindowStates states) override;
|
||||||
|
@ -46,6 +46,8 @@
|
|||||||
#include <QtWaylandClient/private/qwaylandscreen_p.h>
|
#include <QtWaylandClient/private/qwaylandscreen_p.h>
|
||||||
#include <QtWaylandClient/private/qwaylandabstractdecoration_p.h>
|
#include <QtWaylandClient/private/qwaylandabstractdecoration_p.h>
|
||||||
|
|
||||||
|
#include <QtGui/private/qwindow_p.h>
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
namespace QtWaylandClient {
|
namespace QtWaylandClient {
|
||||||
@ -104,6 +106,9 @@ void QWaylandXdgSurface::Toplevel::applyConfigure()
|
|||||||
|
|
||||||
QSize windowGeometrySize = m_xdgSurface->m_window->window()->frameGeometry().size();
|
QSize windowGeometrySize = m_xdgSurface->m_window->window()->frameGeometry().size();
|
||||||
m_xdgSurface->set_window_geometry(0, 0, windowGeometrySize.width(), windowGeometrySize.height());
|
m_xdgSurface->set_window_geometry(0, 0, windowGeometrySize.width(), windowGeometrySize.height());
|
||||||
|
|
||||||
|
m_xdgSurface->setSizeHints();
|
||||||
|
|
||||||
m_applied = m_pending;
|
m_applied = m_pending;
|
||||||
qCDebug(lcQpaWayland) << "Applied pending xdg_toplevel configure event:" << m_applied.size << m_applied.states;
|
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();
|
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)
|
void QWaylandXdgSurface::requestWindowStates(Qt::WindowStates states)
|
||||||
{
|
{
|
||||||
if (m_toplevel)
|
if (m_toplevel)
|
||||||
|
@ -92,6 +92,9 @@ public:
|
|||||||
bool handlesActiveState() const { return m_toplevel; }
|
bool handlesActiveState() const { return m_toplevel; }
|
||||||
void applyConfigure() override;
|
void applyConfigure() override;
|
||||||
bool wantsDecorations() const override;
|
bool wantsDecorations() const override;
|
||||||
|
void propagateSizeHints() override;
|
||||||
|
|
||||||
|
void setSizeHints();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void requestWindowStates(Qt::WindowStates states) override;
|
void requestWindowStates(Qt::WindowStates states) override;
|
||||||
|
@ -97,6 +97,8 @@ public:
|
|||||||
virtual void requestWindowStates(Qt::WindowStates states) {Q_UNUSED(states);}
|
virtual void requestWindowStates(Qt::WindowStates states) {Q_UNUSED(states);}
|
||||||
virtual bool wantsDecorations() const { return false; }
|
virtual bool wantsDecorations() const { return false; }
|
||||||
|
|
||||||
|
virtual void propagateSizeHints() {}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QWaylandWindow *m_window = nullptr;
|
QWaylandWindow *m_window = nullptr;
|
||||||
friend class QWaylandWindow;
|
friend class QWaylandWindow;
|
||||||
|
@ -605,6 +605,11 @@ void QWaylandWindow::commit(QWaylandBuffer *buffer, const QRegion &damage)
|
|||||||
wl_surface::commit();
|
wl_surface::commit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QWaylandWindow::commit()
|
||||||
|
{
|
||||||
|
wl_surface::commit();
|
||||||
|
}
|
||||||
|
|
||||||
const wl_callback_listener QWaylandWindow::callbackListener = {
|
const wl_callback_listener QWaylandWindow::callbackListener = {
|
||||||
QWaylandWindow::frameCallback
|
QWaylandWindow::frameCallback
|
||||||
};
|
};
|
||||||
@ -1118,6 +1123,12 @@ void QWaylandWindow::addAttachOffset(const QPoint point)
|
|||||||
mOffset += point;
|
mOffset += point;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QWaylandWindow::propagateSizeHints()
|
||||||
|
{
|
||||||
|
if (mShellSurface)
|
||||||
|
mShellSurface->propagateSizeHints();
|
||||||
|
}
|
||||||
|
|
||||||
bool QtWaylandClient::QWaylandWindow::startSystemMove(const QPoint &pos)
|
bool QtWaylandClient::QWaylandWindow::startSystemMove(const QPoint &pos)
|
||||||
{
|
{
|
||||||
Q_UNUSED(pos);
|
Q_UNUSED(pos);
|
||||||
|
@ -120,6 +120,8 @@ public:
|
|||||||
void handleExpose(const QRegion ®ion);
|
void handleExpose(const QRegion ®ion);
|
||||||
void commit(QWaylandBuffer *buffer, const QRegion &damage);
|
void commit(QWaylandBuffer *buffer, const QRegion &damage);
|
||||||
|
|
||||||
|
void commit();
|
||||||
|
|
||||||
void waitForFrameSync();
|
void waitForFrameSync();
|
||||||
|
|
||||||
QMargins frameMargins() const override;
|
QMargins frameMargins() const override;
|
||||||
@ -186,7 +188,7 @@ public:
|
|||||||
QWaylandShmBackingStore *backingStore() const { return mBackingStore; }
|
QWaylandShmBackingStore *backingStore() const { return mBackingStore; }
|
||||||
|
|
||||||
bool setKeyboardGrabEnabled(bool) override { return false; }
|
bool setKeyboardGrabEnabled(bool) override { return false; }
|
||||||
void propagateSizeHints() override { }
|
void propagateSizeHints() override;
|
||||||
void addAttachOffset(const QPoint point);
|
void addAttachOffset(const QPoint point);
|
||||||
|
|
||||||
bool startSystemMove(const QPoint &pos) override;
|
bool startSystemMove(const QPoint &pos) override;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user