visibility: cancel waiting_for_child when child gets be hidden or lowered 44/116044/2 accepted/tizen/3.0/common/20170223.122438 accepted/tizen/3.0/ivi/20170223.073839 accepted/tizen/3.0/mobile/20170223.073416 accepted/tizen/3.0/tv/20170223.073617 accepted/tizen/3.0/wearable/20170223.073659 accepted/tizen/common/20170223.182302 accepted/tizen/ivi/20170223.120051 accepted/tizen/mobile/20170223.115728 accepted/tizen/tv/20170223.115855 accepted/tizen/wearable/20170223.120000 submit/tizen/20170223.010932 submit/tizen/20170223.051206 submit/tizen_3.0/20170223.010909 submit/tizen_3.0/20170223.051245
authorMinJeong Kim <minjjj.kim@samsung.com>
Wed, 22 Feb 2017 14:34:05 +0000 (23:34 +0900)
committerDoyoun Kang <doyoun.kang@samsung.com>
Thu, 23 Feb 2017 01:04:06 +0000 (17:04 -0800)
Change-Id: I44fc4aa9b151028a0a671bfa06d1b786c1f35d84
Signed-off-by: MinJeong Kim <minjjj.kim@samsung.com>
src/bin/e_policy_visibility.c
src/bin/e_policy_visibility_internal.h

index 36d228608f740271e08c799aa18243d80b935ea6..15e5b6838d99f9e8c2760d0c1f678c9382673ed0 100644 (file)
@@ -46,6 +46,7 @@ static void              _e_vis_ec_job_exec(E_Client *ec, E_Vis_Job_Type type);
 static void              _e_vis_ec_setup(E_Client *ec);
 static void              _e_vis_ec_reset(E_Client *ec);
 static Eina_Bool         _e_vis_ec_below_uniconify(E_Client *ec);
+static void              _e_vis_cb_child_launch_done(void *data, Evas_Object *obj, const char *signal, const char *source);
 
 static E_Vis            *pol_vis = NULL;
 /* the list for E_Vis_Job */
@@ -669,6 +670,7 @@ static Eina_Bool
 _e_vis_client_cb_buffer_attach(void *data, int type EINA_UNUSED, void *event)
 {
    E_Vis_Client *vc;
+   E_Vis_Grab *grab;
    E_Client *ec;
    E_Event_Client *ev;
 
@@ -678,15 +680,20 @@ _e_vis_client_cb_buffer_attach(void *data, int type EINA_UNUSED, void *event)
      goto renew;
 
    ec = vc->ec;
+   grab = vc->grab;
 
    VS_DBG(ec, "FINISH Uniconify render");
 
-   /* force update */
+   /* force update
+    * NOTE: this update can invoke some functions related to visibility grab */
    e_comp_object_damage(ec->frame, 0, 0, ec->w, ec->h);
    e_comp_object_dirty(ec->frame);
    e_comp_object_render(ec->frame);
 
-   E_FREE_FUNC(vc->grab, _e_vis_grab_release);
+   if (vc->grab == grab)
+     vc->grab = NULL;
+
+   E_FREE_FUNC(grab, _e_vis_grab_release);
    E_FREE_FUNC(vc->buf_attach, ecore_event_handler_del);
 renew:
    return ECORE_CALLBACK_PASS_ON;
@@ -711,6 +718,10 @@ _e_vis_client_job_exec(E_Vis_Client *vc, E_Vis_Job_Type type)
       case E_VIS_JOB_TYPE_ACTIVATE:
       case E_VIS_JOB_TYPE_UNICONIFY:
       case E_VIS_JOB_TYPE_UNICONIFY_BY_VISIBILITY:
+         /* check previous state first */
+         if (vc->state != E_VIS_ICONIFY_STATE_RUNNING_UNICONIFY_WAITING_FOR_CHILD)
+           vc->state = E_VIS_ICONIFY_STATE_UNICONIC;
+         break;
       case E_VIS_JOB_TYPE_SHOW:
          vc->state = E_VIS_ICONIFY_STATE_UNICONIC;
          break;
@@ -1101,6 +1112,16 @@ _e_vis_ec_job_exec(E_Client *ec, E_Vis_Job_Type type)
              (ec->visible) && (!ec->hidden) &&
              (!ec->iconic) && (!ec->ignored))
            evas_object_show(ec->frame);
+
+         if ((vc) && (vc->wait_for_child))
+           {
+              e_comp_object_signal_callback_del_full(vc->wait_for_child->frame,
+                                                     "e,action,launch,done", "e",
+                                                     _e_vis_cb_child_launch_done, vc);
+              e_pixmap_free(vc->wait_for_child->pixmap);
+              e_object_delay_del_unref(E_OBJECT(vc->wait_for_child));
+              vc->wait_for_child = NULL;
+           }
          break;
       case E_VIS_JOB_TYPE_DEFER_MOVE:
          /* handle defered job regarding move */
@@ -1181,6 +1202,19 @@ _e_vis_ec_below_uniconify(E_Client *ec)
      {
         EINA_LIST_FOREACH(below_list, l, below)
           {
+             if (below->ec == ec->parent)
+               {
+                  /* Check if its parent is waiting for a child's uniconify.
+                   * if so cancel the waiting now.
+                   */
+                  if (below->state == E_VIS_ICONIFY_STATE_RUNNING_UNICONIFY_WAITING_FOR_CHILD)
+                    {
+                       E_FREE_FUNC(below->grab, _e_vis_grab_release);
+                       ret |= EINA_FALSE;
+                       continue;
+                    }
+               }
+
              ret |= _e_vis_client_uniconify_render(below, E_VIS_JOB_TYPE_UNICONIFY_BY_VISIBILITY, 0);
           }
      }
@@ -1284,6 +1318,11 @@ _e_vis_intercept_show(void *data EINA_UNUSED, E_Client *ec)
                                                          "e",
                                                          _e_vis_cb_child_launch_done,
                                                          vc);
+
+                       /* do not allow child's removal */
+                       vc->wait_for_child = topmost;
+                       e_pixmap_ref(topmost->pixmap);
+                       e_object_delay_del_ref(E_OBJECT(topmost));
                        _e_vis_client_job_add(vc, E_VIS_JOB_TYPE_SHOW);
                        return EINA_FALSE;
                     }
index 27e8ef782c212685195fcddeec0dceb4d66b0be7..9d1fd9d2c1dc9b04ab53e4de660c8b0d12bdbc12 100644 (file)
@@ -5,8 +5,9 @@
 #define E_CLEAR_GRAB_TIMEOUT   0.01
 
 #define NAME(ec)        ec->icccm.name ? ec->icccm.name : ""
-#define STATE_STR(vc)                                                         \
-   (vc->state == E_VIS_ICONIFY_STATE_UNICONIC ? "UNICONIC" :                  \
+#define STATE_STR(vc)                                                                            \
+   (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" : "RUNNING UNICONIFY")
 
 #define VS_DBG(ec, f, x...) \
@@ -143,6 +144,7 @@ struct _E_Vis_Client
    E_Vis_Iconify_State   state;
 
    E_Client             *ec;
+   E_Client             *wait_for_child; //who ec is waiting for its launching
 
    Ecore_Event_Handler  *buf_attach;