diff --git a/include/wlr/xwayland/shell.h b/include/wlr/xwayland/shell.h index 91b7c716..75a410e2 100644 --- a/include/wlr/xwayland/shell.h +++ b/include/wlr/xwayland/shell.h @@ -70,4 +70,12 @@ void wlr_xwayland_shell_v1_destroy(struct wlr_xwayland_shell_v1 *shell); void wlr_xwayland_shell_v1_set_client(struct wlr_xwayland_shell_v1 *shell, struct wl_client *client); +/** + * Get a Wayland surface from an xwayland_shell_v1 serial. + * + * Returns NULL if the serial hasn't been associated with any surface. + */ +struct wlr_surface *wlr_xwayland_shell_v1_surface_from_serial( + struct wlr_xwayland_shell_v1 *shell, uint64_t serial); + #endif diff --git a/xwayland/shell.c b/xwayland/shell.c index a6ec315b..e48d6283 100644 --- a/xwayland/shell.c +++ b/xwayland/shell.c @@ -224,3 +224,14 @@ void wlr_xwayland_shell_v1_set_client(struct wlr_xwayland_shell_v1 *shell, wl_list_init(&shell->client_destroy.link); } } + +struct wlr_surface *wlr_xwayland_shell_v1_surface_from_serial( + struct wlr_xwayland_shell_v1 *shell, uint64_t serial) { + struct wlr_xwayland_surface_v1 *xwl_surface; + wl_list_for_each(xwl_surface, &shell->surfaces, link) { + if (xwl_surface->serial == serial) { + return xwl_surface->surface; + } + } + return NULL; +}