e_service_launcher: changed sending forward prepare event to caller immediately when... 73/232273/1 accepted/tizen/5.5/unified/20200504.031601 submit/tizen_5.5/20200430.075944
authorGwanglim Lee <gl77.lee@samsung.com>
Wed, 29 Apr 2020 12:17:28 +0000 (21:17 +0900)
committerGwanglim Lee <gl77.lee@samsung.com>
Wed, 29 Apr 2020 12:22:57 +0000 (21:22 +0900)
Change-Id: I0594f407e6dfab168411080ca1f7c6b08a688ad8

src/bin/e_policy_wl.c
src/bin/services/e_service_launcher.c
src/bin/services/e_service_launcher.h

index 11b13ece62c9ec594240d6d0469348cd903f4e9f..5c89a4d07957de6cc8349a0ad25b574fdc371dfa 100644 (file)
@@ -6050,6 +6050,41 @@ _launchscreen_splash_setup(E_Policy_Wl_Tzlaunch_Splash *splash,
         ec->indicator.opacity_mode = TIZEN_INDICATOR_OPACITY_MODE_BG_TRANSPARENT;
      }
 
+   // Parse extra config for launcher_service
+   if ((extra_config) && (extra_config->size))
+     {
+        char *p_char;
+        int len = 0;
+        int size = extra_config->size;
+
+        while (size > 0)
+          {
+             p_char = extra_config->data + len;
+             len = strlen(p_char) + 1;
+             size -= len;
+
+             if (!e_util_strcmp(p_char, SPLASH_CONFIG_CUSTOM_EFFECT_CALLEE))
+               {
+                  // parse next data(appid) from array
+                  if (size > 0)
+                    {
+                       p_char = p_char + len;
+                       len = strlen(p_char) + 1;
+                       size -= len;
+
+                       splash->appid = eina_stringshare_add(p_char);
+                       splash->custom_effect_callee = EINA_TRUE;
+
+                       ELOGF("TZPOL",
+                             "Launchscreen setup | custom effect callee set appid(%s)",
+                             ec, splash->appid);
+                    }
+                  splash->valid = EINA_TRUE;
+                  return EINA_TRUE;
+               }
+          }
+     }
+
    intercepted = e_policy_interceptor_call(E_POLICY_INTERCEPT_LAUNCHSCREEN_OBJECT_SETUP,
                                            ec,
                                            pfname, ftype, depth,
@@ -6127,40 +6162,6 @@ _launchscreen_splash_setup(E_Policy_Wl_Tzlaunch_Splash *splash,
 
    /* Post job of setup content_type */
 
-   //Parse extra config
-   if ((extra_config) && (extra_config->size))
-     {
-        char *p_char;
-        int len = 0;
-        int size = extra_config->size;
-
-        while (size > 0)
-          {
-             p_char = extra_config->data + len;
-             len = strlen(p_char) + 1;
-             size -= len;
-
-             if (!e_util_strcmp(p_char, SPLASH_CONFIG_CUSTOM_EFFECT_CALLEE))
-               {
-                  //parse next data(appid) from array
-                  if (size > 0)
-                    {
-                       p_char = p_char + len;
-                       len = strlen(p_char) + 1;
-                       size -= len;
-
-                       splash->appid = eina_stringshare_add(p_char);
-                       splash->custom_effect_callee = EINA_TRUE;
-
-                       ELOGF("TZPOL",
-                             "Launchscreen setup | custom effect callee set appid(%s)",
-                             ec, splash->appid);
-                    }
-                  else break;
-               }
-          }
-     }
-
    //Setup indicator
    if (indicator)
      {
@@ -6298,6 +6299,40 @@ _tzlaunch_splash_iface_cb_owner(struct wl_client *client EINA_UNUSED, struct wl_
    eina_list_free(clients);
 
    old_ec = tzlaunch_splash->ec;
+
+   if (tzlaunch_splash->custom_effect_callee)
+     {
+        old_ec->ignored = EINA_FALSE;
+        old_ec->visible = EINA_TRUE;
+        if (old_ec->new_client)
+          e_comp->new_clients--;
+        old_ec->new_client = EINA_FALSE;
+        old_ec->icccm.accepts_focus = EINA_TRUE;
+
+        if (new_ec)
+          e_service_launcher_callee_register(new_ec, pid, tzlaunch_splash->appid, tzlaunch_splash->path, SPLASH_GROUP_NAME);
+        else
+          e_service_launcher_callee_register(old_ec, pid, tzlaunch_splash->appid, tzlaunch_splash->path, SPLASH_GROUP_NAME);
+
+        if (tzlaunch_splash->timeout)
+          {
+             ecore_timer_del(tzlaunch_splash->timeout);
+             tzlaunch_splash->timeout = NULL;
+          }
+        if (!e_config->launchscreen_without_timer)
+          tzlaunch_splash->timeout = ecore_timer_add(e_config->launchscreen_timeout, _launchscreen_splash_timeout, tzlaunch_splash);
+
+        ELOGF("TZPOL", "Launchscreen img(%d) set owner pid: %d new_ec:%p old_ec:%p",
+              tzlaunch_splash->ec,
+              wl_resource_get_id(res_tzlaunch_splash), pid, new_ec, old_ec);
+
+        tzlaunch_splash->pid = pid;
+        tzlaunch_splash->ec->netwm.pid = pid;
+        tzlaunch_splash->ec->use_splash = EINA_TRUE;
+
+        return;
+     }
+
    if (new_ec)
      {
         if (e_comp_object_content_set(new_ec->frame,
@@ -6316,11 +6351,6 @@ _tzlaunch_splash_iface_cb_owner(struct wl_client *client EINA_UNUSED, struct wl_
 
              e_comp->launchscrns = eina_list_append(e_comp->launchscrns, new_ec);
 
-             if (tzlaunch_splash->custom_effect_callee)
-               {
-                  e_service_launcher_callee_register(new_ec, tzlaunch_splash->appid, tzlaunch_splash->path, SPLASH_GROUP_NAME);
-               }
-
              evas_object_show(new_ec->frame);
              e_client_raise(new_ec);
 
@@ -6359,11 +6389,6 @@ _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;
 
-        if (tzlaunch_splash->custom_effect_callee)
-          {
-             e_service_launcher_callee_register(old_ec, tzlaunch_splash->appid, tzlaunch_splash->path, SPLASH_GROUP_NAME);
-          }
-
         evas_object_show(old_ec->frame);
         e_client_raise(old_ec);
      }
index bb54c0d03a6315a172728be05f40216a76811314..24bef233fe20486dd585e12735b41a0461d38575 100644 (file)
@@ -311,56 +311,77 @@ _launcher_prepare_send(E_Service_Launcher *lc,
    wl_array_init(&info_array);
    if (lc->direction == TWS_SERVICE_LAUNCHER_DIRECTION_FORWARD)
      {
-        content_type = e_comp_object_content_type_get(target_ec->frame);
-        switch (content_type)
+        if (lc->target.splash_path)
           {
-           case E_COMP_OBJECT_CONTENT_TYPE_EXT_IMAGE:
-              content = e_comp_object_content_get(target_ec->frame);
-              EINA_SAFETY_ON_NULL_GOTO(content, fail);
+             target_type = TWS_SERVICE_LAUNCHER_TARGET_TYPE_EDJE;
+             target_path = lc->target.splash_path;
+             target_group = lc->target.splash_group;
 
-              target_type = TWS_SERVICE_LAUNCHER_TARGET_TYPE_IMAGE;
-              evas_object_image_file_get(content, &target_path, NULL);
-              EINA_SAFETY_ON_NULL_GOTO(target_path, fail);
+             len = strlen(target_path) + 1;
+             p_char = wl_array_add(&info_array, len);
+             EINA_SAFETY_ON_NULL_GOTO(p_char, fail);
 
-              len = strlen(target_path) + 1;
-              p_char = wl_array_add(&info_array, len);
-              EINA_SAFETY_ON_NULL_GOTO(p_char, fail);
+             strncpy(p_char, target_path, len);
 
-              strncpy(p_char, target_path, len);
-              break;
-           case E_COMP_OBJECT_CONTENT_TYPE_EXT_EDJE:
-              content = e_comp_object_content_get(target_ec->frame);
-              EINA_SAFETY_ON_NULL_GOTO(content, fail);
+             len = strlen(target_group) + 1;
+             p_char = wl_array_add(&info_array, len);
+             EINA_SAFETY_ON_NULL_GOTO(p_char, fail);
 
-              target_type = TWS_SERVICE_LAUNCHER_TARGET_TYPE_EDJE;
-              target_path = lc->target.splash_path;
-              target_group = lc->target.splash_group;
-              if ((!target_path) || (!target_group))
-                edje_object_file_get(content, &target_path, &target_group);
-              EINA_SAFETY_ON_NULL_GOTO(target_path, fail);
-              EINA_SAFETY_ON_NULL_GOTO(target_group, fail);
+             strncpy(p_char, target_group, len);
+          }
+        else
+          {
+             content_type = e_comp_object_content_type_get(target_ec->frame);
+             switch (content_type)
+               {
+                case E_COMP_OBJECT_CONTENT_TYPE_EXT_IMAGE:
+                   content = e_comp_object_content_get(target_ec->frame);
+                   EINA_SAFETY_ON_NULL_GOTO(content, fail);
 
-              len = strlen(target_path) + 1;
-              p_char = wl_array_add(&info_array, len);
-              EINA_SAFETY_ON_NULL_GOTO(p_char, fail);
+                   target_type = TWS_SERVICE_LAUNCHER_TARGET_TYPE_IMAGE;
+                   evas_object_image_file_get(content, &target_path, NULL);
+                   EINA_SAFETY_ON_NULL_GOTO(target_path, fail);
 
-              strncpy(p_char, target_path, len);
+                   len = strlen(target_path) + 1;
+                   p_char = wl_array_add(&info_array, len);
+                   EINA_SAFETY_ON_NULL_GOTO(p_char, fail);
 
-              len = strlen(target_group) + 1;
-              p_char = wl_array_add(&info_array, len);
-              EINA_SAFETY_ON_NULL_GOTO(p_char, fail);
+                   strncpy(p_char, target_path, len);
+                   break;
+                case E_COMP_OBJECT_CONTENT_TYPE_EXT_EDJE:
+                   content = e_comp_object_content_get(target_ec->frame);
+                   EINA_SAFETY_ON_NULL_GOTO(content, fail);
 
-              strncpy(p_char, target_group, len);
+                   target_type = TWS_SERVICE_LAUNCHER_TARGET_TYPE_EDJE;
+                   target_path = lc->target.splash_path;
+                   target_group = lc->target.splash_group;
+                   if ((!target_path) || (!target_group))
+                     edje_object_file_get(content, &target_path, &target_group);
+                   EINA_SAFETY_ON_NULL_GOTO(target_path, fail);
+                   EINA_SAFETY_ON_NULL_GOTO(target_group, fail);
 
-              break;
-           default:
-              target_type = TWS_SERVICE_LAUNCHER_TARGET_TYPE_REMOTE_SURFACE;
-              res_id = e_pixmap_res_id_get(target_ec->pixmap);
+                   len = strlen(target_path) + 1;
+                   p_char = wl_array_add(&info_array, len);
+                   EINA_SAFETY_ON_NULL_GOTO(p_char, fail);
+
+                   strncpy(p_char, target_path, len);
+
+                   len = strlen(target_group) + 1;
+                   p_char = wl_array_add(&info_array, len);
+                   EINA_SAFETY_ON_NULL_GOTO(p_char, fail);
 
-              p_u32 = wl_array_add(&info_array, sizeof(uint32_t));
-              EINA_SAFETY_ON_NULL_GOTO(p_u32, fail);
+                   strncpy(p_char, target_group, len);
 
-              *p_u32 = res_id;
+                   break;
+                default:
+                   target_type = TWS_SERVICE_LAUNCHER_TARGET_TYPE_REMOTE_SURFACE;
+                   res_id = e_pixmap_res_id_get(target_ec->pixmap);
+
+                   p_u32 = wl_array_add(&info_array, sizeof(uint32_t));
+                   EINA_SAFETY_ON_NULL_GOTO(p_u32, fail);
+
+                   *p_u32 = res_id;
+               }
           }
      }
    else
@@ -2068,8 +2089,40 @@ e_service_launcher_release_shared_widget_launch(E_Client *ec)
      }
 }
 
+static void
+_do_launch_splash_image(E_Service_Launcher *lc)
+{
+   E_Service_Launcher *pre_runner;
+   Eina_Bool sent = EINA_FALSE;
+
+   ELOGF("LAUNCHER_SRV", "Splash launching callee pid:%d appid(%s)",
+         lc->ec, lc->target.pid, lc->target.appid);
+
+   EINA_SAFETY_ON_TRUE_RETURN(lc->ec->visibility.obscured == E_VISIBILITY_FULLY_OBSCURED);
+   EINA_SAFETY_ON_FALSE_RETURN(lc->target.pid >= 0);
+
+   pre_runner = _launcher_handler_launcher_pre_runner_get();
+   if (pre_runner == lc)
+     {
+        _launcher_handler_launcher_pre_runner_set(NULL);
+        _launcher_launched_ec_set(lc, NULL);
+     }
+
+   lc->serial = wl_display_next_serial(e_comp_wl->wl.disp);
+
+   ELOGF("LAUNCHER_SRV", "target_ec:%p", lc->ec, lc->target.ec);
+
+   sent = _launcher_prepare_forward_send(lc, lc->target.ec);
+   EINA_SAFETY_ON_FALSE_RETURN(sent);
+
+   _launcher_state_set(lc, LAUNCHER_STATE_PREPARING);
+   _launcher_handler_launcher_runner_set(lc);
+
+   return;
+}
+
 EINTERN void
-e_service_launcher_callee_register(E_Client *callee, const char *appid, const char *splash_path, const char *splash_group)
+e_service_launcher_callee_register(E_Client *callee, pid_t pid, const char *appid, const char *splash_path, const char *splash_group)
 {
    E_Service_Launcher *runner;
 
@@ -2084,11 +2137,15 @@ e_service_launcher_callee_register(E_Client *callee, const char *appid, const ch
         if (!e_util_strcmp(appid, runner->target.appid))
           {
              runner->target.ec = callee;
+             runner->target.pid = pid;
              runner->target.splash_path = eina_stringshare_add(splash_path);
              runner->target.splash_group = eina_stringshare_add(splash_group);
 
-             ELOGF("LAUNCHER_SRV", "Register callee(%p)  by appid(%s)",
-                   runner->ec, runner->target.ec, runner->target.appid);
+             ELOGF("LAUNCHER_SRV", "Register callee(%p)  by appid(%s) path:%s launch splash image",
+                   runner->ec, runner->target.ec, runner->target.appid, runner->target.splash_path);
+
+             if (runner->target.ec)
+               _do_launch_splash_image(runner);
           }
      }
 }
index 0b84d63b6b8893098d5bf0be54c13ed724dc2805..abd4d399a5a7c890e1bba27aa9eb43ca75d7517d 100644 (file)
@@ -10,7 +10,7 @@ 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(E_Client *callee, const char *appid, const char *splash_path, const char *splash_group);
+EINTERN void              e_service_launcher_callee_register(E_Client *callee, pid_t pid, const char *appid, const char *splash_path, const char *splash_group);
 EINTERN void              e_service_launcher_appid_register(const char *appid, pid_t pid);
 
 #endif