wl_desktop_shell/e_policy_visibility: add a e_policy_visibility_client_hide_job_cancel 31/170331/2
authorDoyoun Kang <doyoun.kang@samsung.com>
Mon, 19 Feb 2018 07:28:59 +0000 (16:28 +0900)
committerDoyoun Kang <doyoun.kang@samsung.com>
Mon, 19 Feb 2018 07:32:57 +0000 (07:32 +0000)
There was a bug that the window was not shown when an app called hide and show window continuously.
To fix this, e cancels pending_hide job while handling map request.

Change-Id: Ic95b731a1566a8afca642f13de4bace4bccaf5d4

src/bin/e_policy_visibility.c
src/bin/e_policy_visibility.h
src/modules/wl_desktop_shell/e_mod_main.c

index 3592de9760de1ed4ff57997e0d8c2860ac72b974..6d82eab45bf9699d3f80fb2923a8f7d1931cd0f1 100644 (file)
@@ -674,6 +674,41 @@ _e_vis_job_eval(void)
    INF("VISIBILITY | Job Eval End");
 }
 
+static Eina_Bool
+_e_vis_job_cancel(E_Vis_Client *vc, E_Vis_Job_Type type)
+{
+   Eina_Bool ret = EINA_FALSE;
+   E_Vis_Job_Group *group, *tmp_group;
+   E_Vis_Job *job, *tmp_job;
+
+   /* update queue before deleting */
+   _e_vis_job_queue_update();
+
+   EINA_CLIST_FOR_EACH_ENTRY_SAFE(group, tmp_group,
+                                  &pol_job_group_head, E_Vis_Job_Group, entry)
+     {
+        EINA_CLIST_FOR_EACH_ENTRY_SAFE(job, tmp_job,
+                                       &group->job_head, E_Vis_Job, entry)
+          {
+             if (job->vc != vc) continue;
+             if (job->type != type) continue;
+
+             VS_INF(vc->ec, "Find Job:%p, type:%d", job, type);
+             _e_vis_job_del(&job->entry);
+             vc->job.count--;
+             VS_INF(vc->ec, "Decrease VC JOB count:%d by cancel", vc->job.count);
+             ret = EINA_TRUE;
+          }
+        if (!eina_clist_empty(&group->job_head)) continue;
+        _e_vis_job_group_del(&group->entry);
+     }
+
+   /* evaluate job list after deleting an element */
+   _e_vis_job_eval();
+
+   return ret;
+}
+
 static void
 _e_vis_job_del_by_client(E_Vis_Client *vc)
 {
@@ -1864,6 +1899,16 @@ e_policy_visibility_client_grab_cancel(E_Client *ec)
    return _e_vis_client_grab_cancel(vc);
 }
 
+E_API Eina_Bool
+e_policy_visibility_client_hide_job_cancel(E_Client *ec)
+{
+   if (!ec) return EINA_FALSE;
+   E_VIS_CLIENT_GET_OR_RETURN_VAL(vc, ec, EINA_FALSE);
+
+   VS_INF(ec, "Find and Cancel HIDE job...");
+   return _e_vis_job_cancel(vc, E_VIS_JOB_TYPE_HIDE);
+}
+
 E_API Eina_Bool
 e_policy_visibility_client_raise(E_Client *ec)
 {
index 4ab541f5d14d8e142bcc5f8c7ea6cedf55a33974..0669987c00db89cc31bc6b71601bec58f8b7d351 100644 (file)
@@ -30,6 +30,7 @@ E_API Eina_Bool                   e_policy_visibility_client_layer_lower(E_Clien
 E_API E_Vis_Grab                 *e_policy_visibility_client_grab_get(E_Client *ec, const char *name);
 E_API void                        e_policy_visibility_client_grab_release(E_Vis_Grab *grab);
 E_API Eina_Bool                   e_policy_visibility_client_grab_cancel(E_Client *ec);
+E_API Eina_Bool                   e_policy_visibility_client_hide_job_cancel(E_Client *ec);
 E_API E_Pol_Vis_Hook             *e_policy_visibility_hook_add(E_Pol_Vis_Hook_Type type, E_Pol_Vis_Hook_Cb cb, const void *data);
 E_API void                        e_policy_visibility_hook_del(E_Pol_Vis_Hook *h);
 E_API Eina_Bool                   e_policy_visibility_client_is_iconic(E_Client *ec);
index ca96d330be5bf9d58d8a3ecfa0bbe5e1660ed6f5..7971e485f8c1ab5cc7f2788e5b7dbd8ad6b9618a 100644 (file)
@@ -547,6 +547,8 @@ _e_shell_client_map_common_post(E_Client *ec)
         ec->first_mapped = 1;
      }
 
+   e_policy_visibility_client_hide_job_cancel(ec);
+
    ELOGF("COMP", "Un-Set launching flag", ec->pixmap, ec);
    ec->launching = EINA_FALSE;