e_client: add code to check layer validation in e_client_below_get 66/234966/1 accepted/tizen/unified/20200601.140047 submit/tizen/20200601.071059
authorDoyoun Kang <doyoun.kang@samsung.com>
Fri, 29 May 2020 07:00:54 +0000 (16:00 +0900)
committerDoyoun Kang <doyoun.kang@samsung.com>
Mon, 1 Jun 2020 06:54:32 +0000 (15:54 +0900)
There was a bug that the enlightenment could fall into infinite loop while using e_client_below_get.
This was because of mismatching between ec->layer and cw->layer. And it was due to layer_pending
while effect was running.

Change-Id: I0b28e693b14a34b73782b1229c106043c0f54758

src/bin/e_client.c
src/bin/e_comp_object.c
src/bin/e_comp_object.h

index 0f496546016dc900120fe08ad47d09bf742d5612..84354139514d93935e22d60f83eaec34e37e5be1 100644 (file)
@@ -5126,6 +5126,8 @@ e_client_below_get(const E_Client *ec)
    unsigned int x;
    E_Client *ec2;
    Eina_Inlist *l;
+   E_Layer ec_layer, ec_layer_cw;
+   int cw_layer;
 
    E_OBJECT_CHECK_RETURN(ec, NULL);
    E_OBJECT_TYPE_CHECK_RETURN(ec, E_CLIENT_TYPE, NULL);
@@ -5146,11 +5148,24 @@ e_client_below_get(const E_Client *ec)
           }
      }
 
-   if (ec->layer == E_LAYER_CLIENT_DESKTOP) return NULL;
-   if (e_comp_canvas_client_layer_map(ec->layer) == 9999) return NULL;
+   // check layer validation
+   ec_layer = ec->layer;
+   cw_layer = e_comp_object_layer_get(ec->frame);
+   if (cw_layer >= 0)
+     {
+        ec_layer_cw = e_comp_canvas_layer_map_to(cw_layer);
+        if (ec_layer != ec_layer_cw)
+          {
+             ELOGF("COMP", "LAYER is not same. USE obj layer! (ec->layer:%d, obj:%d). block:%d, pending:%d)", ec, ec_layer, ec_layer_cw, ec->layer_block, ec->layer_pending);
+             ec_layer = ec_layer_cw;
+          }
+     }
+
+   if (ec_layer == E_LAYER_CLIENT_DESKTOP) return NULL;
+   if (e_comp_canvas_client_layer_map(ec_layer) == 9999) return NULL;
 
    /* go down the layers until we find one */
-   x = e_comp_canvas_layer_map(ec->layer);
+   x = e_comp_canvas_layer_map(ec_layer);
    if (x > 0) x--;
 
    for (; x >= e_comp_canvas_layer_map(E_LAYER_CLIENT_DESKTOP); x--)
@@ -5161,7 +5176,7 @@ e_client_below_get(const E_Client *ec)
              if (ec == ec2)
                {
                   ELOGF("FATAL", "EC exist below layer. ec layer_map:%d, cur layer_map:%d",
-                        ec, e_comp_canvas_layer_map(ec->layer), x);
+                        ec, e_comp_canvas_layer_map(ec_layer), x);
                   continue;
                }
              if (!e_object_is_del(E_OBJECT(ec2)))
index 1350dfd23bc7407444ac3a3d85921af78b0b5702..bf48150127b3f027a24e1dd7742d3965f564b891 100644 (file)
@@ -5514,6 +5514,13 @@ e_comp_object_layer_update(Evas_Object *obj,
      _e_comp_object_layers_add(cw, NULL, NULL, 0);
 }
 
+EINTERN int
+e_comp_object_layer_get(Evas_Object *obj)
+{
+   API_ENTRY -1;
+   return cw->layer;
+}
+
 E_API Eina_Bool
 e_comp_object_content_set(Evas_Object *obj,
                           Evas_Object *content,
index b59b17c90741afee0ffa2db4e4f08ed42a31346f..c2dde835c610599ef92bd1029c68aa3b2b882b73 100644 (file)
@@ -167,6 +167,7 @@ E_API void e_comp_object_transform_transp_vertices_set(Evas_Object *obj, E_Util_
 EINTERN void e_comp_object_transform_transp_vertices_set_with_zoom(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices, double zoomx, double zoomy, Evas_Coord cx, Evas_Coord cy);
 
 E_API void e_comp_object_layer_update(Evas_Object *obj, Evas_Object *above, Evas_Object *below);
+EINTERN int e_comp_object_layer_get(Evas_Object *obj);
 
 E_API Eina_Bool                  e_comp_object_content_set(Evas_Object* obj, Evas_Object *content, E_Comp_Object_Content_Type type);
 E_API Eina_Bool                  e_comp_object_content_unset(Evas_Object* obj);