6 #include "subcompositor.h"
10 #define COMPOSITOR_VERSION 4
14 struct wl_global *global;
15 struct ds_subcompositor subcompositor;
18 struct wl_signal new_surface;
19 struct wl_signal destroy;
22 struct wl_listener display_destroy;
25 static void compositor_bind(struct wl_client *client, void *data,
26 uint32_t version, uint32_t id);
27 static void compositor_handle_display_destroy(struct wl_listener *listener,
30 WL_EXPORT struct ds_compositor *
31 ds_compositor_create(struct wl_display *display)
33 struct ds_compositor *compositor;
35 compositor = calloc(1, sizeof *compositor);
37 ds_log_errno(DS_ERR, "Could not allocate memory");
41 compositor->global = wl_global_create(display, &wl_compositor_interface,
42 COMPOSITOR_VERSION, compositor, compositor_bind);
43 if (!compositor->global) {
44 ds_log_errno(DS_ERR, "Could not create global");
48 if (!ds_subcompositor_init(&compositor->subcompositor, display)) {
49 ds_err("Could not initialize subcompositor");
53 wl_signal_init(&compositor->events.new_surface);
54 wl_signal_init(&compositor->events.destroy);
56 compositor->display_destroy.notify = compositor_handle_display_destroy;
57 wl_display_add_destroy_listener(display, &compositor->display_destroy);
59 ds_inf("Compositor(%p) created", compositor);
64 wl_global_destroy(compositor->global);
72 ds_compositor_add_new_surface_listener(struct ds_compositor *compositor,
73 struct wl_listener *listener)
75 wl_signal_add(&compositor->events.new_surface, listener);
79 ds_compositor_add_destroy_listener(struct ds_compositor *compositor,
80 struct wl_listener *listener)
82 wl_signal_add(&compositor->events.destroy, listener);
86 compositor_handle_create_surface(struct wl_client *client,
87 struct wl_resource *resource, uint32_t id)
89 struct ds_compositor *compositor;
90 struct ds_surface *surface;
92 compositor = wl_resource_get_user_data(resource);
93 surface = ds_surface_create(client,
94 wl_resource_get_version(resource), id);
96 ds_err("Could not create ds_surface");
100 wl_signal_emit(&compositor->events.new_surface, surface);
104 compositor_handle_create_region(struct wl_client *client,
105 struct wl_resource *resource, uint32_t id)
107 ds_region_add(client, wl_resource_get_version(resource), id);
110 static const struct wl_compositor_interface compositor_impl =
112 .create_surface = compositor_handle_create_surface,
113 .create_region = compositor_handle_create_region,
116 static void compositor_bind(struct wl_client *client, void *data,
117 uint32_t version, uint32_t id)
119 struct ds_compositor *compositor = data;
120 struct wl_resource *resource;
122 resource = wl_resource_create(client, &wl_compositor_interface,
124 if (resource == NULL) {
125 wl_client_post_no_memory(client);
129 wl_resource_set_implementation(resource, &compositor_impl,
134 compositor_handle_display_destroy(struct wl_listener *listener, void *data)
136 struct ds_compositor *compositor;
138 compositor = wl_container_of(listener, compositor, display_destroy);
140 ds_dbg("Destroy compositor(%p)", compositor);
142 wl_signal_emit(&compositor->events.destroy, compositor);
144 wl_list_remove(&compositor->display_destroy.link);
145 ds_subcompositor_finish(&compositor->subcompositor);