surface_view: Delegate destroying E_Client 69/319169/1
authorSeunghun Lee <shiin.lee@samsung.com>
Wed, 5 Feb 2025 00:00:59 +0000 (09:00 +0900)
committerSeunghun Lee <shiin.lee@samsung.com>
Wed, 5 Feb 2025 02:01:41 +0000 (11:01 +0900)
Change-Id: I0f553b23819ae73f2c79d242fdf32d2cf0eaf08c

src/bin/server/e_compositor.c
src/bin/server/e_compositor_private.h
src/bin/server/e_surface_view.c

index 6d7b1c9a52e6d2be6f6c1b09e93e1f673b7989ac..9a2d8fba4650e30b94e4c26b52fdff899f4c6fe1 100644 (file)
@@ -63,8 +63,6 @@ struct _E_Surface
    struct ds_surface_viewport *surface_viewport;
    struct ds_tizen_exported_surface *exported_surface;
 
-   E_Client_Hook *client_del_hook;
-
    const char *role_name;
    struct wl_list frames;
 
@@ -81,6 +79,7 @@ struct _E_Surface
    struct
      {
         struct wl_signal destroy;
+        struct wl_signal client_destroy;
         struct wl_signal parent_destroy;
         struct wl_signal precommit_to_cache;
         struct wl_signal precommit_from_cache;
@@ -131,9 +130,7 @@ static void _e_compositor_surface_exporter_finalize(E_Compositor *comp);
 
 static E_Surface *_e_surface_create(struct ds_surface *ds_surface);
 static E_Surface *_e_surface_from_ds_surface(struct ds_surface *ds_surface);
-static void _e_surface_destroy(E_Surface *surface);
 static void _e_surface_ds_surface_set(E_Surface *surface, struct ds_surface *ds_surface);
-static void _e_surface_cb_client_del(void *data, E_Client *ec);
 static void _e_surface_cb_destroy(struct wl_listener *listener, void *data);
 static void _e_surface_cb_precommit_to_cache(struct wl_listener *listener, void *data);
 static void _e_surface_cb_precommit_from_cache(struct wl_listener *listener, void *data);
@@ -359,6 +356,12 @@ e_surface_destroy_listener_get(E_Surface *surface, wl_notify_func_t notify)
    return wl_signal_get(&surface->events.destroy, notify);
 }
 
+EINTERN void
+e_surface_client_destroy_listener_add(E_Surface *surface, struct wl_listener *listener)
+{
+   wl_signal_add(&surface->events.client_destroy, listener);
+}
+
 EINTERN void
 e_surface_parent_destroy_listener_add(E_Surface *surface, struct wl_listener *listener)
 {
@@ -729,7 +732,6 @@ e_surface_ec_set(E_Surface *surface, E_Client *ec)
    ec->comp_data = &surface->base;
 
    surface->ec = ec;
-   surface->client_del_hook = e_client_hook_add(E_CLIENT_HOOK_DEL, _e_surface_cb_client_del, surface);
 }
 
 EINTERN E_Subsurface *
@@ -910,6 +912,7 @@ _e_surface_create(struct ds_surface *ds_surface)
    _e_surface_ds_surface_set(surface, ds_surface);
 
    wl_signal_init(&surface->events.destroy);
+   wl_signal_init(&surface->events.client_destroy);
    wl_signal_init(&surface->events.parent_destroy);
    wl_signal_init(&surface->events.precommit_to_cache);
    wl_signal_init(&surface->events.precommit_from_cache);
@@ -944,8 +947,8 @@ _e_surface_create(struct ds_surface *ds_surface)
    return surface;
 }
 
-static void
-_e_surface_destroy(E_Surface *surface)
+EINTERN void
+e_surface_destroy(E_Surface *surface)
 {
    E_Comp_Wl_Data *comp_wl;
    struct wl_resource *resource, *tmp;
@@ -1004,12 +1007,12 @@ _e_surface_destroy(E_Surface *surface)
 
    E_FREE_FUNC(surface->base.on_focus_timer, ecore_timer_del);
 
-   e_client_hook_del(surface->client_del_hook);
-
    g_mutex_unlock(&surface->base.surface_mutex);
 
    g_mutex_clear(&surface->base.surface_mutex);
 
+   surface->ec->comp_data = NULL;
+
    free(surface);
 }
 
@@ -1295,27 +1298,6 @@ _e_surface_commit(E_Surface *surface)
    e_comp_wl_hook_call(E_COMP_WL_HOOK_CLIENT_SURFACE_COMMIT, surface->ec);
 }
 
