e_service_launcher: use e_client_destroy_listener_add 70/322170/1
authorSooChan Lim <sc1.lim@samsung.com>
Thu, 3 Apr 2025 11:03:25 +0000 (20:03 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Fri, 4 Apr 2025 06:24:34 +0000 (15:24 +0900)
use destroy signal of e_client instead of E_CLIENT_HOOK_DEL.

Change-Id: Ie45bdfb58dd4509c3edc6c540353d76ed5e5d595

src/bin/windowmgr/services/e_service_launcher.c

index b5f4552396a9361a79c006ea23af51567de01242..78c378a7fa128c4f332cb3bf25d4d145bcd15ec9 100644 (file)
@@ -84,6 +84,9 @@ struct _E_Service_Launcher
    Eina_Bool                            block_input;    //input is blocked(1) or not(0) while running client side animation
 
    Eina_List                           *consumers;      //list launcher consumer of launcher ec
+
+   // client listeners
+   struct wl_listener client_destroy_listener;
 };
 
 struct _E_Service_Launcher_Handler
@@ -91,7 +94,6 @@ struct _E_Service_Launcher_Handler
    Eina_Hash           *launcher_hash;  //hash key:launcher_ec, data:E_Service_Launcher
    unsigned int         launcher_count; //count of launcher object
 
-   Eina_List           *hooks_ec;       //hook list for E_CLIENT_HOOK_*
    Eina_List           *hooks_vis;      //hook list for E_POL_VIS_HOOK_TYPE_*
    Eina_List           *hooks_co;       //hook list for E_COMP_OBJECT_INTERCEPT_HOOK_*
    Eina_List           *hooks_appinfo;  //hook list for E_APPINFO_HOOK_*
@@ -1464,6 +1466,8 @@ _launcher_handler_launcher_del(E_Service_Launcher *lc)
    EINA_SAFETY_ON_NULL_RETURN_VAL(_laundler, EINA_FALSE);
    EINA_SAFETY_ON_NULL_RETURN_VAL(_laundler->launcher_hash, EINA_FALSE);
 
+   wl_list_remove(&lc->client_destroy_listener.link);
+
    ret = eina_hash_del(_laundler->launcher_hash, &lc->ec, lc);
    if (ret) _laundler->launcher_count--;
 
@@ -1819,24 +1823,6 @@ _launcher_handler_cb_hook_vis_hide(void *data EINA_UNUSED, E_Client *ec)
    return EINA_TRUE;
 }
 
-static void
-_launcher_handler_cb_hook_client_del(void *data EINA_UNUSED, E_Client *ec)
-{
-   E_Service_Launcher *lc;
-
-   EINA_SAFETY_ON_NULL_RETURN(ec);
-
-   lc = _launcher_handler_launcher_find(ec);
-   if (!lc) return;
-
-   if (lc->ec == ec) //launcher surface is gone.
-     {
-        _launcher_handler_launcher_del(lc);
-        _launcher_data_reset(lc);
-        E_FREE(lc);
-     }
-}
-
 static Eina_Bool
 _launcher_handler_cb_hook_intercept_show_helper(void *data, E_Client *ec)
 {
@@ -2088,11 +2074,6 @@ _launcher_handler_create(void)
                            E_POL_VIS_HOOK_TYPE_HIDE,
                            _launcher_handler_cb_hook_vis_hide, NULL);
 
-   LAUNCHER_HANDLER_CB_ADD(laundler->hooks_ec,
-                           e_client_hook_add,
-                           E_CLIENT_HOOK_DEL,
-                           _launcher_handler_cb_hook_client_del, NULL);
-
    LAUNCHER_HANDLER_CB_ADD(laundler->hooks_co,
                            e_comp_object_intercept_hook_add,
                            E_COMP_OBJECT_INTERCEPT_HOOK_SHOW_HELPER,
@@ -2126,7 +2107,6 @@ _launcher_handler_destroy(E_Service_Launcher_Handler *laundler)
    E_FREE_LIST(laundler->hdlrs_ev, ecore_event_handler_del);
    E_FREE_LIST(laundler->hooks_appinfo, e_appinfo_hook_del);
    E_FREE_LIST(laundler->hooks_co, e_comp_object_intercept_hook_del);
-   E_FREE_LIST(laundler->hooks_ec, e_client_hook_del);
    E_FREE_LIST(laundler->hooks_vis, e_policy_visibility_hook_del);
 
    E_FREE_FUNC(laundler->launcher_hash, eina_hash_free);
@@ -2154,6 +2134,18 @@ e_service_launcher_resource_set(E_Client *ec, struct wl_resource *res_tws_lc)
                                   _launcher_cb_resource_destroy);
 }
 
+static void
+_e_service_launcher_cb_client_destroy(struct wl_listener *listener, void *data)
+{
+   E_Service_Launcher *lc;
+
+   lc = wl_container_of(listener, lc, client_destroy_listener);
+
+   _launcher_handler_launcher_del(lc);
+   _launcher_data_reset(lc);
+   E_FREE(lc);
+}
+
 EINTERN void
 e_service_launcher_client_set(E_Client *ec)
 {
@@ -2189,7 +2181,9 @@ e_service_launcher_client_set(E_Client *ec)
    ELOGF("LAUNCHER_SRV", "client set|Created New Launcher(%p)", ec, lc);
    _launcher_state_set(lc, LAUNCHER_STATE_IDLE);
 
-   return;
+   // e_client listeners
+   lc->client_destroy_listener.notify = _e_service_launcher_cb_client_destroy;
+   e_client_destroy_listener_add(ec, &lc->client_destroy_listener);
 }
 
 EINTERN void