The wl_shell_surface spec says that it is destroyed automatically by the server when the wl_surface is destroyed, and indeed it does not have a destroy request. So, do that. ---
v2: remove the destroy listener when the wl_shell_surface is destroyed libweston-desktop/wl-shell.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/libweston-desktop/wl-shell.c b/libweston-desktop/wl-shell.c index 3a81f42..e39be26 100644 --- a/libweston-desktop/wl-shell.c +++ b/libweston-desktop/wl-shell.c @@ -56,6 +56,7 @@ struct weston_desktop_wl_shell_surface { bool added; struct weston_desktop_seat *popup_seat; enum weston_desktop_wl_shell_surface_state state; + struct wl_listener wl_surface_resource_destroy_listener; }; struct wl_shell_client { @@ -207,6 +208,8 @@ weston_desktop_wl_shell_surface_destroy(struct weston_desktop_surface *dsurface, weston_desktop_surface_get_client(dsurface); struct wl_shell_client *wsc = weston_desktop_client_get_user_data(client); + wl_list_remove(&surface->wl_surface_resource_destroy_listener.link); + /* If the surface being destroyed was the one that was pinged before * we need to fake a pong here, because it cannot answer the ping anymore, * even if the client is responsive. */ @@ -432,6 +435,19 @@ static const struct weston_desktop_surface_implementation weston_desktop_wl_shel }; static void +wl_surface_resource_destroyed(struct wl_listener *listener, + void *data) +{ + struct weston_desktop_wl_shell_surface *surface = + wl_container_of(listener, surface, + wl_surface_resource_destroy_listener); + + /* the wl_shell_surface spec says that wl_shell_surfaces are to be + * destroyed automatically when the wl_surface is destroyed. */ + weston_desktop_surface_destroy(surface->surface); +} + +static void weston_desktop_wl_shell_protocol_get_shell_surface(struct wl_client *wl_client, struct wl_resource *resource, uint32_t id, @@ -463,6 +479,11 @@ weston_desktop_wl_shell_protocol_get_shell_surface(struct wl_client *wl_client, return; } + surface->wl_surface_resource_destroy_listener.notify = + wl_surface_resource_destroyed; + wl_resource_add_destroy_listener(wsurface->resource, + &surface->wl_surface_resource_destroy_listener); + surface->resource = weston_desktop_surface_add_resource(surface->surface, &wl_shell_surface_interface, -- 2.10.0 _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/wayland-devel