7 #include <wayland-server.h>
8 #include <wayland-client.h>
9 #include <libds/compositor.h>
10 #include <libds/surface.h>
11 #include <libds/log.h>
15 struct wl_display *display;
16 struct ds_compositor *compositor;
21 test_server_init(struct server_base *server)
23 server->display = wl_display_create();
24 assert(server->display);
25 server->compositor = ds_compositor_create(server->display);
26 assert(server->compositor);
27 server->socket = wl_display_add_socket_auto(server->display);
28 assert(server->socket);
32 test_server_finish(struct server_base *server)
34 wl_display_destroy(server->display);
39 struct wl_display *display;
40 struct wl_registry *registry;
41 struct wl_compositor *compositor;
42 struct wl_surface *surface;
46 handle_global(void *data, struct wl_registry *registry, uint32_t id,
47 const char *interface, uint32_t version)
49 struct client *client = data;
51 if (strcmp(interface, "wl_compositor") == 0) {
53 wl_registry_bind(registry, id, &wl_compositor_interface, version);
57 static const struct wl_registry_listener registry_listener = {
58 .global = handle_global,
62 test_client_init(struct client *client, const char *name)
64 client->display = wl_display_connect(name);
65 assert(client->display);
66 client->registry = wl_display_get_registry(client->display);
67 assert(client->registry);
69 wl_registry_add_listener(client->registry, ®istry_listener, client);
71 wl_display_roundtrip(client->display);
73 assert(client->compositor);
77 test_client_finish(struct client *client)
79 wl_compositor_destroy(client->compositor);
80 wl_registry_destroy(client->registry);
81 wl_display_disconnect(client->display);
85 struct server_base base;
88 struct wl_listener new_surface;
89 struct wl_listener surface_destroy;
93 cb_surface_destroy(struct wl_listener *listener, void *data)
95 struct test_server *server;
97 server = wl_container_of(listener, server, surface_destroy);
98 server->cb_called = true;
99 wl_display_terminate(server->base.display);
103 cb_new_surface(struct wl_listener *listener, void *data)
105 struct ds_surface *surface = data;
106 struct test_server *server;
108 server = wl_container_of(listener, server, new_surface);
109 server->surface_destroy.notify = cb_surface_destroy;
110 ds_surface_add_destroy_listener(surface, &server->surface_destroy);
114 run_client(const char *name)
116 struct client client;
118 test_client_init(&client, name);
120 struct wl_surface *surface =
121 wl_compositor_create_surface(client.compositor);
123 wl_display_roundtrip(client.display);
125 wl_surface_destroy(surface);
127 test_client_finish(&client);
131 test_surface_create_and_destroy(void)
133 struct test_server server = { .cb_called = false };
136 test_server_init(&server.base);
142 run_client(server.base.socket);
146 server.new_surface.notify = cb_new_surface;
147 ds_compositor_add_new_surface_listener(server.base.compositor,
148 &server.new_surface);
150 wl_display_run(server.base.display);
152 assert(server.cb_called);
154 test_server_finish(&server.base);
160 test_surface_create_and_destroy();