e_service_launcher: identify callee window by appid 46/215046/3
authorMinJeong Kim <minjjj.kim@samsung.com>
Tue, 1 Oct 2019 06:54:13 +0000 (15:54 +0900)
committerMinJeong Kim <minjjj.kim@samsung.com>
Mon, 7 Oct 2019 08:17:41 +0000 (17:17 +0900)
Change-Id: I84139e7b90c16cb149a3f23050bebbde5dfd4407
Signed-off-by: MinJeong Kim <minjjj.kim@samsung.com>
src/bin/e_policy_wl.c
src/bin/services/e_service_launcher.c
src/bin/services/e_service_launcher.h

index bc08c1507ded17690e89d2a282a412d2342514b3..8537ea43f59c38345a7437ef579c09fb8ffd458b 100644 (file)
@@ -6248,6 +6248,12 @@ _tzlaunch_splash_iface_cb_owner(struct wl_client *client EINA_UNUSED, struct wl_
 
              e_comp->launchscrns = eina_list_append(e_comp->launchscrns, new_ec);
 
+             /* TODO : use tizen_launch_appinfo */
+             if (tzlaunch_splash->custom_effect_callee)
+               {
+                  e_service_launcher_callee_register(tzlaunch_splash->appid, new_ec);
+               }
+
              evas_object_show(new_ec->frame);
              evas_object_raise(new_ec->frame);
 
@@ -6286,6 +6292,12 @@ _tzlaunch_splash_iface_cb_owner(struct wl_client *client EINA_UNUSED, struct wl_
         old_ec->new_client = EINA_FALSE;
         old_ec->icccm.accepts_focus = EINA_TRUE;
 
+        /* TODO : use tizen_launch_appinfo */
+        if (tzlaunch_splash->custom_effect_callee)
+          {
+             e_service_launcher_callee_register(tzlaunch_splash->appid, old_ec);
+          }
+
         evas_object_show(old_ec->frame);
         evas_object_raise(old_ec->frame);
      }
index 31e10fa7d6c6f7817a0d5026482d0f783d932801..dacbbeac16e684e759b92ac7ad1e96925ebafc10 100644 (file)
@@ -33,6 +33,7 @@ struct _E_Service_Launcher
      {
         E_Client                       *ec;             //target E_Client
         pid_t                           pid;            //pid
+        const char                     *appid;          //appid
         E_Vis_Grab                     *vis_grab;       //grab of target client's visibility
 
         Eina_Bool                       delay_del;      //refered delay_del
@@ -149,6 +150,7 @@ _launcher_post_forward(E_Service_Launcher *lc, Eina_Bool success)
 
    lc->serial = 0;
    lc->target.pid = -1;
+   E_FREE_FUNC(lc->target.appid, eina_stringshare_del);
 
    //if forward animation is failed, enlightenment can run animation instead.
    if ((!success) && (target_ec))
@@ -188,6 +190,7 @@ _launcher_post_backward(E_Service_Launcher *lc, Eina_Bool success)
    lc->target.pid = -1;
    lc->direction = 0;
 
+   E_FREE_FUNC(lc->target.appid, eina_stringshare_del);
    E_FREE_FUNC(lc->buff_attach, ecore_event_handler_del);
 
    if (target_ec)
@@ -793,7 +796,7 @@ _launcher_cb_launch(struct wl_client *client EINA_UNUSED,
          lc->ec, app_id?:"NONE", instance_id?:"NONE", pid);
 
    EINA_SAFETY_ON_TRUE_GOTO(lc->ec->visibility.obscured == E_VISIBILITY_FULLY_OBSCURED, send_stop);
-   EINA_SAFETY_ON_TRUE_GOTO(pid < 0, send_stop);
+   EINA_SAFETY_ON_TRUE_GOTO((pid < 0) && !(app_id) , send_stop);
 
    //check current state of lc
    runner =  _launcher_handler_launcher_runner_get();
@@ -814,24 +817,32 @@ _launcher_cb_launch(struct wl_client *client EINA_UNUSED,
         _launcher_launched_ec_set(lc, NULL);
      }
 
-   lc->target.pid = pid;
    lc->serial = serial;
 
-   ecs = _launcher_clients_find_by_pid(pid);
-   EINA_LIST_FOREACH(ecs, l, target_ec)
+   if (pid > 0 )
      {
-        if (e_object_is_del(E_OBJECT(target_ec))) continue;
-        if (e_client_util_ignored_get(target_ec)) continue;
+        lc->target.pid = pid;
+        ecs = _launcher_clients_find_by_pid(pid);
+        EINA_LIST_FOREACH(ecs, l, target_ec)
+          {
+             if (e_object_is_del(E_OBJECT(target_ec))) continue;
+             if (e_client_util_ignored_get(target_ec)) continue;
 
-        ELOGF("LAUNCHER_SRV", "Found target_ec:%p", lc->ec, target_ec);
+             ELOGF("LAUNCHER_SRV", "Found target_ec:%p", lc->ec, target_ec);
 
-        sent = _launcher_prepare_forward_send(lc, target_ec);
-        EINA_SAFETY_ON_FALSE_GOTO(sent, send_stop);
+             sent = _launcher_prepare_forward_send(lc, target_ec);
+             EINA_SAFETY_ON_FALSE_GOTO(sent, send_stop);
 
-        _launcher_state_set(lc, LAUNCHER_STATE_PREPARING);
-        break;
+             _launcher_state_set(lc, LAUNCHER_STATE_PREPARING);
+             break;
+          }
+        eina_list_free(ecs);
+     }
+
+   if (app_id)
+     {
+        lc->target.appid = eina_stringshare_add(app_id);
      }
-   eina_list_free(ecs);
 
    if (!lc->target.ec)
      {
@@ -871,7 +882,7 @@ _launcher_cb_launch_with_shared_widget(struct wl_client *client EINA_UNUSED,
          lc->ec, app_id?:"NONE", instance_id?:"NONE", pid);
 
    EINA_SAFETY_ON_TRUE_GOTO(lc->ec->visibility.obscured == E_VISIBILITY_FULLY_OBSCURED, send_stop);
-   EINA_SAFETY_ON_TRUE_GOTO(pid < 0, send_stop);
+   EINA_SAFETY_ON_TRUE_GOTO((pid < 0) && !(app_id), send_stop);
 
    // check current state of lc
    runner = _launcher_handler_launcher_runner_get();
@@ -895,25 +906,33 @@ _launcher_cb_launch_with_shared_widget(struct wl_client *client EINA_UNUSED,
      }
 
    lc->with_swl = EINA_TRUE; /* set swl flag */
-   lc->target.pid = pid;
    lc->serial = serial;
 
-   ecs = _launcher_clients_find_by_pid(pid);
-   EINA_LIST_FOREACH(ecs, l, target_ec)
+   if (pid > 0)
      {
-        if (e_object_is_del(E_OBJECT(target_ec))) continue;
-        if (e_client_util_ignored_get(target_ec)) continue;
+        lc->target.pid = pid;
+        ecs = _launcher_clients_find_by_pid(pid);
+        EINA_LIST_FOREACH(ecs, l, target_ec)
+          {
+             if (e_object_is_del(E_OBJECT(target_ec))) continue;
+             if (e_client_util_ignored_get(target_ec)) continue;
 
-        ELOGF("LAUNCHER_SRV", "Found target_ec:%p", lc->ec, target_ec);
+             ELOGF("LAUNCHER_SRV", "Found target_ec:%p", lc->ec, target_ec);
 
-        // send prepare_shared_widget event to callee
-        sent = _launcher_prepare_shared_widget_forward_send(lc, target_ec);
-        EINA_SAFETY_ON_FALSE_GOTO(sent, send_stop);
+             // send prepare_shared_widget event to callee
+             sent = _launcher_prepare_shared_widget_forward_send(lc, target_ec);
+             EINA_SAFETY_ON_FALSE_GOTO(sent, send_stop);
 
-        _launcher_state_set(lc, LAUNCHER_STATE_WAIT_RESPONSE_FROM_CALLEE);
-        break;
+             _launcher_state_set(lc, LAUNCHER_STATE_WAIT_RESPONSE_FROM_CALLEE);
+             break;
+          }
+        eina_list_free(ecs);
+     }
+
+   if (app_id)
+     {
+        lc->target.appid = eina_stringshare_add(app_id);
      }
-   eina_list_free(ecs);
 
    if (!lc->target.ec)
      {
@@ -1169,7 +1188,8 @@ _launcher_handler_launcher_runner_set(E_Service_Launcher *lc)
               _launcher_state_set(runner, LAUNCHER_STATE_CANCELED);
               _launcher_stop_send(runner);
               runner->target.pid = -1;
-              runner->serial = 0;
+              runner->target.ec = NULL;
+              E_FREE_FUNC(runner->target.appid, eina_stringshare_del);
               break;
            default:
               break;
@@ -1503,7 +1523,9 @@ _launcher_handler_cb_hook_intercept_show_helper(void *data, E_Client *ec)
          else if (ec == runner->ec) goto show_allow;  //show launcher
          break;
       case LAUNCHER_STATE_MONITORING:             //waiting creation of target window
-         if (ec->netwm.pid != runner->target.pid) goto show_allow;
+         if ((runner->target.pid > 0) &&
+             (ec->netwm.pid != runner->target.pid)) goto show_allow; //detect by pid
+         if ((runner->target.appid) && (runner->target.ec != ec)) goto show_allow; //detect by appid
          if (e_object_is_del(E_OBJECT(ec))) goto show_allow;
 
          if (runner->with_swl)
@@ -1532,6 +1554,9 @@ show_deny:
 send_stop:
    runner->target.pid = -1;
    runner->serial = 0;
+   runner->target.ec = NULL;
+   E_FREE_FUNC(runner->target.appid, eina_stringshare_del);
+
    _launcher_stop_send(runner);
    _launcher_state_set(runner, LAUNCHER_STATE_IDLE);
    _launcher_handler_launcher_runner_unset(runner);
@@ -1868,3 +1893,26 @@ e_service_launcher_release_shared_widget_launch(E_Client *ec)
           }
      }
 }
+
+EINTERN void
+e_service_launcher_callee_register(const char *appid, E_Client *callee)
+{
+   E_Service_Launcher *runner;
+
+   EINA_SAFETY_ON_NULL_RETURN(callee);
+
+   runner = _launcher_handler_launcher_runner_get();
+   EINA_SAFETY_ON_NULL_RETURN(runner);
+   EINA_SAFETY_ON_TRUE_RETURN(runner->state != LAUNCHER_STATE_MONITORING);
+
+   if (runner->target.appid)
+     {
+        if (!e_util_strcmp(appid, runner->target.appid))
+          {
+             runner->target.ec = callee;
+
+             ELOGF("LAUNCHER_SRV", "Register callee(%p)  by appid(%s)",
+                   runner->ec, runner->target.ec, runner->target.appid);
+          }
+     }
+}
index ec0225d8ba2b063ae79d75fd6c826827e2df1d34..b55df22836eb865128831d9090719a7e27d1ce1e 100644 (file)
@@ -9,5 +9,6 @@ EINTERN void              e_service_launcher_client_set(E_Client *ec);
 EINTERN void              e_service_launcher_client_unset(E_Client *ec);
 EINTERN void              e_service_launcher_prepare_send_with_shared_widget_info(E_Client *target_ec, const char *shared_widget_info, uint32_t state, uint32_t serial);
 EINTERN void              e_service_launcher_release_shared_widget_launch(E_Client *ec);
+EINTERN void              e_service_launcher_callee_register(const char *appid, E_Client *callee);
 
 #endif