xdg-shell: validate positioner object
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@collabora.co.uk> Reviewed-by: Jonas Ådahl <jadahl@gmail.com> Reviewed-by: Yong Bakos <ybakos@humanoriented.com>
This commit is contained in:
parent
7da3823ae3
commit
be8a6d3cfb
@ -5487,13 +5487,14 @@ window_create_menu(struct display *display,
|
|||||||
|
|
||||||
static struct zxdg_positioner_v6 *
|
static struct zxdg_positioner_v6 *
|
||||||
create_simple_positioner(struct display *display,
|
create_simple_positioner(struct display *display,
|
||||||
int x, int y)
|
int x, int y, int w, int h)
|
||||||
{
|
{
|
||||||
struct zxdg_positioner_v6 *positioner;
|
struct zxdg_positioner_v6 *positioner;
|
||||||
|
|
||||||
positioner = zxdg_shell_v6_create_positioner(display->xdg_shell);
|
positioner = zxdg_shell_v6_create_positioner(display->xdg_shell);
|
||||||
fail_on_null(positioner, 0, __FILE__, __LINE__);
|
fail_on_null(positioner, 0, __FILE__, __LINE__);
|
||||||
zxdg_positioner_v6_set_anchor_rect(positioner, x, y, 1, 1);
|
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_set_anchor(positioner,
|
||||||
ZXDG_POSITIONER_V6_ANCHOR_TOP |
|
ZXDG_POSITIONER_V6_ANCHOR_TOP |
|
||||||
ZXDG_POSITIONER_V6_ANCHOR_LEFT);
|
ZXDG_POSITIONER_V6_ANCHOR_LEFT);
|
||||||
@ -5545,7 +5546,9 @@ window_show_menu(struct display *display,
|
|||||||
|
|
||||||
positioner = create_simple_positioner(display,
|
positioner = create_simple_positioner(display,
|
||||||
window->x - (ix + parent_geometry.x),
|
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 =
|
window->xdg_popup =
|
||||||
zxdg_surface_v6_get_popup(window->xdg_surface,
|
zxdg_surface_v6_get_popup(window->xdg_surface,
|
||||||
parent->xdg_surface,
|
parent->xdg_surface,
|
||||||
|
@ -931,6 +931,15 @@ weston_desktop_xdg_surface_protocol_get_popup(struct wl_client *wl_client,
|
|||||||
struct weston_desktop_xdg_positioner *positioner =
|
struct weston_desktop_xdg_positioner *positioner =
|
||||||
wl_resource_get_user_data(positioner_resource);
|
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,
|
if (weston_surface_set_role(wsurface, weston_desktop_xdg_popup_role,
|
||||||
resource, ZXDG_SHELL_V6_ERROR_ROLE) < 0)
|
resource, ZXDG_SHELL_V6_ERROR_ROLE) < 0)
|
||||||
return;
|
return;
|
||||||
|
Loading…
Reference in New Issue
Block a user