Added layer_pending flag for updating only clients inlist 31/96331/4 accepted/tizen/3.0/common/20161114.082715 accepted/tizen/3.0/ivi/20161110.015452 accepted/tizen/3.0/mobile/20161110.015152 accepted/tizen/3.0/tv/20161110.015229 accepted/tizen/3.0/wearable/20161110.015406 accepted/tizen/common/20161109.140730 accepted/tizen/ivi/20161110.001659 accepted/tizen/mobile/20161110.001503 accepted/tizen/tv/20161110.001604 accepted/tizen/wearable/20161110.001637 submit/tizen/20161109.043305 submit/tizen_3.0/20161108.124320 submit/tizen_3.0_common/20161110.084657
authorMinJeong Kim <minjjj.kim@samsung.com>
Tue, 8 Nov 2016 09:23:52 +0000 (18:23 +0900)
committerMinJeong Kim <minjjj.kim@samsung.com>
Wed, 9 Nov 2016 08:00:57 +0000 (00:00 -0800)
Changes of stack are never applied while a client's layer is blocked.
To assure the changes of stack after end of the block, now we can use
layer_pending flag instead of layer_block flag.

Change-Id: Iff3e7c9f3bf31657e5997a78ff2ca2caafbbfa20
Signed-off-by: MinJeong Kim <minjjj.kim@samsung.com>
src/bin/e_client.c
src/bin/e_client.h
src/bin/e_comp_object.c

