compositor: Make e_compositor singleton 58/319158/1
authorSeunghun Lee <shiin.lee@samsung.com>
Fri, 17 Jan 2025 01:49:26 +0000 (10:49 +0900)
committerSeunghun Lee <shiin.lee@samsung.com>
Wed, 5 Feb 2025 01:00:12 +0000 (10:00 +0900)
By ensuring a single instance of e_compositor, this change simplifies
access.

Change-Id: I4c266a327c1f6e4e9de2d5a33c56ade5452b8087

src/bin/core/e_pixmap.c
src/bin/server/e_comp_wl.c
src/bin/server/e_comp_wl_intern.h
src/bin/server/e_compositor.c
src/bin/server/e_compositor_intern.h
src/bin/server/e_video_shell.c

index e400405a3f455094d8ca86cd88141b4905beefb3..7e964f160be3abaff87fc0bc4b36a23a4dbace2a 100644 (file)
@@ -482,10 +482,9 @@ e_pixmap_find_client(E_Pixmap_Type type, ...)
 E_API E_Client *
 e_pixmap_find_client_by_res_id(uint32_t res_id)
 {
-   E_Compositor *compositor = e_comp_wl_compositor_get(e_comp_wl_get());
    E_Surface *surface;
 
-   surface = e_compositor_exported_surface_lookup(compositor, res_id);
+   surface = e_compositor_exported_surface_lookup(res_id);
    if (!surface)
      return NULL;
 
index a9edccfd920a1bb4554d268b3022e385e00e9f1f..c4d03853da6ee96859bb6f52f7d1af7d3edca6d2 100644 (file)
@@ -80,7 +80,6 @@ typedef struct _E_Comp_Data E_Comp_Data;
 struct _E_Comp_Data
 {
    E_Comp_Wl_Data base;
-   E_Compositor *compositor;
    struct wl_listener client_created;
 };
 
@@ -3509,8 +3508,7 @@ _e_comp_wl_display_create(void)
 
    ds_log_init(DS_DBG, _e_comp_wl_ds_log_handler);
 
-   comp_data->compositor = e_compositor_create(comp_wl->wl.disp);
-   if (!comp_data->compositor)
+   if (!e_compositor_init(comp_wl->wl.disp))
      {
         ERR("Failed to initialize compositor");
         goto comp_err;
@@ -3674,12 +3672,6 @@ e_comp_wl_get(void)
    return e_comp_wl;
 }
 
-EINTERN E_Compositor *
-e_comp_wl_compositor_get(E_Comp_Wl_Data *e_comp_wl)
-{
-   return ((E_Comp_Data *)e_comp_wl)->compositor;
-}
-
 static void
 e_comp_wl_surface_event_simple_free(void *d EINA_UNUSED, E_Event_Client *ev)
 {
index 984af5883e7f449e0c2e545a6094dd7074311d9f..fc9390d34a186a7a2d53af6ab8845c249718b8c0 100644 (file)
@@ -13,7 +13,6 @@
 EINTERN E_Comp_Wl_Data *e_comp_wl_init(void);
 EINTERN void            e_comp_wl_shutdown(void);
 EINTERN E_Comp_Wl_Data *e_comp_wl_get(void);
-EINTERN E_Compositor   *e_comp_wl_compositor_get(E_Comp_Wl_Data *e_comp_wl);
 
 EINTERN void      e_comp_wl_surface_attach(E_Client *ec, E_Comp_Wl_Buffer *buffer);
 EINTERN Eina_Bool e_comp_wl_surface_commit(E_Client *ec);
index 8c02f618108b201a50d7e9935ec1d7d46cd160cc..77dd0abad05d4b3514db66e30242a532c8aaca43 100644 (file)
@@ -148,22 +148,26 @@ static void _ds_surface_viewport_unset(struct ds_surface *ds_surface);
 static void _ds_subsurface_position_set(struct ds_subsurface *ds_subsurface, int x, int y);
 
 static const char *e_comp_wl_subsurface_role_name = "ds_subsurface";
+static E_Compositor *e_compositor;
 
-EINTERN E_Compositor *
-e_compositor_create(struct wl_display *display)
+EINTERN Eina_Bool
+e_compositor_init(struct wl_display *display)
 {
    E_Compositor *comp;
 
+   if (e_compositor)
+     return EINA_TRUE;
+
    comp = E_NEW(E_Compositor, 1);
    if (!comp)
-     return NULL;
+     return EINA_FALSE;
 
    comp->ds_compositor = ds_compositor_create(display);
    if (!comp->ds_compositor)
      {
         ERR("Could not create ds_compositor");
         free(comp);
-        return NULL;
+        return EINA_FALSE;
      }
 
    comp->ds_subcompositor = ds_subcompositor_create(display);
@@ -171,14 +175,14 @@ e_compositor_create(struct wl_display *display)
      {
         ERR("Could not create ds_subcompositor");
         free(comp);
-        return NULL;
+        return EINA_FALSE;
      }
 
    if (!_e_compositor_surface_exporter_init(comp, display))
      {
         ERR("Could not initialize surface exporter");
         free(comp);
-        return NULL;
+        return EINA_FALSE;
      }
 
    comp->new_surface.notify = _e_compositor_cb_new_surface;
@@ -192,18 +196,22 @@ e_compositor_create(struct wl_display *display)
    comp->display_destroy.notify = _e_compositor_cb_display_destroy;
    wl_display_add_destroy_listener(display, &comp->display_destroy);
 
-   return comp;
+   e_compositor = comp;
+
+   return EINA_TRUE;
 }
 
 EINTERN uint32_t
-e_compositor_surface_export(E_Compositor *compositor, E_Surface *surface)
+e_compositor_surface_export(E_Surface *surface)
 {
    struct ds_tizen_exported_surface *exported_surface;
 
+   EINA_SAFETY_ON_NULL_RETURN_VAL(e_compositor, E_SURFACE_INVALID_EXPORTED_ID);
+
    if (!surface->ds_surface)
      return E_SURFACE_INVALID_EXPORTED_ID;
 
-   exported_surface = ds_tizen_surface_exporter_export_surface(compositor->surface_exporter, surface->ds_surface);
+   exported_surface = ds_tizen_surface_exporter_export_surface(e_compositor->surface_exporter, surface->ds_surface);
    if (!exported_surface)
      return E_SURFACE_INVALID_EXPORTED_ID;
 
@@ -211,9 +219,11 @@ e_compositor_surface_export(E_Compositor *compositor, E_Surface *surface)
 }
 
 EINTERN E_Surface *
-e_compositor_exported_surface_lookup(E_Compositor *comp, uint32_t id)
+e_compositor_exported_surface_lookup(uint32_t id)
 {
-   return eina_hash_find(comp->exported_surfaces, &id);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(e_compositor, NULL);
+
+   return eina_hash_find(e_compositor->exported_surfaces, &id);
 }
 
 EINTERN E_Subsurface *
@@ -707,13 +717,11 @@ e_subsurface_position_get(E_Subsurface *subsurface, int *x, int *y)
 static void
 _e_compositor_cb_display_destroy(struct wl_listener *listener, void *data EINA_UNUSED)
 {
-   E_Compositor *comp = wl_container_of(listener, comp, display_destroy);
-
-   _e_compositor_surface_exporter_finalize(comp);
-   wl_list_remove(&comp->display_destroy.link);
-   wl_list_remove(&comp->new_surface.link);
-   e_client_hook_del(comp->new_client_hook);
-   free(comp);
+   _e_compositor_surface_exporter_finalize(e_compositor);
+   wl_list_remove(&e_compositor->display_destroy.link);
+   wl_list_remove(&e_compositor->new_surface.link);
+   e_client_hook_del(e_compositor->new_client_hook);
+   E_FREE(e_compositor);
 }
 
 static E_Client *
index beb062e43698796cf1ca1a09446349ca8e4303c7..04b8ab37bac0c62da91a1c446a9ce2a1914a23fc 100644 (file)
@@ -14,9 +14,9 @@ typedef struct _E_Compositor E_Compositor;
 typedef struct _E_Surface E_Surface;
 typedef struct _E_Subsurface E_Subsurface;
 
-E_Compositor *e_compositor_create(struct wl_display *display);
-uint32_t e_compositor_surface_export(E_Compositor *compositor, E_Surface *surface);
-E_Surface *e_compositor_exported_surface_lookup(E_Compositor *compositor, uint32_t id);
+Eina_Bool e_compositor_init(struct wl_display *display);
+uint32_t e_compositor_surface_export(E_Surface *surface);
+E_Surface *e_compositor_exported_surface_lookup(uint32_t id);
 
 E_Surface *e_surface_from_resource(struct wl_resource *surface_resource);
 E_Surface *e_surface_from_ec(E_Client *ec);
index 7885aa23eecc51906ccd1791523d318e2ddf3e4c..2df7006adf1c0de853e8509b9bb1939178cc123e 100644 (file)
@@ -1734,15 +1734,12 @@ _video_shell_cb_get_global_resource_id_from_handle(struct wl_client *client, str
    E_Video_Shell *shell = wl_resource_get_user_data(resource);
    E_Video_Viewport *viewport;
    uint32_t id = 0;
-   E_Compositor *compositor;
 
    viewport = eina_hash_find(shell->viewports, handle);
    if (!viewport)
      goto end;
 
-   compositor = e_comp_wl_compositor_get(e_comp_wl_get());
-   id = e_compositor_surface_export(compositor, e_subsurface_surface_get(viewport->subsurface));
-
+   id = e_compositor_surface_export(e_subsurface_surface_get(viewport->subsurface));
 end:
    VS_INF("SHELL %p| Send global resource id(%d) of handle(%s)", shell, id, handle);
    wtz_video_shell_send_global_resource_id(resource, id);