summaryrefslogtreecommitdiffstats
path: root/src/compositor/extensions/qwaylandxdgshellv6.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/compositor/extensions/qwaylandxdgshellv6.cpp')
-rw-r--r--src/compositor/extensions/qwaylandxdgshellv6.cpp19
1 files changed, 14 insertions, 5 deletions
diff --git a/src/compositor/extensions/qwaylandxdgshellv6.cpp b/src/compositor/extensions/qwaylandxdgshellv6.cpp
index 9aab9b2b8..d69ed6ca9 100644
--- a/src/compositor/extensions/qwaylandxdgshellv6.cpp
+++ b/src/compositor/extensions/qwaylandxdgshellv6.cpp
@@ -391,6 +391,7 @@ void QWaylandXdgSurfaceV6Private::zxdg_surface_v6_get_popup(QtWaylandServer::zxd
"zxdg_surface_v6.get_popup without positioner");
return;
}
+
if (!positioner->m_data.isComplete()) {
QWaylandXdgPositionerV6Data p = positioner->m_data;
wl_resource_post_error(resource->handle, ZXDG_SHELL_V6_ERROR_INVALID_POSITIONER,
@@ -399,6 +400,17 @@ void QWaylandXdgSurfaceV6Private::zxdg_surface_v6_get_popup(QtWaylandServer::zxd
return;
}
+ QRect anchorBounds(QPoint(0, 0), parent->windowGeometry().size());
+ if (!anchorBounds.contains(positioner->m_data.anchorRect)) {
+ // TODO: this is a protocol error and should ideally be handled like this:
+ //wl_resource_post_error(resource->handle, ZXDG_SHELL_V6_ERROR_INVALID_POSITIONER,
+ // "zxdg_positioner_v6 anchor rect extends beyound its parent's window geometry");
+ //return;
+ // However, our own clients currently do this, so we'll settle for a gentle warning instead.
+ qCWarning(qLcWaylandCompositor) << "Ignoring client protocol error: zxdg_positioner_v6 anchor"
+ << "rect extends beyond its parent's window geometry";
+ }
+
if (!m_surface->setRole(QWaylandXdgPopupV6::role(), resource->handle, ZXDG_SHELL_V6_ERROR_ROLE))
return;
@@ -1800,16 +1812,13 @@ QWaylandXdgPopupV6Private::QWaylandXdgPopupV6Private(QWaylandXdgSurfaceV6 *xdgSu
QWaylandXdgPositionerV6 *positioner, const QWaylandResource &resource)
: m_xdgSurface(xdgSurface)
, m_parentXdgSurface(parentXdgSurface)
+ , m_positionerData(positioner->m_data)
{
+ Q_ASSERT(m_positionerData.isComplete());
init(resource.resource());
- m_positionerData = positioner->m_data;
-
- if (!m_positionerData.isComplete())
- qWarning() << "Trying to create xdg popup with incomplete positioner";
QWaylandXdgSurfaceV6Private::get(m_xdgSurface)->setWindowType(Qt::WindowType::Popup);
- //TODO: positioner rect may not extend parent's window geometry, enforce this?
//TODO: Need an API for sending a different initial configure
sendConfigure(QRect(m_positionerData.unconstrainedPosition(), m_positionerData.size));
}