e_policy_visibility: add a E_VIS_ICONIFY_STATE_RUNNING_UNICONIFY_RENDER_DONE state 67/191767/6 submit/tizen/20181030.101450
authorDoyoun Kang <doyoun.kang@samsung.com>
Tue, 23 Oct 2018 08:49:25 +0000 (17:49 +0900)
committerGwanglim Lee <gl77.lee@samsung.com>
Tue, 30 Oct 2018 08:41:22 +0000 (08:41 +0000)
There was a bug that the window which was pending uniconify by visibility didn't raise
even if it requested to activate.

[TOP] A win -> B win(32bit) -> C win [BOTTOM]

Above window stack,
when "A win" request to lower, then "B win" and "C win" are running uniconify_pending with
not_raise flag.
After "C win" is rendered, its internal state changed to E_VIS_ICONIFY_STATE_UNICONIC.
But e_client_uniconify() is not called because e is waiting for rendering of "B win".

In this time, if "C win" requests to activate, then this request is not added to pending list
because the state of "C win" is E_VIS_ICONIFY_STATE_UNICONIC.

As a result of this, the window stack is changed as below.
[TOP] B win(32bit) -> C win -> A win [BOTTOM]

But, the expected stack is as below.
[TOP] C win -> B win(32bit) -> A win [BOTTOM]

To fix this problem, we add a additional state - E_VIS_ICONIFY_STATE_RUNNING_UNICONIFY_RENDER_DONE.
It means that the window is rendered, but it remains iconic state.
So, the activate request of "C win" is added to the pending list in above case.

The E_VIS_ICONIFY_STATE_RUNNING_UNICONIFY_RENDER_DONE state
is changed to E_VIS_ICONIFY_STATE_UNICONIC after all pending windows are rendered.

Change-Id: I3fff995dbbad7f438e952616bc6840e7a92e2424

src/bin/e_policy_visibility.c
src/bin/e_policy_visibility_internal.h

index a6a87ea34ce1ab7d284d00f71a58e3e8620aa151..d40bb6daf7c4a85cff487ccd12875fbdc3925a4e 100644 (file)
@@ -98,6 +98,12 @@ _e_vis_client_is_uniconify_render_running(E_Vis_Client *vc)
    return (vc->state == E_VIS_ICONIFY_STATE_RUNNING_UNICONIFY);
 }
 
+static inline Eina_Bool
+_e_vis_client_is_uniconify_render_running_done(E_Vis_Client *vc)
+{
+   return (vc->state == E_VIS_ICONIFY_STATE_RUNNING_UNICONIFY_RENDER_DONE);
+}
+
 static void
 _e_pol_vis_hooks_clean(void)
 {
@@ -653,6 +659,21 @@ _e_vis_job_group_eval(E_Vis_Job_Group *group)
    return EINA_TRUE;
 }
 
+static void
+_e_vis_job_group_state_update(E_Vis_Job_Group *group)
+{
+   E_Vis_Job *job, *tmp;
+   EINA_CLIST_FOR_EACH_ENTRY_SAFE(job, tmp,
+                                  &group->job_head, E_Vis_Job, entry)
+     {
+        if (_e_vis_client_is_uniconify_render_running_done(job->vc))
+          {
+             job->vc->state = E_VIS_ICONIFY_STATE_UNICONIC;
+             VS_DBG(job->vc->ec, "\tUPDATE ICONIC STATE: %s", "UNICONIC");
+          }
+     }
+}
+
 static void
 _e_vis_job_queue_update(void)
 {
@@ -677,6 +698,10 @@ _e_vis_job_eval(void)
         /* if all of job in the group is ready */
         if (!_e_vis_job_group_eval(group))
           break;
+
+        /* updates state to uniconic from render_done */
+        _e_vis_job_group_state_update(group);
+
         /* execute all of job in the group */
         _e_vis_job_group_exec(group);
      }
@@ -881,8 +906,8 @@ _e_vis_client_grab_remove(E_Vis_Client *vc, E_Vis_Grab *grab)
      {
         if (vc->state == E_VIS_ICONIFY_STATE_RUNNING_UNICONIFY)
           {
-             vc->state = E_VIS_ICONIFY_STATE_UNICONIC;
-             VS_DBG(vc->ec, "\tUPDATE ICONIC STATE: %s", "UNICONIC");
+             vc->state = E_VIS_ICONIFY_STATE_RUNNING_UNICONIFY_RENDER_DONE;
+             VS_DBG(vc->ec, "\tUPDATE ICONIC STATE: %s", STATE_STR(vc));
           }
 
         _e_vis_job_eval();
@@ -1367,6 +1392,9 @@ _e_vis_client_add_uniconify_render_pending(E_Vis_Client *vc, E_Vis_Job_Type type
    if (!_e_vis_client_is_uniconify_render_necessary(vc))
      return EINA_FALSE;
 
+   if (_e_vis_client_is_uniconify_render_running_done(vc))
+     goto end;
+
    ec->exp_iconify.not_raise = !raise;
 
    VS_DBG(ec, "BEGIN Uniconify render: raise %d", raise);
@@ -2193,9 +2221,14 @@ e_policy_visibility_client_is_uniconic(E_Client *ec)
 E_API Eina_Bool
 e_policy_visibility_client_is_uniconify_render_running(E_Client *ec)
 {
+   Eina_Bool running = EINA_FALSE;
    E_VIS_CLIENT_GET_OR_RETURN_VAL(vc, ec, EINA_FALSE);
 
-   return _e_vis_client_is_uniconify_render_running(vc);
+   if ((_e_vis_client_is_uniconify_render_running(vc)) ||
+       (_e_vis_client_is_uniconify_render_running_done(vc)))
+     running = EINA_TRUE;
+
+   return running;
 }
 
 E_API E_Pol_Vis_Hook *
index eb57795b047c6ecf32386680351b7a600a6b0b8d..e2c88e27a800acbca7aa68bd606ac7d956871cb7 100644 (file)
@@ -9,6 +9,7 @@
    (vc->state == E_VIS_ICONIFY_STATE_RUNNING_UNICONIFY_WAITING_FOR_CHILD ? "WAITING_FOR_CHILD" : \
     vc->state == E_VIS_ICONIFY_STATE_UNICONIC ? "UNICONIC" :                                     \
     vc->state == E_VIS_ICONIFY_STATE_ICONIC ? "ICONIC" :                                         \
+    vc->state == E_VIS_ICONIFY_STATE_RUNNING_UNICONIFY_RENDER_DONE ? "RUNNING UNICONIFY RENDER DONE" :  \
     vc->state == E_VIS_ICONIFY_STATE_RUNNING_UNICONIFY ? "RUNNING UNICONIFY" : "OTHERS")
 
 #define VS_DBG(ec, f, x...) \
@@ -95,6 +96,7 @@ typedef enum
    E_VIS_ICONIFY_STATE_UNICONIC,
    E_VIS_ICONIFY_STATE_ICONIC,
    E_VIS_ICONIFY_STATE_RUNNING_UNICONIFY,
+   E_VIS_ICONIFY_STATE_RUNNING_UNICONIFY_RENDER_DONE,
    E_VIS_ICONIFY_STATE_RUNNING_UNICONIFY_WAITING_FOR_CHILD,
 } E_Vis_Iconify_State;