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
|