summaryrefslogtreecommitdiffstats
path: root/meta-agl-core/recipes-graphics/wayland/weston/0002-libweston-desktop-introduce-weston_desktop_client_de.patch
blob: 229c8506a45cfcdc22bc52f7da6dc525ef57657e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
From f53c05d3c2c19c139c52e9bd621c2654dd3dac69 Mon Sep 17 00:00:00 2001
From: Pekka Paalanen <pekka.paalanen@collabora.com>
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 <pekka.paalanen@collabora.com>
---
 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 <wayland-server.h>
+#include <assert.h>
 
 #include <libweston/libweston.h>
 #include <libweston/zalloc.h>
@@ -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