7 #include <wayland-server.h>
8 #include <wayland-client.h>
9 #include <libds/compositor.h>
10 #include <libds/surface.h>
11 #include <libds/subsurface.h>
12 #include <libds/log.h>
16 struct wl_display *display;
17 struct ds_compositor *compositor;
22 test_server_init(struct server_base *server)
24 server->display = wl_display_create();
25 assert(server->display);
26 server->compositor = ds_compositor_create(server->display);
27 assert(server->compositor);
28 server->socket = wl_display_add_socket_auto(server->display);
29 assert(server->socket);
31 return server->socket;
35 test_server_finish(struct server_base *server)
37 wl_display_destroy(server->display);
42 struct wl_display *display;
43 struct wl_registry *registry;
44 struct wl_compositor *compositor;
45 struct wl_subcompositor *subcompositor;
46 struct wl_surface *surface;
47 struct wl_subsurface *subsurface;
51 handle_global(void *data, struct wl_registry *registry, uint32_t id,
52 const char *interface, uint32_t version)
54 struct client *client = data;
56 if (strcmp(interface, "wl_compositor") == 0) {
58 wl_registry_bind(registry, id, &wl_compositor_interface, version);
60 else if (strcmp(interface, "wl_subcompositor") == 0) {
61 client->subcompositor =
62 wl_registry_bind(registry, id, &wl_subcompositor_interface, version);
66 static const struct wl_registry_listener registry_listener = {
67 .global = handle_global,
71 test_client_init(struct client *client, const char *name)
73 client->display = wl_display_connect(name);
74 assert(client->display);
75 client->registry = wl_display_get_registry(client->display);
76 assert(client->registry);
78 wl_registry_add_listener(client->registry, ®istry_listener, client);
80 wl_display_roundtrip(client->display);
82 assert(client->compositor);
83 assert(client->subcompositor);
87 test_client_finish(struct client *client)
89 wl_subcompositor_destroy(client->subcompositor);
90 wl_compositor_destroy(client->compositor);
91 wl_registry_destroy(client->registry);
92 wl_display_disconnect(client->display);
97 struct server_base base;
100 struct wl_listener new_surface;
101 struct wl_listener new_subsurface1;
102 struct wl_listener new_subsurface2;
106 cb_new_subsurface1(struct wl_listener *listener, void *data)
108 struct ds_subsurface *subsurface = data;
109 struct test_server *server;
113 server = wl_container_of(listener, server, new_subsurface1);
114 server->cb_called = true;
115 wl_display_terminate(server->base.display);
119 cb_new_subsurface2(struct wl_listener *listener, void *data)
121 struct ds_subsurface *subsurface = data;
122 struct test_server *server;
126 server = wl_container_of(listener, server, new_subsurface2);
127 server->cb_called = true;
128 wl_display_terminate(server->base.display);
132 cb_new_surface(struct wl_listener *listener, void *data)
134 struct ds_surface *surface = data;
135 struct test_server *server;
137 server = wl_container_of(listener, server, new_surface);
138 if (!server->new_subsurface1.notify) {
139 server->new_subsurface1.notify = cb_new_subsurface1;
140 ds_surface_add_new_subsurface_listener(surface,
141 &server->new_subsurface1);
144 server->new_subsurface2.notify = cb_new_subsurface2;
145 ds_surface_add_new_subsurface_listener(surface,
146 &server->new_subsurface2);
151 run_client(const char *name)
153 struct client client;
155 test_client_init(&client, name);
157 struct wl_surface *surface =
158 wl_compositor_create_surface(client.compositor);
160 struct wl_surface *child_surface =
161 wl_compositor_create_surface(client.compositor);
163 struct wl_subsurface *subsurface =
164 wl_subcompositor_get_subsurface(client.subcompositor,
165 child_surface, surface);
167 wl_display_roundtrip(client.display);
169 wl_subsurface_destroy(subsurface);
170 wl_surface_destroy(child_surface);
171 wl_surface_destroy(surface);
173 test_client_finish(&client);
177 test_subsurface_create(void)
179 struct test_server server = {
180 .new_subsurface1 = { .notify = NULL },
185 const char *socket_name = test_server_init(&server.base);
191 run_client(socket_name);
195 server.new_surface.notify = cb_new_surface;
196 ds_compositor_add_new_surface_listener(server.base.compositor,
197 &server.new_surface);
199 wl_display_run(server.base.display);
201 assert(server.cb_called);
203 test_server_finish(&server.base);
209 test_subsurface_create();