subcompositor: Split out from compositor 13/295313/1
authorSeunghun Lee <shiin.lee@samsung.com>
Wed, 12 Apr 2023 07:53:25 +0000 (16:53 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Wed, 5 Jul 2023 05:19:16 +0000 (14:19 +0900)
Change-Id: Ib3cd4a2caedccca91af3397df31ccaba20580ba0

include/libds/subcompositor.h [new file with mode: 0644]
src/compositor/compositor.c
src/compositor/compositor_private.h
src/compositor/subcompositor.c

diff --git a/include/libds/subcompositor.h b/include/libds/subcompositor.h
new file mode 100644 (file)
index 0000000..e1915cb
--- /dev/null
@@ -0,0 +1,10 @@
+#ifndef LIBDS_SUBCOMPOSITOR_H
+#define LIBDS_SUBCOMPOSITOR_H
+
+#include <wayland-server.h>
+
+struct ds_subcompositor;
+
+struct ds_subcompositor *ds_subcompositor_create(struct wl_display *display);
+
+#endif
index f616832..3540755 100644 (file)
@@ -6,7 +6,6 @@
 struct ds_compositor
 {
     struct wl_global *global;
-    struct ds_subcompositor subcompositor;
 
     struct {
         struct wl_signal new_surface;
@@ -36,12 +35,8 @@ ds_compositor_create(struct wl_display *display)
             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);
@@ -53,13 +48,6 @@ ds_compositor_create(struct wl_display *display)
     ds_inf("Compositor(%p) created", compositor);
 
     return compositor;
-
-err_subcomp:
-    wl_global_destroy(compositor->global);
-err_global:
-    free(compositor);
-
-    return NULL;
 }
 
 WL_EXPORT void
@@ -135,6 +123,5 @@ compositor_handle_display_destroy(struct wl_listener *listener, void *data)
     wl_signal_emit_mutable(&compositor->events.destroy, compositor);
 
     wl_list_remove(&compositor->display_destroy.link);
-    subcompositor_finish(&compositor->subcompositor);
     free(compositor);
 }
index 5a15e11..a24f116 100644 (file)
 #include "surface.h"
 #include "util.h"
 
-struct ds_subcompositor
-{
-    struct wl_global *global;
-};
-
-bool subcompositor_init(struct ds_subcompositor *subcomp,
-        struct wl_display *display);
-
-void subcompositor_finish(struct ds_subcompositor *subcomp);
-
 struct ds_surface *
 create_surface(struct wl_client *client, uint32_t version, uint32_t id);
 
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);
+}