xdg-shell: add wlr_xdg_{toplevel,popup}_try_from_wlr_surface()

Convenience helpers for compositors. Saves them the trouble of
manually checking the role (and if they forget to do so, prevents
an invalid cast).
This commit is contained in:
Simon Ser 2023-11-13 10:31:00 +01:00
parent 5de9e1a99d
commit 319e4125ab
3 changed files with 34 additions and 0 deletions

View File

@ -485,6 +485,24 @@ struct wlr_surface *wlr_xdg_surface_popup_surface_at(
*/
struct wlr_xdg_surface *wlr_xdg_surface_try_from_wlr_surface(struct wlr_surface *surface);
/**
* Get a struct wlr_xdg_toplevel from a struct wlr_surface.
*
* Returns NULL if the surface doesn't have the xdg_surface role, the
* xdg_surface is not a toplevel, or the xdg_surface/xdg_toplevel objects have
* been destroyed.
*/
struct wlr_xdg_toplevel *wlr_xdg_toplevel_try_from_wlr_surface(struct wlr_surface *surface);
/**
* Get a struct wlr_xdg_popup from a struct wlr_surface.
*
* Returns NULL if the surface doesn't have the xdg_surface role, the
* xdg_surface is not a popup, or the xdg_surface/xdg_popup objects have
* been destroyed.
*/
struct wlr_xdg_popup *wlr_xdg_popup_try_from_wlr_surface(struct wlr_surface *surface);
/**
* Get the surface geometry.
*

View File

@ -261,6 +261,14 @@ struct wlr_xdg_popup *wlr_xdg_popup_from_resource(
return wl_resource_get_user_data(resource);
}
struct wlr_xdg_popup *wlr_xdg_popup_try_from_wlr_surface(struct wlr_surface *surface) {
struct wlr_xdg_surface *xdg_surface = wlr_xdg_surface_try_from_wlr_surface(surface);
if (xdg_surface == NULL || xdg_surface->role != WLR_XDG_SURFACE_ROLE_POPUP) {
return NULL;
}
return xdg_surface->popup;
}
static void xdg_popup_handle_grab(struct wl_client *client,
struct wl_resource *resource, struct wl_resource *seat_resource,
uint32_t serial) {

View File

@ -158,6 +158,14 @@ struct wlr_xdg_toplevel *wlr_xdg_toplevel_from_resource(
return wl_resource_get_user_data(resource);
}
struct wlr_xdg_toplevel *wlr_xdg_toplevel_try_from_wlr_surface(struct wlr_surface *surface) {
struct wlr_xdg_surface *xdg_surface = wlr_xdg_surface_try_from_wlr_surface(surface);
if (xdg_surface == NULL || xdg_surface->role != WLR_XDG_SURFACE_ROLE_TOPLEVEL) {
return NULL;
}
return xdg_surface->toplevel;
}
static void handle_parent_unmap(struct wl_listener *listener, void *data) {
struct wlr_xdg_toplevel *toplevel =
wl_container_of(listener, toplevel, parent_unmap);