e_client: Added an API to provide a way to access surface tree of E_Client. 82/217382/6
authorSeunghun Lee <shiin.lee@samsung.com>
Wed, 6 Nov 2019 11:58:25 +0000 (20:58 +0900)
committerSeunghun Lee <shiin.lee@samsung.com>
Tue, 12 Nov 2019 05:53:59 +0000 (14:53 +0900)
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

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

index d05b6852775652647ad97ff890e792a8a5d62d78..2876b6b943b6b47b39c68e11bc8edb0ccecb05d4 100644 (file)
@@ -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);
+}
index d1dae4f2649914f7efe3c8c0be5687a2e59203cd..72148f005bcbc38bcebeecac98c32b44f05c49f0 100644 (file)
@@ -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.
  *