From b877ea52f91013e6441aee42f4c2042bb5e9a6ce Mon Sep 17 00:00:00 2001 From: Sung-Jin Park Date: Thu, 30 Apr 2020 20:38:20 +0900 Subject: [PATCH] e_service_launcher: added launchee hash to manage each last launcher of launchee Change-Id: I42f841059fae2bc32ad02df0807795b0ea6e0bd5 Signed-off-by: Sung-Jin Park --- src/bin/services/e_service_launcher.c | 153 +++++++++++++++++++++++++- 1 file changed, 152 insertions(+), 1 deletion(-) diff --git a/src/bin/services/e_service_launcher.c b/src/bin/services/e_service_launcher.c index 24bef233fe..0b1ea1caa8 100644 --- a/src/bin/services/e_service_launcher.c +++ b/src/bin/services/e_service_launcher.c @@ -60,6 +60,9 @@ 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_Hash *launchee_hash; //hash key:launched_ec, data:E_Service_Launcher + unsigned int launchee_count; //count of launchee 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_* @@ -80,6 +83,11 @@ static E_Service_Launcher *_launcher_handler_launcher_find(E_Client *ec); static Eina_Bool _launcher_handler_launcher_add(E_Service_Launcher *lc); static Eina_Bool _launcher_handler_launcher_del(E_Service_Launcher *lc); +static E_Service_Launcher *_launcher_handler_launcher_find_with_launchee(E_Client *ec); +static Eina_Bool _launcher_handler_launchee_add_with_launcher(E_Service_Launcher *lc); +static Eina_Bool _launcher_handler_launchee_del_with_launcher(E_Service_Launcher *lc); +static Eina_Bool _launcher_handler_launchee_del(E_Client *ec); + static E_Service_Launcher *_launcher_handler_launcher_runner_get(void); static void _launcher_handler_launcher_runner_set(E_Service_Launcher *lc); static void _launcher_handler_launcher_runner_unset(E_Service_Launcher *lc); @@ -213,7 +221,17 @@ _launcher_post_forward(E_Service_Launcher *lc, Eina_Bool success) if (!target_ec) return; if (success) - _launcher_launched_ec_set(lc, target_ec); + { + E_Service_Launcher *tmp_lc; + + _launcher_launched_ec_set(lc, target_ec); + tmp_lc = _launcher_handler_launcher_find_with_launchee(target_ec); + if (tmp_lc) _launcher_handler_launchee_del_with_launcher(tmp_lc); + _launcher_handler_launchee_add_with_launcher(lc); + + ELOGF("LAUNCHER_SRV", "Succeed to POST FORWARD ! (lc : %p, lc->ec : %p, lc->launched_ec : %p)", + lc->ec, lc, lc->ec, lc->launched_ec); + } //show target_ec e_comp_object_damage(target_ec->frame, 0, 0, target_ec->w, target_ec->h); @@ -228,6 +246,7 @@ static void _launcher_post_backward(E_Service_Launcher *lc, Eina_Bool success) { E_Client *target_ec = NULL; + Eina_Bool res; target_ec = lc->target.ec; _launcher_target_ec_set(lc, NULL); @@ -268,6 +287,13 @@ _launcher_post_backward(E_Service_Launcher *lc, Eina_Bool success) lc->vis_grab = NULL; lc->target.vis_grab = NULL; + res = _launcher_handler_launchee_del_with_launcher(lc); + if (res) + ELOGF("LAUNCHER_SRV", "[%s] SUCCEED to delete launcher : %p from launchee_hash ! target.ec : %p", + NULL, __FUNCTION__, lc, lc->target.ec ? lc->target.ec : NULL); + else + ELOGF("LAUNCHER_SRV", "[%s] FAILED to delete launcher : %p from launchee_hash !", NULL, __FUNCTION__, lc); + if (!target_ec) return; if (success) @@ -842,6 +868,7 @@ _launcher_cb_resource_destroy(struct wl_resource *res_tws_lc) ELOGF("LAUNCHER_SRV", "Start Resource Destroy tws_service_launcher", lc->ec); + _launcher_handler_launchee_del_with_launcher(lc); _launcher_handler_launcher_del(lc); lc->res = NULL; @@ -1283,6 +1310,104 @@ _launcher_handler_launcher_del(E_Service_Launcher *lc) return ret; } +static E_Service_Launcher * +_launcher_handler_launcher_find_with_launchee(E_Client *ec) +{ + E_Service_Launcher *lc; + + EINA_SAFETY_ON_NULL_RETURN_VAL(ec, NULL); + EINA_SAFETY_ON_NULL_RETURN_VAL(_laundler, NULL); + EINA_SAFETY_ON_NULL_RETURN_VAL(_laundler->launchee_hash, NULL); + + lc = (E_Service_Launcher *)eina_hash_find(_laundler->launchee_hash, &ec); + + if (lc) + ELOGF("LAUNCHER_SRV", "[%s] Found launcher : %p, launched_ec : %p, _laundler->launchee_count : %d", ec, __FUNCTION__, lc, lc->launched_ec, _laundler->launchee_count); + else + ELOGF("LAUNCHER_SRV", "[%s] No launcher found. _laundler->launchee_count : %d", ec, __FUNCTION__, _laundler->launchee_count); + + return lc; +} + +static Eina_Bool +_launcher_handler_launchee_add_with_launcher(E_Service_Launcher *lc) +{ + Eina_Bool ret; + + EINA_SAFETY_ON_NULL_RETURN_VAL(lc, EINA_FALSE); + EINA_SAFETY_ON_NULL_RETURN_VAL(lc->launched_ec, EINA_FALSE); + EINA_SAFETY_ON_NULL_RETURN_VAL(_laundler, EINA_FALSE); + EINA_SAFETY_ON_NULL_RETURN_VAL(_laundler->launchee_hash, EINA_FALSE); + + ret = eina_hash_add(_laundler->launchee_hash, &lc->launched_ec, lc); + if (ret) + _laundler->launchee_count++; + + if (ret) + ELOGF("LAUNCHER_SRV", "[%s] Added launchee : %p, launcher : %p, _laundler->launchee_count : %d", lc->ec, __FUNCTION__, lc->launched_ec, lc, _laundler->launchee_count); + else + ELOGF("LAUNCHER_SRV", "[%s] Unable to add launchee : %p, launcher : %p, _laundler->launchee_count : %d", lc->ec, __FUNCTION__, lc->launched_ec, lc, _laundler->launchee_count); + + return ret; +} + +static Eina_Bool +_launcher_handler_launchee_del_with_launcher(E_Service_Launcher *lc) +{ + Eina_Bool ret; + + EINA_SAFETY_ON_NULL_RETURN_VAL(lc, EINA_FALSE); + EINA_SAFETY_ON_NULL_RETURN_VAL(_laundler, EINA_FALSE); + EINA_SAFETY_ON_NULL_RETURN_VAL(_laundler->launchee_hash, EINA_FALSE); + + ret = eina_hash_del_by_data(_laundler->launchee_hash, lc); + if (ret) _laundler->launchee_count--; + + if (ret) + ELOGF("LAUNCHER_SRV", "[%s] Deleted launchee : %p, launcher : %p, _laundler->launchee_count : %d", NULL, __FUNCTION__, lc->launched_ec, lc, _laundler->launchee_count); + else + ELOGF("LAUNCHER_SRV", "[%s] Unable to delete launchee : %p, launcher : %p, _laundler->launchee_count : %d", NULL, __FUNCTION__, lc->launched_ec, lc, _laundler->launchee_count); + + return ret; +} + +static Eina_Bool +_launcher_handler_launchee_del(E_Client *ec) +{ + Eina_Bool ret; + + EINA_SAFETY_ON_NULL_RETURN_VAL(ec, EINA_FALSE); + EINA_SAFETY_ON_NULL_RETURN_VAL(_laundler, EINA_FALSE); + EINA_SAFETY_ON_NULL_RETURN_VAL(_laundler->launchee_hash, EINA_FALSE); + +#if 1 + + E_Service_Launcher *lc; + lc = eina_hash_find(_laundler->launchee_hash, &ec); + if (lc) + + ret = eina_hash_del(_laundler->launchee_hash, &lc->launched_ec, lc); + if (ret) _laundler->launchee_count--; + + if (ret) + ELOGF("LAUNCHER_SRV", "[%s] Deleted launchee : %p, launcher : %p, _laundler->launchee_count : %d", ec, __FUNCTION__, ec, lc, _laundler->launchee_count); + else + ELOGF("LAUNCHER_SRV", "[%s] Unable to delete launchee : %p, _laundler->launchee_count : %d", ec, __FUNCTION__, ec, _laundler->launchee_count); + +#else + ret = eina_hash_del_by_key(_laundler->launchee_hash, &ec); + if (ret) _laundler->launchee_count--; + + if (ret) + ELOGF("LAUNCHER_SRV", "[%s] Deleted launchee : %p, _laundler->launchee_count : %d", ec, __FUNCTION__, ec, _laundler->launchee_count); + else + ELOGF("LAUNCHER_SRV", "[%s] Unable to delete launchee : %p, _laundler->launchee_count : %d", ec, __FUNCTION__, ec, _laundler->launchee_count); + +#endif + + return ret; +} + static void _launcher_handler_launcher_runner_set(E_Service_Launcher *lc) { @@ -1496,6 +1621,27 @@ _launcher_handler_cb_hook_vis_lower(void *data EINA_UNUSED, E_Client *ec) lc = _launcher_handler_launcher_find(prov_ec); } } + + if (!lc) + { + /* Backward case + * + * activity: callee ec + * given ec: callee ec <-- destroying by back key + * caller ec which is a widget attached in a separate process <-- will be shown + * + * In this case, the given ec is a callee ec and has been launched by the given caller. + * The caller is attached as a widget in another process. + * As we couldn't find the caller's ec both in launcher list and rsm_provider's listn with the given callee's ec, + * we have to find the launcher from the launchee hash. + * Note that the caller's launcher has already been added to the launchee hash once it had been succed to launch the given callee. + */ + lc = _launcher_handler_launcher_find_with_launchee(activity); + + if (lc) ELOGF("LAUNCHER_SRV", "[%s] Found launcher : %p, activity : %p, lc->ec : %p, lc->launched_ec : %p", + activity, __FUNCTION__, lc, activity, lc->ec, lc->launched_ec); + } + EINA_SAFETY_ON_NULL_RETURN_VAL(lc, EINA_FALSE); if (ec->visibility.obscured != E_VISIBILITY_UNOBSCURED) return EINA_FALSE; @@ -1640,6 +1786,7 @@ _launcher_handler_cb_hook_client_del(void *data EINA_UNUSED, E_Client *ec) if (lc->ec == ec) //launcher surface is gone. { + _launcher_handler_launchee_del(ec); _launcher_handler_launcher_del(lc); _launcher_data_reset(lc); E_FREE(lc); @@ -1843,6 +1990,8 @@ _launcher_handler_create(void) laundler->launcher_count = 0; laundler->launcher_hash = eina_hash_pointer_new(NULL); + laundler->launchee_count = 0; + laundler->launchee_hash = eina_hash_pointer_new(NULL); LAUNCHER_HANDLER_CB_ADD(laundler->hooks_vis, e_policy_visibility_hook_add, @@ -1895,6 +2044,7 @@ _launcher_handler_destroy(E_Service_Launcher_Handler *laundler) 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->launchee_hash, eina_hash_free); E_FREE_FUNC(laundler->launcher_hash, eina_hash_free); E_FREE(laundler); } @@ -1968,6 +2118,7 @@ e_service_launcher_client_unset(E_Client *ec) lc = _launcher_handler_launcher_find(ec); EINA_SAFETY_ON_NULL_RETURN(lc); + _launcher_handler_launchee_del(ec); _launcher_handler_launcher_del(lc); _launcher_data_reset(lc); E_FREE(lc); -- 2.34.1