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