Skip to content

Commit

Permalink
Compositor xdg-shell: Warn when clients supply invalid anchor rects
Browse files Browse the repository at this point in the history
From the protocol: "When the xdg_positioner object is used to position a child
surface, the rectangle may not extend outside the window geometry of the
child's parent surface."

Adds a warning for both v6 and stable when clients do this.

Change-Id: I575a89785f45c080d488be748ec099569b38ea9b
Reviewed-by: Pier Luigi Fiorini <pierluigi.fiorini@liri.io>
  • Loading branch information
Johan Klokkhammer Helsing committed Jan 18, 2019
1 parent eee7be4 commit ca65a26
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 10 deletions.
19 changes: 14 additions & 5 deletions src/compositor/extensions/qwaylandxdgshell.cpp
Expand Up @@ -386,6 +386,7 @@ void QWaylandXdgSurfacePrivate::xdg_surface_get_popup(QtWaylandServer::xdg_surfa
"xdg_surface.get_popup without positioner");
return;
}

if (!positioner->m_data.isComplete()) {
QWaylandXdgPositionerData p = positioner->m_data;
wl_resource_post_error(resource->handle, XDG_WM_BASE_ERROR_INVALID_POSITIONER,
Expand All @@ -394,6 +395,17 @@ void QWaylandXdgSurfacePrivate::xdg_surface_get_popup(QtWaylandServer::xdg_surfa
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, XDG_WM_BASE_ERROR_INVALID_POSITIONER,
// "xdg_positioner 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: xdg_positioner anchor"
<< "rect extends beyond its parent's window geometry";
}

if (!m_surface->setRole(QWaylandXdgPopup::role(), resource->handle, XDG_WM_BASE_ERROR_ROLE))
return;

Expand Down Expand Up @@ -1869,16 +1881,13 @@ QWaylandXdgPopupPrivate::QWaylandXdgPopupPrivate(QWaylandXdgSurface *xdgSurface,
QWaylandXdgPositioner *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";

QWaylandXdgSurfacePrivate::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));
}
Expand Down
19 changes: 14 additions & 5 deletions src/compositor/extensions/qwaylandxdgshellv6.cpp
Expand Up @@ -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,
Expand All @@ -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;

Expand Down Expand Up @@ -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));
}
Expand Down

0 comments on commit ca65a26

Please sign in to comment.