libweston-desktop: destroy wl_shell_surface after the wl_surface is destroyed
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. Signed-off-by: Giulio Camuffo <giuliocamuffo@gmail.com> Reviewed-by: Quentin Glidic <sardemff7+git@sardemff7.net>
This commit is contained in:
committed by
Quentin Glidic
parent
2045016d8e
commit
2dae4d0110
@@ -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;
|
||||
};
|
||||
|
||||
static void
|
||||
@@ -185,6 +186,8 @@ weston_desktop_wl_shell_surface_destroy(struct weston_desktop_surface *dsurface,
|
||||
{
|
||||
struct weston_desktop_wl_shell_surface *surface = user_data;
|
||||
|
||||
wl_list_remove(&surface->wl_surface_resource_destroy_listener.link);
|
||||
|
||||
weston_desktop_wl_shell_surface_maybe_ungrab(surface);
|
||||
weston_desktop_surface_unset_relative_to(surface->surface);
|
||||
if (surface->added)
|
||||
@@ -403,6 +406,19 @@ static const struct weston_desktop_surface_implementation weston_desktop_wl_shel
|
||||
.destroy = weston_desktop_wl_shell_surface_destroy,
|
||||
};
|
||||
|
||||
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,
|
||||
@@ -435,6 +451,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,
|
||||
|
||||
Reference in New Issue
Block a user