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 = {