diff options
| author | Giulio Camuffo <giuliocamuffo@gmail.com> | 2016-08-11 17:23:09 +0200 |
|---|---|---|
| committer | Pekka Paalanen <pekka.paalanen@collabora.co.uk> | 2016-08-12 11:43:02 +0300 |
| commit | c55c1d787cb542de5ffee702c7ca9bcd27b56bef (patch) | |
| tree | 485df5eba37a039b82b5ededcb9be7b1630f1bf0 /tests/compositor-introspection-test.c | |
| parent | Add API to get the list of connected clients (diff) | |
| download | wayland-c55c1d787cb542de5ffee702c7ca9bcd27b56bef.tar wayland-c55c1d787cb542de5ffee702c7ca9bcd27b56bef.tar.gz wayland-c55c1d787cb542de5ffee702c7ca9bcd27b56bef.tar.bz2 wayland-c55c1d787cb542de5ffee702c7ca9bcd27b56bef.tar.lz wayland-c55c1d787cb542de5ffee702c7ca9bcd27b56bef.tar.xz wayland-c55c1d787cb542de5ffee702c7ca9bcd27b56bef.tar.zst wayland-c55c1d787cb542de5ffee702c7ca9bcd27b56bef.zip | |
Add a resource creation signal
This change allows to add a resource creation listener to a wl_client,
which will be notified when a new resource is created for that client.
The alternative would be to have a per wl_display listener, but i think
that resources are really client specific objects, so it makes sense
to use the wl_client as the context.
Signed-off-by: Giulio Camuffo <giulio.camuffo@kdab.com>
Reviewed-by: Jonas Ã…dahl <jadahl@gmail.com>
[Pekka: added wl_list_remove() in TEST(new_resource).]
Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
Diffstat (limited to 'tests/compositor-introspection-test.c')
| -rw-r--r-- | tests/compositor-introspection-test.c | 81 |
1 files changed, 72 insertions, 9 deletions
diff --git a/tests/compositor-introspection-test.c b/tests/compositor-introspection-test.c index 50ff1dd..83194ce 100644 --- a/tests/compositor-introspection-test.c +++ b/tests/compositor-introspection-test.c @@ -78,6 +78,29 @@ check_client_list(struct compositor *compositor) assert(compositor->client == client); } +static const char * +setup_compositor(struct compositor *compositor) +{ + const char *socket; + + require_xdg_runtime_dir(); + + compositor->display = wl_display_create(); + socket = wl_display_add_socket_auto(compositor->display); + + compositor->listener.notify = client_created; + wl_display_add_client_created_listener(compositor->display, &compositor->listener); + + return socket; +} + +static void +cleanup_compositor(struct compositor *compositor) +{ + wl_client_destroy(compositor->client); + wl_display_destroy(compositor->display); +} + TEST(new_client_connect) { const char *socket; @@ -86,13 +109,7 @@ TEST(new_client_connect) struct wl_display *display; } client; - require_xdg_runtime_dir(); - - compositor.display = wl_display_create(); - socket = wl_display_add_socket_auto(compositor.display); - - compositor.listener.notify = client_created; - wl_display_add_client_created_listener(compositor.display, &compositor.listener); + socket = setup_compositor(&compositor); client.display = wl_display_connect(socket); @@ -102,8 +119,54 @@ TEST(new_client_connect) check_client_list(&compositor); + + + wl_display_disconnect(client.display); + cleanup_compositor(&compositor); +} + +struct resource_listener { + struct wl_listener listener; + int count; +}; + +static void +resource_created(struct wl_listener *listener, void *data) +{ + struct resource_listener *l; + l = wl_container_of(listener, l, listener); + l->count++; +} + +TEST(new_resource) +{ + const char *socket; + struct compositor compositor = { 0 }; + struct { + struct wl_display *display; + struct wl_callback *cb; + } client; + struct resource_listener resource_listener; + + socket = setup_compositor(&compositor); + client.display = wl_display_connect(socket); + wl_event_loop_dispatch(wl_display_get_event_loop(compositor.display), 100); + + resource_listener.count = 0; + resource_listener.listener.notify = resource_created; + wl_client_add_resource_created_listener(compositor.client, + &resource_listener.listener); + + client.cb = wl_display_sync(client.display); + wl_display_flush(client.display); + wl_event_loop_dispatch(wl_display_get_event_loop(compositor.display), 100); + + assert(resource_listener.count == 1); + + wl_callback_destroy(client.cb); wl_display_disconnect(client.display); + cleanup_compositor(&compositor); - wl_client_destroy(compositor.client); - wl_display_destroy(compositor.display); + /* This is defined to be safe also after client destruction */ + wl_list_remove(&resource_listener.listener.link); } |
