[PATCH] xdg-shell: validate positioner object
Sjoerd Simons
sjoerd.simons at collabora.co.uk
Fri Sep 23 06:58:21 UTC 2016
According to the xdg-shell v6 protocol a positioner object is only
complete if both the size and its anchor are set. Ensure the weston
clients do this and let weston be more strict on checking if a client
has done so.
This also fixes weston-terminal popups not showing up on gnome-shell
3.22.
Signed-off-by: Sjoerd Simons <sjoerd.simons at collabora.co.uk>
---
clients/window.c | 6 ++++--
libweston-desktop/xdg-shell-v6.c | 9 +++++++++
2 files changed, 13 insertions(+), 2 deletions(-)
diff --git a/clients/window.c b/clients/window.c
index 216ef96..31bf236 100644
--- a/clients/window.c
+++ b/clients/window.c
@@ -5409,13 +5409,14 @@ window_create_menu(struct display *display,
static struct zxdg_positioner_v6 *
create_simple_positioner(struct display *display,
- int x, int y)
+ int x, int y, int w, int h)
{
struct zxdg_positioner_v6 *positioner;
positioner = zxdg_shell_v6_create_positioner(display->xdg_shell);
fail_on_null(positioner, 0, __FILE__, __LINE__);
zxdg_positioner_v6_set_anchor_rect(positioner, x, y, 1, 1);
+ zxdg_positioner_v6_set_size(positioner, w, h);
zxdg_positioner_v6_set_anchor(positioner,
ZXDG_POSITIONER_V6_ANCHOR_TOP |
ZXDG_POSITIONER_V6_ANCHOR_LEFT);
@@ -5467,7 +5468,8 @@ window_show_menu(struct display *display,
positioner = create_simple_positioner(display,
window->x - (ix + parent_geometry.x),
- window->y - (iy + parent_geometry.y));
+ window->y - (iy + parent_geometry.y),
+ frame_width(menu->frame), frame_height(menu->frame));
window->xdg_popup =
zxdg_surface_v6_get_popup(window->xdg_surface,
parent->xdg_surface,
diff --git a/libweston-desktop/xdg-shell-v6.c b/libweston-desktop/xdg-shell-v6.c
index 2afce81..359ebaa 100644
--- a/libweston-desktop/xdg-shell-v6.c
+++ b/libweston-desktop/xdg-shell-v6.c
@@ -929,6 +929,15 @@ weston_desktop_xdg_surface_protocol_get_popup(struct wl_client *wl_client,
struct weston_desktop_xdg_positioner *positioner =
wl_resource_get_user_data(positioner_resource);
+ /* Checking whether the size and anchor rect both have a positive size
+ * is enough to verify both have been correctly set */
+ if (positioner->size.width == 0 || positioner->anchor_rect.width == 0) {
+ wl_resource_post_error(resource,
+ ZXDG_SHELL_V6_ERROR_INVALID_POSITIONER,
+ "Positioner object is not complete");
+ return;
+ }
+
if (weston_surface_set_role(wsurface, weston_desktop_xdg_popup_role,
resource, ZXDG_SHELL_V6_ERROR_ROLE) < 0)
return;
--
2.9.3
More information about the wayland-devel
mailing list