diff options
author | Daniel Stone <daniels@collabora.com> | 2022-07-21 11:07:04 +0100 |
---|---|---|
committer | Daniel Stone <daniels@collabora.com> | 2022-10-20 11:26:22 +0000 |
commit | 51d788de5b5b3443fa1ca71115d16a53281c5ed9 (patch) | |
tree | 8ff51dd8452cbc0d33745bf8c71739c0492eade7 /tests | |
parent | e886b456aba8b502e599b555b27b09e889bc3eb5 (diff) | |
download | wayland-51d788de5b5b3443fa1ca71115d16a53281c5ed9.tar.gz |
wayland-server: Add wl_client_add_destroy_late_listener
A late-destroy listener for a client is called after all the client's
resources have been destroyed and the destroy callbacks emitted. This
lives in parallel to the existing client destroy listener, called
immediately before the client's objects get destroyed.
Signed-off-by: Daniel Stone <daniels@collabora.com>
Fixes: wayland/wayland#207
Diffstat (limited to 'tests')
-rw-r--r-- | tests/client-test.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/tests/client-test.c b/tests/client-test.c index d75e009..01ebc4e 100644 --- a/tests/client-test.c +++ b/tests/client-test.c @@ -41,6 +41,8 @@ struct client_destroy_listener { struct wl_listener listener; bool done; + struct wl_listener late_listener; + bool late_done; }; static void @@ -49,9 +51,20 @@ client_destroy_notify(struct wl_listener *l, void *data) struct client_destroy_listener *listener = wl_container_of(l, listener, listener); + assert(!listener->late_done); listener->done = true; } +static void +client_late_destroy_notify(struct wl_listener *l, void *data) +{ + struct client_destroy_listener *listener = + wl_container_of(l, listener, late_listener); + + assert(listener->done); + listener->late_done = true; +} + TEST(client_destroy_listener) { struct wl_display *display; @@ -67,21 +80,32 @@ TEST(client_destroy_listener) a.listener.notify = client_destroy_notify; a.done = false; + a.late_listener.notify = client_late_destroy_notify; + a.late_done = false; wl_client_add_destroy_listener(client, &a.listener); + wl_client_add_destroy_late_listener(client, &a.late_listener); assert(wl_client_get_destroy_listener(client, client_destroy_notify) == &a.listener); + assert(wl_client_get_destroy_late_listener(client, client_late_destroy_notify) == + &a.late_listener); b.listener.notify = client_destroy_notify; b.done = false; + b.late_listener.notify = client_late_destroy_notify; + b.late_done = false; wl_client_add_destroy_listener(client, &b.listener); + wl_client_add_destroy_late_listener(client, &b.late_listener); wl_list_remove(&a.listener.link); + wl_list_remove(&a.late_listener.link); wl_client_destroy(client); assert(!a.done); + assert(!a.late_done); assert(b.done); + assert(b.late_done); close(s[0]); close(s[1]); |