struct ds_compositor
{
struct wl_global *global;
- struct ds_subcompositor subcompositor;
struct {
struct wl_signal new_surface;
COMPOSITOR_VERSION, compositor, compositor_bind);
if (!compositor->global) {
ds_log_errno(DS_ERR, "Could not create global");
- goto err_global;
- }
-
- if (!subcompositor_init(&compositor->subcompositor, display)) {
- ds_err("Could not initialize subcompositor");
- goto err_subcomp;
+ free(compositor);
+ return NULL;
}
wl_signal_init(&compositor->events.new_surface);
ds_inf("Compositor(%p) created", compositor);
return compositor;
-
-err_subcomp:
- wl_global_destroy(compositor->global);
-err_global:
- free(compositor);
-
- return NULL;
}
WL_EXPORT void
wl_signal_emit_mutable(&compositor->events.destroy, compositor);
wl_list_remove(&compositor->display_destroy.link);
- subcompositor_finish(&compositor->subcompositor);
free(compositor);
}
#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);
+}