From f53c05d3c2c19c139c52e9bd621c2654dd3dac69 Mon Sep 17 00:00:00 2001 From: Pekka Paalanen Upstream-Status: Backport Date: Fri, 14 May 2021 16:04:45 +0300 Subject: [PATCH] libweston-desktop: introduce weston_desktop_client_destroy() This new function is callable explicitly, unlike the old function that used to have the same name. This will be needed when tearing down what weston_desktop_xwayland_init() puts up. Since calling weston_desktop_client_destroy() for an external client (one that has a wl_resource for this) is a bug, add asserts to prevent it. This will only be needed for the internal client: XWM. Signed-off-by: Pekka Paalanen --- libweston-desktop/client.c | 21 +++++++++++++++++---- libweston-desktop/internal.h | 2 ++ 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/libweston-desktop/client.c b/libweston-desktop/client.c index ba7bfbc46..44718e2db 100644 --- a/libweston-desktop/client.c +++ b/libweston-desktop/client.c @@ -24,6 +24,7 @@ #include "config.h" #include +#include #include #include @@ -48,14 +49,14 @@ weston_desktop_client_add_destroy_listener(struct weston_desktop_client *client, wl_signal_add(&client->destroy_signal, listener); } -static void -weston_desktop_client_handle_destroy(struct wl_resource *resource) +void +weston_desktop_client_destroy(struct weston_desktop_client *client) { - struct weston_desktop_client *client = - wl_resource_get_user_data(resource); struct wl_list *list = &client->surface_list; struct wl_list *link, *tmp; + assert(client->resource == NULL); + wl_signal_emit(&client->destroy_signal, client); for (link = list->next, tmp = link->next; @@ -71,6 +72,18 @@ weston_desktop_client_handle_destroy(struct wl_resource *resource) free(client); } +static void +weston_desktop_client_handle_destroy(struct wl_resource *resource) +{ + struct weston_desktop_client *client = + wl_resource_get_user_data(resource); + + assert(client->resource == resource); + client->resource = NULL; + + weston_desktop_client_destroy(client); +} + static int weston_desktop_client_ping_timeout(void *user_data) { diff --git a/libweston-desktop/internal.h b/libweston-desktop/internal.h index e4ab2701b..7a815bd87 100644 --- a/libweston-desktop/internal.h +++ b/libweston-desktop/internal.h @@ -134,6 +134,8 @@ weston_desktop_client_create(struct weston_desktop *desktop, const struct wl_interface *interface, const void *implementation, uint32_t version, uint32_t id); +void +weston_desktop_client_destroy(struct weston_desktop_client *client); void weston_desktop_client_add_destroy_listener(struct weston_desktop_client *client, -- GitLab