[PATCH v2] xdg-shell: validate positioner object
Jonas Ådahl
jadahl at gmail.com
Wed Nov 16 03:41:15 UTC 2016
On Fri, Sep 23, 2016 at 09:31:23AM +0200, Sjoerd Simons wrote:
> According to the xdg-shell v6 protocol a positioner object is only
> complete if both the size and its anchor rectangle 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>
> Reviewed-by: Jonas Ådahl <jadahl at gmail.com>
Pushed also with Yong's RB and amended with his suggestion:
7da3823..be8a6d3 master -> master
Jonas
> ---
> clients/window.c | 7 +++++--
> libweston-desktop/xdg-shell-v6.c | 9 +++++++++
> 2 files changed, 14 insertions(+), 2 deletions(-)
>
> Changes since v1:
> * Fix nitpicks by jadahl and add hits reviewed-by
>
> diff --git a/clients/window.c b/clients/window.c
> index 216ef96..8af7683 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,9 @@ 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