subcompositor: Split out from compositor
[platform/core/uifw/libds.git] / src / compositor / subcompositor.c
index 35a62a9..99b7b59 100644 (file)
@@ -2,27 +2,46 @@
 
 #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
@@ -97,3 +116,16 @@ subcompositor_bind(struct wl_client *client, void *data,
     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);
+}