e_policy_visibility: add job for activating while handling activate request 10/238910/2 accepted/tizen/unified/20200720.125547 submit/tizen/20200720.080509
authorDoyoun Kang <doyoun.kang@samsung.com>
Mon, 20 Jul 2020 07:23:01 +0000 (16:23 +0900)
committerDoyoun Kang <doyoun.kang@samsung.com>
Mon, 20 Jul 2020 07:24:40 +0000 (16:24 +0900)
If there is a child which have to run uniconify_render_pending when a parent window request
to activate, e add the parent window to job to sync showing windows both parent and children.

Change-Id: I68c183cdb392a8488e1771f3d763ba5ea677ccd5

src/bin/e_policy_visibility.c

index 328b2a7..6e13f70 100644 (file)
@@ -2422,12 +2422,25 @@ e_policy_visibility_client_uniconify(E_Client *ec, Eina_Bool raise)
    return ret;
 }
 
+EINTERN Eina_Bool
+e_policy_visibility_client_wait_child(E_Client *ec, E_Vis_Job_Type type)
+{
+   E_VIS_CLIENT_GET_OR_RETURN_VAL(vc, ec, EINA_FALSE);
+
+   vc->grab = _e_vis_client_grab_get(vc, type, __func__);
+   _e_vis_client_job_add(vc, type);
+   E_FREE_FUNC(vc->grab, _e_vis_grab_release);
+
+   return EINA_TRUE;
+}
+
 E_API Eina_Bool
 e_policy_visibility_client_activate(E_Client *ec)
 {
    E_Client *child;
    Eina_List *l;
    Eina_Bool ret = EINA_FALSE;
+   Eina_Bool ret_child = EINA_FALSE;
 
    E_VIS_CLIENT_GET_OR_RETURN_VAL(vc, ec, EINA_FALSE);
 
@@ -2441,10 +2454,24 @@ e_policy_visibility_client_activate(E_Client *ec)
    /* uniconify its transients recursively */
    if (e_config->transient.iconify)
      {
+        Eina_Bool pend = EINA_FALSE;
         l = eina_list_clone(ec->transients);
 
         EINA_LIST_FREE(l, child)
-           ret |= e_policy_visibility_client_uniconify(child, EINA_TRUE);
+          {
+             pend = e_policy_visibility_client_uniconify(child, EINA_TRUE);
+             if (pend)
+               {
+                  ELOGF("POL", "uniconify_pending child (win:0x%08zx ec:%p)", ec, e_client_util_win_get(child), child);
+                  ret_child = pend;
+               }
+          }
+     }
+
+   if ((ret == EINA_FALSE) && (ret_child == EINA_TRUE))
+     {
+        e_policy_visibility_client_wait_child(ec, E_VIS_JOB_TYPE_ACTIVATE);
+        ret = EINA_TRUE;
      }
 
    /* TODO find topmost activity client and emit signal */