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
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_*
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--;
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)
{
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,
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);
_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)
{
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