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_5.5/20200618.071948~8 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=08096e43a2a6d05f1f7059260b6b48fd847d7b4c;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 c32b0331c7..f430efe7d4 100644 --- a/src/bin/e_client.c +++ b/src/bin/e_client.c @@ -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))) diff --git a/src/bin/e_comp_object.c b/src/bin/e_comp_object.c index b3c9bbe1d0..5f80b3a5a8 100644 --- a/src/bin/e_comp_object.c +++ b/src/bin/e_comp_object.c @@ -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, diff --git a/src/bin/e_comp_object.h b/src/bin/e_comp_object.h index 6b4eec11a5..a527d95ef9 100644 --- a/src/bin/e_comp_object.h +++ b/src/bin/e_comp_object.h @@ -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);