e_service_launcher: added launchee hash to manage each last launcher of launchee 11/232311/4 submit/tizen_5.5/20200506.030116
authorSung-Jin Park <sj76.park@samsung.com>
Thu, 30 Apr 2020 11:38:20 +0000 (20:38 +0900)
committerSung-Jin Park <sj76.park@samsung.com>
Thu, 30 Apr 2020 12:48:03 +0000 (21:48 +0900)
Change-Id: I42f841059fae2bc32ad02df0807795b0ea6e0bd5
Signed-off-by: Sung-Jin Park <sj76.park@samsung.com>
src/bin/services/e_service_launcher.c

index 24bef233fe20486dd585e12735b41a0461d38575..0b1ea1caa8f679eaede73b82236b78138c79d019 100644 (file)
@@ -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);