From ad0426130bc69f756bf735236826b76de11868ed Mon Sep 17 00:00:00 2001 From: Seunghun Lee Date: Wed, 12 Apr 2023 16:53:25 +0900 Subject: [PATCH] subcompositor: Split out from compositor Change-Id: Ib3cd4a2caedccca91af3397df31ccaba20580ba0 --- include/libds/subcompositor.h | 10 +++++++ src/compositor/compositor.c | 17 ++--------- src/compositor/compositor_private.h | 10 ------- src/compositor/subcompositor.c | 56 +++++++++++++++++++++++++++++-------- 4 files changed, 56 insertions(+), 37 deletions(-) create mode 100644 include/libds/subcompositor.h diff --git a/include/libds/subcompositor.h b/include/libds/subcompositor.h new file mode 100644 index 0000000..e1915cb --- /dev/null +++ b/include/libds/subcompositor.h @@ -0,0 +1,10 @@ +#ifndef LIBDS_SUBCOMPOSITOR_H +#define LIBDS_SUBCOMPOSITOR_H + +#include + +struct ds_subcompositor; + +struct ds_subcompositor *ds_subcompositor_create(struct wl_display *display); + +#endif diff --git a/src/compositor/compositor.c b/src/compositor/compositor.c index f616832..3540755 100644 --- a/src/compositor/compositor.c +++ b/src/compositor/compositor.c @@ -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); } diff --git a/src/compositor/compositor_private.h b/src/compositor/compositor_private.h index 5a15e11..a24f116 100644 --- a/src/compositor/compositor_private.h +++ b/src/compositor/compositor_private.h @@ -14,16 +14,6 @@ #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); diff --git a/src/compositor/subcompositor.c b/src/compositor/subcompositor.c index 35a62a9..99b7b59 100644 --- a/src/compositor/subcompositor.c +++ b/src/compositor/subcompositor.c @@ -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); +} -- 2.7.4