policy: apply deiconify_approve feature to the iconify request
authorDoyoun Kang <doyoun.kang@samsung.com>
Tue, 30 May 2017 07:51:19 +0000 (16:51 +0900)
committerJuyeon Lee <juyeonne.lee@samsung.com>
Thu, 1 Jun 2017 05:18:30 +0000 (14:18 +0900)
Change-Id: If08d345d68214b7a816b42d1513d527e07ab67bd

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

index 7a9d20dbdcce20262d8923738a7cb2dca92c5c7e..b86687ac6f3134417d4cb73e2736d15f5491fd50 100644 (file)
@@ -500,6 +500,7 @@ _e_vis_job_add(E_Vis_Client *vc, E_Vis_Job_Type type, Ecore_Task_Cb timeout_func
 
    if ((job->type == E_VIS_JOB_TYPE_LOWER) ||
        (job->type == E_VIS_JOB_TYPE_HIDE) ||
+       (job->type == E_VIS_JOB_TYPE_ICONIFY) ||
        (job->type == E_VIS_JOB_TYPE_LAYER_LOWER))
      e_comp_canvas_norender_push();
 
@@ -515,6 +516,7 @@ _e_vis_job_del(Eina_Clist *elem)
    job = EINA_CLIST_ENTRY(elem, E_Vis_Job, entry);
    if ((job->type == E_VIS_JOB_TYPE_LOWER) ||
        (job->type == E_VIS_JOB_TYPE_HIDE) ||
+       (job->type == E_VIS_JOB_TYPE_ICONIFY) ||
        (job->type == E_VIS_JOB_TYPE_LAYER_LOWER))
      e_comp_canvas_norender_pop();
    E_FREE_FUNC(job->timer, ecore_timer_del);
@@ -1128,6 +1130,10 @@ _e_vis_ec_job_exec(E_Client *ec, E_Vis_Job_Type type)
          e_comp_canvas_norender_pop();
          if (vc) evas_object_layer_set(ec->frame, vc->layer);
          break;
+      case E_VIS_JOB_TYPE_ICONIFY:
+         e_comp_canvas_norender_pop();
+         e_client_iconify(ec);
+         break;
       case E_VIS_JOB_TYPE_SHOW:
          /* checks for dectecting hide request after show request */
          if ((ec) && (!e_object_is_del(E_OBJECT(ec))) &&
@@ -1546,6 +1552,49 @@ e_policy_visibility_client_lower(E_Client *ec)
    return EINA_TRUE;
 }
 
+E_API Eina_Bool
+e_policy_visibility_client_iconify(E_Client *ec)
+{
+   E_Client *child;
+   Eina_List *l;
+
+   if (!e_config->use_buffer_flush) return EINA_FALSE;
+
+   E_VIS_CLIENT_GET_OR_RETURN_VAL(vc, ec, EINA_FALSE);
+
+   VS_DBG(ec, "API ENTRY | ICONIFY");
+   if (ec->iconic) return EINA_FALSE;
+
+   /* find activity client among the clients to be lower */
+   if (!_e_vis_ec_foreground_check(ec, !!e_config->transient.iconify))
+     {
+        VS_INF(ec, "NO activity clients");
+        return EINA_FALSE;
+     }
+
+   if (!_e_vis_ec_below_uniconify(ec))
+     {
+        VS_DBG(ec, "Failed to uniconify below client");
+        return EINA_FALSE;
+     }
+
+   /* add lower job, it will be executed after below activity client finishs updating */
+   _e_vis_client_job_add(vc, E_VIS_JOB_TYPE_ICONIFY);
+   if (e_config->transient.iconify)
+     {
+        l = eina_list_clone(ec->transients);
+
+        EINA_LIST_FREE(l, child)
+          {
+             E_VIS_CLIENT_GET(vc2, child);
+             if (!vc2) continue;
+             _e_vis_client_job_add(vc2, E_VIS_JOB_TYPE_ICONIFY);
+          }
+     }
+
+   return EINA_TRUE;
+}
+
 E_API Eina_Bool
 e_policy_visibility_client_uniconify(E_Client *ec, Eina_Bool raise)
 {
index 46f3059aaa733b9868b9a28eb0118be609c88d7e..04d564d098b859a01943cdd7c789e113b37c2449 100644 (file)
@@ -23,6 +23,7 @@ E_API Eina_List                  *e_policy_visibility_foreground_clients_get(voi
 E_API Eina_Bool                   e_policy_visibility_client_is_activity(E_Client *ec);
 E_API Eina_Bool                   e_policy_visibility_client_lower(E_Client *ec);
 E_API Eina_Bool                   e_policy_visibility_client_raise(E_Client *ec);
+E_API Eina_Bool                   e_policy_visibility_client_iconify(E_Client *ec);
 E_API Eina_Bool                   e_policy_visibility_client_uniconify(E_Client *ec, Eina_Bool raise);
 E_API Eina_Bool                   e_policy_visibility_client_activate(E_Client *ec);
 E_API Eina_Bool                   e_policy_visibility_client_layer_lower(E_Client *ec, E_Layer layer);
index 6b44078d0f671e22ecfddaab864ed10c41170538..2d0209de0d347dd5e472024e97281c983837c712 100644 (file)
@@ -110,6 +110,7 @@ typedef enum
    E_VIS_JOB_TYPE_UNICONIFY_BY_VISIBILITY,
    E_VIS_JOB_TYPE_LAYER_LOWER,
    E_VIS_JOB_TYPE_DEFER_MOVE,
+   E_VIS_JOB_TYPE_ICONIFY,
 } E_Vis_Job_Type;
 
 /* external data structure */
index abf61c5359532ccdaeb7588a2b4b5370574b1414..17083b46165e851feafa548ae35f3652d65ddc2d 100644 (file)
@@ -2210,6 +2210,10 @@ e_policy_wl_iconify(E_Client *ec)
 
    ELOG("Set ICONIFY BY CLIENT", ec->pixmap, ec);
    ec->exp_iconify.by_client = 1;
+
+   if (e_policy_visibility_client_iconify(ec))
+     return;
+
    e_client_iconify(ec);
 
    EC_CHANGED(ec);