From: Doyoun Kang Date: Fri, 29 May 2020 07:00:54 +0000 (+0900) Subject: e_client: add code to check layer validation in e_client_below_get X-Git-Tag: submit/tizen/20200601.071059^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=600067b4d48db082f8d05afcc22dc6d699790f36;p=platform%2Fupstream%2Fenlightenment.git e_client: add code to check layer validation in e_client_below_get 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 --- diff --git a/src/bin/e_client.c b/src/bin/e_client.c index 0f49654601..8435413951 100644 --- a/src/bin/e_client.c +++ b/src/bin/e_client.c @@ -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))) diff --git a/src/bin/e_comp_object.c b/src/bin/e_comp_object.c index 1350dfd23b..bf48150127 100644 --- a/src/bin/e_comp_object.c +++ b/src/bin/e_comp_object.c @@ -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, diff --git a/src/bin/e_comp_object.h b/src/bin/e_comp_object.h index b59b17c907..c2dde835c6 100644 --- a/src/bin/e_comp_object.h +++ b/src/bin/e_comp_object.h @@ -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);