aboutsummaryrefslogtreecommitdiffstats
path: root/tests/compositor-introspection-test.c
diff options
context:
space:
mode:
authorGiulio Camuffo <giuliocamuffo@gmail.com>2016-08-11 17:23:09 +0200
committerPekka Paalanen <pekka.paalanen@collabora.co.uk>2016-08-12 11:43:02 +0300
commitc55c1d787cb542de5ffee702c7ca9bcd27b56bef (patch)
tree485df5eba37a039b82b5ededcb9be7b1630f1bf0 /tests/compositor-introspection-test.c
parentAdd API to get the list of connected clients (diff)
downloadwayland-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.c81
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);
}