-static void
-_e_surface_cb_client_del(void *data, E_Client *ec)
-{
-   E_Surface *surface = data;
-
-   if (surface->ec != ec)
-     return;
-
-   TRACE_DS_BEGIN(COMP_WL:CLIENT DEL CB);
-
-   e_comp_wl_hook_call(E_COMP_WL_HOOK_DEL, ec);
-
-   e_comp_wl_client_evas_deinit(ec);
-
-   _e_surface_destroy(surface);
-
-   ec->comp_data = NULL;
-
-   TRACE_DS_END();
-}
-
 static void
 _e_surface_cb_destroy(struct wl_listener *listener, void *data)
 {
@@ -1323,6 +1305,8 @@ _e_surface_cb_destroy(struct wl_listener *listener, void *data)
 
    surface = wl_container_of(listener, surface, destroy);
 
+   wl_signal_emit(&surface->events.client_destroy, surface);
+
    wl_list_remove(&surface->destroy.link);
    wl_list_remove(&surface->precommit_to_cache.link);
    wl_list_remove(&surface->precommit_from_cache.link);
@@ -1330,8 +1314,6 @@ _e_surface_cb_destroy(struct wl_listener *listener, void *data)
    wl_list_remove(&surface->commit.link);
    wl_list_remove(&surface->new_subsurface.link);
    surface->ds_surface = NULL;
-
-   e_comp_wl_client_surface_finish(surface->ec);
 }
 
 static void
index 905420da12fbca3b298d5c656f482726b747f04b..6ce29be31fef65e62068ba5fdc6d8e97283f05d3 100644 (file)
@@ -4,5 +4,7 @@
 #include "e_compositor_intern.h"
 
 void e_surface_ec_set(E_Surface *surface, E_Client *ec);
+void e_surface_destroy(E_Surface *surface);
+void e_surface_client_destroy_listener_add(E_Surface *surface, struct wl_listener *listener);
 
 #endif
index 15bb1cd89311ebe3077d038b4782dab45262a09f..07d3b838659421b0990b4500d0d62bd580d0bad1 100644 (file)
@@ -32,33 +32,34 @@ struct _E_Surface_View
    E_Surface *surface;
    E_Client *ec;
 
-   struct wl_listener surface_destroy;
+   E_Client_Hook *client_del_hook;
+
+   struct wl_listener surface_client_destroy;
 };
 
 static E_Surface_View_Module *e_module;
 
-static void
-_surface_view_surface_unset(E_Surface_View *view)
-{
-   wl_list_remove(&view->surface_destroy.link);
-   view->surface = NULL;
-}
-
 static void
 _surface_view_destroy(E_Surface_View *view)
 {
    ESV_INF("Destroy E_Surface_View(%p)", view->ec, view);
 
-   _surface_view_surface_unset(view);
+   e_comp_wl_hook_call(E_COMP_WL_HOOK_DEL, view->ec);
+
+   e_comp_wl_client_evas_deinit(view->ec);
+
+   wl_list_remove(&view->surface_client_destroy.link);
+   e_surface_destroy(view->surface);
+   e_client_hook_del(view->client_del_hook);
    free(view);
 }
 
 static void
-_surface_view_cb_surface_destroy(struct wl_listener *listener, void *data)
+_surface_view_cb_surface_client_destroy(struct wl_listener *listener, void *data)
 {
-   E_Surface_View *view = wl_container_of(listener, view, surface_destroy);
+   E_Surface_View *view = wl_container_of(listener, view, surface_client_destroy);
 
-   _surface_view_destroy(view);
+   e_comp_wl_client_surface_finish(view->ec);
 }
 
 static void
@@ -66,8 +67,8 @@ _surface_view_surface_set(E_Surface_View *view, E_Surface *surface)
 {
    view->surface = surface;
 
-   view->surface_destroy.notify = _surface_view_cb_surface_destroy;
-   e_surface_destroy_listener_add(surface, &view->surface_destroy);
+   view->surface_client_destroy.notify = _surface_view_cb_surface_client_destroy;
+   e_surface_client_destroy_listener_add(surface, &view->surface_client_destroy);
 }
 
 static E_Client *
@@ -88,12 +89,27 @@ _launchscreen_ec_find(struct wl_resource *surface_resource)
    return launchscreen_ec;
 }
 
+static void
+_surface_view_cb_client_del(void *data, E_Client *ec)
+{
+   E_Surface_View *view = data;
+
+   if (view->ec != ec)
+     return;
+
+   TRACE_DS_BEGIN(SURFACE_VIEW:CLIENT DEL CB);
+   _surface_view_destroy(view);
+   TRACE_DS_END();
+}
+
 static void
 _surface_view_ec_set(E_Surface_View *view, E_Client *ec)
 {
-   view->ec = ec;
    e_surface_ec_set(view->surface, ec);
 
+   view->ec = ec;
+   view->client_del_hook = e_client_hook_add(E_CLIENT_HOOK_DEL, _surface_view_cb_client_del, view);
+
    ec->argb = EINA_FALSE;
    ec->redirected = ec->ignored = 1;
    ec->border_size = 0;
@@ -213,7 +229,7 @@ _surface_view_create(E_Surface *surface)
    if (!_surface_view_ec_add(view))
    {
       ESV_ERR("Failed to add E_Client to E_Surface_View: surface(%p)", surface);
-      _surface_view_surface_unset(view);
+      wl_list_remove(&view->surface_client_destroy.link);
       free(view);
       return NULL;
    }