commit 08b530b
Michael Forney
·
2020-02-20 19:52:19 +0000 UTC
parent fc84dad
xdg_decoration: Add destroy listener for xdg_toplevel This way, if the xdg_toplevel is destroyed, the decoration is destroyed as well. Thanks to Thomas Gardner for the suggestion.
1 files changed,
+30,
-8
+30,
-8
1@@ -27,6 +27,11 @@
2 #include <wayland-server.h>
3 #include "xdg-decoration-unstable-v1-server-protocol.h"
4
5+struct xdg_toplevel_decoration {
6+ struct wl_resource *resource;
7+ struct wl_listener toplevel_destroy_listener;
8+};
9+
10 static void
11 set_mode(struct wl_client *client, struct wl_resource *resource, uint32_t mode)
12 {
13@@ -42,18 +47,35 @@ static const struct zxdg_toplevel_decoration_v1_interface decoration_impl = {
14 .unset_mode = unset_mode,
15 };
16
17+static void
18+handle_toplevel_destroy(struct wl_listener *listener, void *data)
19+{
20+ struct xdg_toplevel_decoration *decoration = wl_container_of(listener, decoration, toplevel_destroy_listener);
21+
22+ wl_resource_destroy(decoration->resource);
23+}
24+
25 static void
26 get_toplevel_decoration(struct wl_client *client, struct wl_resource *resource, uint32_t id, struct wl_resource *toplevel_resource)
27 {
28- struct wl_resource *decoration;
29+ struct xdg_toplevel_decoration *decoration;
30
31- decoration = wl_resource_create(client, &zxdg_toplevel_decoration_v1_interface, wl_resource_get_version(resource), id);
32- if (!decoration) {
33- wl_resource_post_no_memory(resource);
34- return;
35- }
36- wl_resource_set_implementation(decoration, &decoration_impl, NULL, NULL);
37- zxdg_toplevel_decoration_v1_send_configure(decoration, ZXDG_TOPLEVEL_DECORATION_V1_MODE_SERVER_SIDE);
38+ decoration = malloc(sizeof(*decoration));
39+ if (!decoration)
40+ goto error0;
41+ decoration->resource = wl_resource_create(client, &zxdg_toplevel_decoration_v1_interface, wl_resource_get_version(resource), id);
42+ if (!decoration->resource)
43+ goto error1;
44+ decoration->toplevel_destroy_listener.notify = &handle_toplevel_destroy;
45+ wl_resource_add_destroy_listener(decoration->resource, &decoration->toplevel_destroy_listener);
46+ wl_resource_set_implementation(decoration->resource, &decoration_impl, NULL, NULL);
47+ zxdg_toplevel_decoration_v1_send_configure(decoration->resource, ZXDG_TOPLEVEL_DECORATION_V1_MODE_SERVER_SIDE);
48+ return;
49+
50+error1:
51+ free(decoration);
52+error0:
53+ wl_resource_post_no_memory(resource);
54 }
55
56 static const struct zxdg_decoration_manager_v1_interface decoration_manager_impl = {