e_client: add code to check layer validation in e_client_below_get 50/234850/1
authorDoyoun Kang <doyoun.kang@samsung.com>
Fri, 29 May 2020 07:00:54 +0000 (16:00 +0900)
committerDoyoun Kang <doyoun.kang@samsung.com>
Fri, 29 May 2020 07:01:03 +0000 (16:01 +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 c32b0331c72d6703b26beb66807ebc1443b83b88..f430efe7d4773eba3022bcf5d6df5d8cd5f5ff3f 100644 (file)
@@ -5109,6 +5109,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);
@@ -5129,11 +5131,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--)
@@ -5144,7 +5159,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 b3c9bbe1d07e8a2c4b7e53f68fb3d27c5f30d6dd..5f80b3a5a8ea6cb7dba528b449fa8f366c865bbd 100644 (file)
@@ -5489,6 +5489,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 6b4eec11a51dcf02a0135490644447001e2dd335..a527d95ef97fc4272b22225c22aecaef228be482 100644 (file)
@@ -164,6 +164,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);