From: Seunghun Lee Date: Wed, 6 Nov 2019 11:58:25 +0000 (+0900) Subject: e_client: Added an API to provide a way to access surface tree of E_Client. X-Git-Tag: submit/tizen/20191112.105927~5 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F82%2F217382%2F6;p=platform%2Fupstream%2Fenlightenment.git e_client: Added an API to provide a way to access surface tree of E_Client. e_client_surface_tree_foreach(E_Client *, E_Client_Surface_Tree_Foreach, void *) This API will call callback function with E_Client parameter from the bottom stacked to top stacked one including given E_Client initially. Change-Id: I8ff183368c1a21cb4d8fb7ac08f9908dcec090f6 --- diff --git a/src/bin/e_client.c b/src/bin/e_client.c index d05b685277..2876b6b943 100644 --- a/src/bin/e_client.c +++ b/src/bin/e_client.c @@ -7645,3 +7645,48 @@ e_client_lower(E_Client *ec) if (!ec) return; evas_object_lower(ec->frame); } + +static Eina_Bool +_e_client_surface_tree_foreach_helper(E_Client *ec, E_Client_Surface_Tree_Foreach func, void *data) +{ + E_Client *subc; + Eina_List *l, *ll; + Eina_Bool res = EINA_TRUE; + + if ((e_object_is_del(E_OBJECT(ec))) || (!ec->comp_data)) + return res; + + EINA_LIST_FOREACH_SAFE(ec->comp_data->sub.below_list, l, ll, subc) + { + res = _e_client_surface_tree_foreach_helper(subc, func, data); + if (!res) + break; + } + + if (res) + { + res = func(data, ec); + if (res) + { + EINA_LIST_FOREACH_SAFE(ec->comp_data->sub.list, l, ll, subc) + { + res = _e_client_surface_tree_foreach_helper(subc, + func, + data); + if (!res) + break; + } + } + } + + return res; +} + +EINTERN void +e_client_surface_tree_foreach(E_Client *ec, E_Client_Surface_Tree_Foreach func, void *data) +{ + EINA_SAFETY_ON_NULL_RETURN(ec); + EINA_SAFETY_ON_NULL_RETURN(func); + + _e_client_surface_tree_foreach_helper(ec, func, data); +} diff --git a/src/bin/e_client.h b/src/bin/e_client.h index d1dae4f264..72148f005b 100644 --- a/src/bin/e_client.h +++ b/src/bin/e_client.h @@ -267,6 +267,7 @@ typedef void (*E_Client_Move_Intercept_Cb)(E_Client *, int x, int y); typedef void (*E_Client_Hook_Cb)(void *data, E_Client *ec); typedef Eina_Bool (*E_Client_Intercept_Hook_Cb)(void *data, E_Client *ec); typedef void (*E_Client_Layout_Cb)(void); +typedef Eina_Bool (*E_Client_Surface_Tree_Foreach)(void *data, E_Client *ec); #else #define E_CLIENT_TYPE (int)0xE0b01002 @@ -1209,6 +1210,8 @@ E_API Eina_Bool e_client_layer_set(E_Client *ec, E_Layer layer); E_API void e_client_raise(E_Client *ec); E_API void e_client_lower(E_Client *ec); +EINTERN void e_client_surface_tree_foreach(E_Client *ec, E_Client_Surface_Tree_Foreach func, void *data); + /** * Move window to coordinates that do not account client decorations yet. *