Update client stack with subsurface restacking 93/67493/1 accepted/tizen/common/20160427.144029 accepted/tizen/ivi/20160427.080718 accepted/tizen/mobile/20160427.080734 accepted/tizen/tv/20160427.080648 accepted/tizen/wearable/20160427.080702 submit/tizen/20160427.053234
authorMinJeong Kim <minjjj.kim@samsung.com>
Tue, 26 Apr 2016 07:58:56 +0000 (16:58 +0900)
committerMinJeong Kim <minjjj.kim@samsung.com>
Wed, 27 Apr 2016 04:13:09 +0000 (13:13 +0900)
This patch fixed the ploblem that the client stack list is not updated
when subsurfaces are restacked by EVAS_CALLBACK_RESTACK event handler.

Change-Id: Ibda950f3d9fb20b6b04c56d6379d95f43e34f7d0

src/bin/e_comp_object.c
src/bin/e_comp_object.h
src/bin/e_comp_wl.c

index 6a859c5da5246d9752848d4f8b72b776b6a5d5ab..2edd1bcd783673d361da66f856575999e2efa5eb 100644 (file)
@@ -4406,3 +4406,61 @@ e_comp_object_transform_bg_vertices_set(Evas_Object *obj, E_Util_Transform_Rect_
         evas_object_map_enable_set(cw->transform_bg_obj, EINA_FALSE);
      }
 }
+
+E_API void
+e_comp_object_layer_update(Evas_Object *obj,
+                           Evas_Object *above, Evas_Object *below)
+{
+   E_Comp_Object *cw2 = NULL;
+   Evas_Object *o = NULL;
+   short layer;
+
+   API_ENTRY;
+
+   if (cw->ec->layer_block) return;
+   if ((above) && (below))
+     {
+        ERR("Invalid layer update request! cw=%p", cw);
+        return;
+     }
+
+   o = above?:below;
+
+   if (o)
+     {
+        layer = evas_object_layer_get(o);
+        cw2 = evas_object_data_get(o, "comp_obj");
+        while (!cw2)
+          {
+             if (!e_util_strcmp(evas_object_name_get(o), "layer_obj")) break;
+
+             o = evas_object_above_get(o);
+             if ((!o) || (o == cw->smart_obj)) break;
+             if (evas_object_layer_get(o) != layer)
+               {
+                  o = e_comp->layers[e_comp_canvas_layer_map(E_LAYER_CLIENT_ALERT)].obj;
+               }
+             if (!o)
+               {
+                  E_Client *ec;
+                  ec = e_client_top_get();
+                  if (ec) o = ec->frame;
+               }
+
+             if (o) cw2 = evas_object_data_get(o, "comp_obj");
+          }
+     }
+
+   _e_comp_object_layers_remove(cw);
+   if (cw2)
+     {
+        if (above)
+          _e_comp_object_layers_add(cw, cw2, NULL, 0);
+        else if (o == obj)
+          _e_comp_object_layers_add(cw, NULL, NULL, above? 0 : 1);
+        else if (below)
+          _e_comp_object_layers_add(cw, NULL, cw2, 0);
+     }
+   else
+     _e_comp_object_layers_add(cw, NULL, NULL, 0);
+}
index 258481a1047ea8e515ae26be95ae23321800200b..7daadcf6adb831666c8d04074dd999d8d8c28649 100644 (file)
@@ -117,6 +117,8 @@ E_API void e_comp_object_mask_set(Evas_Object *obj, Eina_Bool set);
 E_API void e_comp_object_size_update(Evas_Object *obj, int w, int h);
 E_API void e_comp_object_transform_bg_set(Evas_Object *obj, Eina_Bool set);
 E_API void e_comp_object_transform_bg_vertices_set(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices);
+
+E_API void e_comp_object_layer_update(Evas_Object *obj, Evas_Object *above, Evas_Object *below);
 #endif
 #endif
 
index 4ff9973ccda6d68d60bd921601258fecd6a543ba..0c69a77fce7490e44a2e920334ee15679add3de4 100644 (file)
@@ -558,6 +558,31 @@ _e_comp_wl_evas_cb_restack(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EIN
 
    _e_comp_wl_subsurface_restack(topmost);
    _e_comp_wl_subsurface_restack_bg_rectangle(topmost);
+
+   //To update client stack list
+   if ((ec->comp_data->sub.data) &&
+       (ec->comp_data->sub.data->parent))
+     {
+        E_Client *parent;
+        Evas_Object *o;
+
+        parent = ec->comp_data->sub.data->parent;
+
+        if ((parent->comp_data->sub.list) &&
+            (eina_list_data_find(parent->comp_data->sub.list, ec)))
+          {
+             //stack above done
+             o = evas_object_below_get(ec->frame);
+             e_comp_object_layer_update(ec->frame, o, NULL);
+          }
+        else if ((parent->comp_data->sub.below_list) &&
+                 (eina_list_data_find(parent->comp_data->sub.below_list, ec)))
+          {
+             //stack below done
+             o = evas_object_above_get(ec->frame);
+             e_comp_object_layer_update(ec->frame, NULL, o);
+          }
+     }
 }
 
 static short