index 280f23188bc22644f81f6b922971028a67c2c32c..e37fc339439dd6c054cc388a9b22e3f54514840c 100644 (file)
@@ -1878,6 +1878,7 @@ _e_client_cb_evas_restack(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA
 
    if (e_object_is_del(data)) return;
    if (ec->layer_block) return;
+   if (ec->layer_pending) return;
    if (e_config->transient.raise && ec->transients)
      {
         Eina_List *list = eina_list_clone(ec->transients);
index 5770f6b3a0acd186a30804245bff6eed564d8705..5041e1b587ca9fafec37401ddb2635aec30f5603 100644 (file)
@@ -805,6 +805,7 @@ struct E_Client
    Eina_Bool unredirected_single : 1; //window has been selectively unredirected
    Eina_Bool shape_changed : 1;
    Eina_Bool layer_block : 1; // client is doing crazy stuff and should not be relayered in protocol
+   Eina_Bool layer_pending : 1; // change inlist stack but postpone evas stack
    Eina_Bool ignored : 1; // client is comp-ignored
    Eina_Bool no_shape_cut : 1; // client shape should not be cut
    Eina_Bool maximize_override : 1; // client is doing crazy stuff and should "just do it" when moving/resizing
index e086256a6881d6eb990587cdb22d0bb3b7a45e31..fa52a838f4d9611bb98f379ab4078d0c6c7e9cd8 100644 (file)
@@ -1360,7 +1360,7 @@ _e_comp_intercept_layer_set(void *data, Evas_Object *obj, int layer)
    unsigned int l = e_comp_canvas_layer_map(layer);
    int oldraise;
 
-   if (cw->ec->layer_block)
+   if ((cw->ec->layer_block) || (cw->ec->layer_pending))
      {
         /* doing a compositor effect, follow directions */
         evas_object_layer_set(obj, layer);
@@ -1465,8 +1465,13 @@ _e_comp_intercept_stack_helper(E_Comp_Object *cw, Evas_Object *stack, E_Comp_Obj
    Evas_Object *o = stack;
    Eina_Bool raising = stack_cb == evas_object_stack_above;
 
-   if (cw->ec->layer_block)
+   if ((cw->ec->layer_block) || (cw->ec->layer_pending))
      {
+        if (cw->ec->layer_pending)
+          e_comp_object_layer_update(cw->smart_obj,
+                                     raising? stack : NULL,
+                                     raising? NULL : stack);
+
         /* obey compositor effects! */
         if (cw->ec->layer == evas_object_layer_get(cw->smart_obj))
           evas_object_data_set(cw->smart_obj, "client_restack", (void*)1);
@@ -1475,9 +1480,14 @@ _e_comp_intercept_stack_helper(E_Comp_Object *cw, Evas_Object *stack, E_Comp_Obj
           evas_object_data_del(cw->smart_obj, "client_restack");
         return;
      }
+
+   cw2 = evas_object_data_get(o, "comp_obj");
+
    /* assume someone knew what they were doing during client init */
    if (cw->ec->new_client)
      layer = cw->ec->layer;
+   else if ((cw2) && (cw2->ec->layer_pending))
+     layer = cw2->ec->layer;
    else
      layer = evas_object_layer_get(stack);
    ecstack = e_client_below_get(cw->ec);
@@ -1491,7 +1501,6 @@ _e_comp_intercept_stack_helper(E_Comp_Object *cw, Evas_Object *stack, E_Comp_Obj
      }
 
    /* check if we're stacking below another client */
-   cw2 = evas_object_data_get(o, "comp_obj");
    while (!cw2)
      {
         /* check for non-client layer object */
@@ -1544,6 +1553,44 @@ _e_comp_intercept_stack_helper(E_Comp_Object *cw, Evas_Object *stack, E_Comp_Obj
      }
    else
      _e_comp_object_layers_add(cw, NULL, NULL, 0);
+
+   /* find new object for stacking if cw2 is on state of layer_pending */
+   if ((cw2) && (cw2->ec->layer_pending))
+     {
+        E_Client *new_stack = NULL;
+        if (raising)
+          {
+             while ((new_stack = e_client_below_get(cw2->ec)))
+               {
+                  if (new_stack == cw->ec) continue;
+                  if (new_stack->layer != cw2->ec->layer) break;
+                  if (!new_stack->layer_pending) break;
+               }
+             if ((new_stack) && (new_stack->layer == cw2->ec->layer))
+               stack = new_stack->frame;
+             else
+               {
+                  /* stack it above layer object */
+                  int below_layer;
+                  below_layer = (cw2->layer <= 0)? 0 : cw2->layer - 1 ;
+                  stack = e_comp->layers[below_layer].obj;
+               }
+          }
+        else
+          {
+             while ((new_stack = e_client_above_get(cw2->ec)))
+               {
+                  if (new_stack == cw->ec) continue;
+                  if (new_stack->layer != cw2->ec->layer) break;
+                  if (!new_stack->layer_pending) break;
+               }
+             if ((new_stack) && (new_stack->layer == cw2->ec->layer))
+               stack = new_stack->frame;
+             else
+               stack = e_comp->layers[cw2->layer].obj;
+          }
+     }
+
    /* set restack if stacking has changed */
    if (cw->ec->new_client || (!ecstack) || (ecstack->frame != o))
      evas_object_data_set(cw->smart_obj, "client_restack", (void*)1);
@@ -1594,8 +1641,11 @@ _e_comp_intercept_lower(void *data, Evas_Object *obj)
 
    TRACE_DS_BEGIN(COMP:INTERCEPT LOWER);
 
-   if (cw->ec->layer_block)
+   if ((cw->ec->layer_block) || (cw->ec->layer_pending))
      {
+        if (cw->ec->layer_pending)
+          e_comp_object_layer_update(obj, NULL, obj);
+
         evas_object_lower(obj);
         goto end;
      }
@@ -1626,8 +1676,11 @@ _e_comp_intercept_raise(void *data, Evas_Object *obj)
 
    TRACE_DS_BEGIN(COMP:INTERCEPT RAISE);
 
-   if (cw->ec->layer_block)
+   if ((cw->ec->layer_block) || (cw->ec->layer_pending))
      {
+        if (cw->ec->layer_pending)
+          e_comp_object_layer_update(obj, NULL, NULL);
+
         evas_object_raise(obj);
         goto end;
      }