diff --git a/include/types/wlr_xdg_shell.h b/include/types/wlr_xdg_shell.h index 34dec2adb..12c392a19 100644 --- a/include/types/wlr_xdg_shell.h +++ b/include/types/wlr_xdg_shell.h @@ -36,4 +36,9 @@ struct wlr_xdg_toplevel_configure *send_xdg_toplevel_configure( void handle_xdg_toplevel_ack_configure(struct wlr_xdg_toplevel *toplevel, struct wlr_xdg_toplevel_configure *configure); +/** + * Returns true if a positioner is complete. + */ +bool wlr_xdg_positioner_is_complete(struct wlr_xdg_positioner *positioner); + #endif diff --git a/types/xdg_shell/wlr_xdg_popup.c b/types/xdg_shell/wlr_xdg_popup.c index 07d8d4c7d..c3bc71945 100644 --- a/types/xdg_shell/wlr_xdg_popup.c +++ b/types/xdg_shell/wlr_xdg_popup.c @@ -323,8 +323,13 @@ static void xdg_popup_handle_reposition( return; } - struct wlr_xdg_positioner *positioner = - wlr_xdg_positioner_from_resource(positioner_resource); + struct wlr_xdg_positioner *positioner = wlr_xdg_positioner_from_resource(positioner_resource); + if (!wlr_xdg_positioner_is_complete(positioner)) { + wl_resource_post_error(popup->base->client->resource, + XDG_WM_BASE_ERROR_INVALID_POSITIONER, "positioner object is not complete"); + return; + } + wlr_xdg_positioner_rules_get_geometry( &positioner->rules, &popup->scheduled.geometry); popup->scheduled.rules = positioner->rules; @@ -367,14 +372,11 @@ static void xdg_popup_handle_resource_destroy(struct wl_resource *resource) { wlr_xdg_popup_destroy(popup); } -void create_xdg_popup(struct wlr_xdg_surface *surface, - struct wlr_xdg_surface *parent, +void create_xdg_popup(struct wlr_xdg_surface *surface, struct wlr_xdg_surface *parent, struct wlr_xdg_positioner *positioner, uint32_t id) { - if (positioner->rules.size.width == 0 || - positioner->rules.anchor_rect.width == 0) { + if (!wlr_xdg_positioner_is_complete(positioner)) { wl_resource_post_error(surface->client->resource, - XDG_WM_BASE_ERROR_INVALID_POSITIONER, - "positioner object is not complete"); + XDG_WM_BASE_ERROR_INVALID_POSITIONER, "positioner object is not complete"); return; } diff --git a/types/xdg_shell/wlr_xdg_positioner.c b/types/xdg_shell/wlr_xdg_positioner.c index 6a991bbac..380c11310 100644 --- a/types/xdg_shell/wlr_xdg_positioner.c +++ b/types/xdg_shell/wlr_xdg_positioner.c @@ -203,6 +203,11 @@ static uint32_t xdg_positioner_gravity_to_wlr_edges( return xdg_positioner_anchor_to_wlr_edges((enum xdg_positioner_anchor)gravity); } +bool wlr_xdg_positioner_is_complete(struct wlr_xdg_positioner *positioner) { + struct wlr_xdg_positioner_rules *rules = &positioner->rules; + return rules->size.width > 0 && rules->anchor_rect.width > 0; +} + void wlr_xdg_positioner_rules_get_geometry( const struct wlr_xdg_positioner_rules *rules, struct wlr_box *box) { box->x = rules->offset.x;