#define SUBCOMPOSITOR_VERSION 1
+struct ds_subcompositor
+{
+ struct wl_global *global;
+
+ struct wl_listener display_destroy;
+
+ struct {
+ struct wl_signal destroy;
+ } events;
+};
+
static void subcompositor_bind(struct wl_client *client, void *data,
uint32_t version, uint32_t id);
+static void subcompositor_handle_display_destroy(struct wl_listener *listener,
+ void *data);
-bool
-subcompositor_init(struct ds_subcompositor *subcomp,
- struct wl_display *display)
+WL_EXPORT struct ds_subcompositor *
+ds_subcompositor_create(struct wl_display *display)
{
- subcomp->global = wl_global_create(display, &wl_subcompositor_interface,
- SUBCOMPOSITOR_VERSION, subcomp, subcompositor_bind);
+ struct ds_subcompositor *subcomp;
+
+ subcomp = calloc(1, sizeof *subcomp);
+ if (!subcomp)
+ return NULL;
+
+ subcomp->global = wl_global_create(display,
+ &wl_subcompositor_interface, SUBCOMPOSITOR_VERSION,
+ subcomp, subcompositor_bind);
if (!subcomp->global) {
ds_log_errno(DS_ERR, "Could not create global");
- return false;
+ free(subcomp);
+ return NULL;
}
- return true;
-}
+ wl_signal_init(&subcomp->events.destroy);
-void
-subcompositor_finish(struct ds_subcompositor *subcomp)
-{
- wl_global_destroy(subcomp->global);
+ subcomp->display_destroy.notify = subcompositor_handle_display_destroy;
+ wl_display_add_destroy_listener(display, &subcomp->display_destroy);
+
+ return subcomp;
}
static void
wl_resource_set_implementation(resource, &subcompositor_impl,
subcomp, NULL);
}
+
+static void
+subcompositor_handle_display_destroy(struct wl_listener *listener, void *data)
+{
+ struct ds_subcompositor *subcomp;
+
+ subcomp = wl_container_of(listener, subcomp, display_destroy);
+
+ wl_signal_emit_mutable(&subcomp->events.destroy, NULL);
+ wl_list_remove(&subcomp->display_destroy.link);
+ wl_global_destroy(subcomp->global);
+ free(subcomp);
+}