Revert "e_policy_desk_area: refine layer list to use e_view_tree" 93/324293/1
author강도연/Tizen Platform Lab(SR)/삼성전자 <doyoun.kang@samsung.com>
Thu, 15 May 2025 06:44:22 +0000 (15:44 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Thu, 15 May 2025 07:18:47 +0000 (16:18 +0900)
This reverts commit 3f370df5a238a9a27bf6cbed53ac6a837c1896ad.

Change-Id: I30b3e343c7f12dd54355a57946941a7c11d1f882

src/bin/core/e_desk_area.c
src/bin/core/e_desk_area_intern.h
src/bin/debug/e_test_helper.c
src/bin/windowmgr/e_policy_desk_area.c
src/bin/windowmgr/e_policy_desk_area_layer.c
src/include/e_comp.h

index 0ed44a778882c4303864ce53570e68b5b41e722b..9964faaed90eece789bfe2235ce9624cd5d411d9 100644 (file)
@@ -3,6 +3,10 @@
 #include "e_comp_canvas_intern.h"
 #include "e_desk_intern.h"
 
+#ifdef NEED_REFINE_EDA_LAYERS_LIST
+#include "e_comp_intern.h"
+#endif
+
 #include <libds-tizen/screen.h>
 
 typedef struct _E_Desk_Area_Private         E_Desk_Area_Private;
index 44c8b2cf3a49c79a95f811394016b9b126878971..03f38008fae98105c64cab0dcc63aaaa797d551f 100644 (file)
@@ -34,6 +34,12 @@ struct _E_Desk_Area
 
    Eina_List           *handlers;
 
+   struct {
+      Evas_Object *obj;
+      Eina_Inlist *clients; /* E_Client, bottom to top */
+      unsigned int clients_count;
+   } layers[E_LAYER_COUNT];
+
    Evas_Object         *smart_obj;
    Eina_List           *fullscreen_clients;
 
index dfd0ba85186f8c198efced38f88c48c298f65a0d..baa08248437a34185aafe1869075b6894de300bf 100644 (file)
@@ -407,7 +407,7 @@ _e_test_helper_message_append_client(Eldbus_Message_Iter *iter, E_Client *ec)
        x, y, w, h,
 
        /* layer */
-       e_client_layer_get(ec),
+       evas_object_layer_get(ec->frame),
 
        /* effect */
        evas_object_data_get(ec->frame, "effect_running"),
index 0c8532318465eae0d7b4a582aafabe86759fb479..2290c9fda76282ed4992e5d1dff554a4cf0e3751 100644 (file)
@@ -235,26 +235,8 @@ _e_desk_area_layer_util_map_to_eda_layer(E_Layer e_layer)
       case E_LAYER_MENU: return E_DESK_AREA_LAYER_MENU;
       case E_LAYER_DESKLOCK: return E_DESK_AREA_LAYER_DESKLOCK;
       case E_LAYER_MAX: return E_DESK_AREA_LAYER_MAX;
-      default: break;
+      default: assert(0);
      }
-
-   /* prevents to access the e_comp->layers list out of bounds. */
-   ELOGF("WARNING", "Used not defined layer:%d", NULL, e_layer);
-   return E_LAYER_COUNT - 1;
-}
-
-static E_Desk_Area_Layer
-_e_desk_area_layer_util_below_layer_get(E_Desk_Area_Layer layer)
-{
-   if (layer > E_DESK_AREA_LAYER_MAX) goto err;
-   if (layer < E_DESK_AREA_LAYER_BOTTOM) goto err;
-
-   if (layer == E_DESK_AREA_LAYER_BOTTOM) return E_DESK_AREA_LAYER_BOTTOM;
-   else return layer - 1;
-
-err:
-   ELOGF("PDA", "Used not defined layer:%d", NULL, layer);
-   return E_DESK_AREA_LAYER_BOTTOM;
 }
 
 
@@ -447,58 +429,52 @@ _e_policy_desk_area_cb_lower(struct wl_listener *listener, void *data)
      }
 }
 
-static void
-_e_policy_desk_area_iter_ec_get(E_View *view, int sx, int sy, void *user_data)
-{
-   E_Desk_Area_Data_EC_Get *iter_data = (E_Desk_Area_Data_EC_Get *) user_data;
-   E_Client *ec;
-
-   if (iter_data->result_ec) return;
-   if (view->type != E_VIEW_TYPE_CLIENT) return;
-
-   ec = e_view_data_get(view, "E_Client");
-   if (e_object_is_del(E_OBJECT(ec))) return;
-
-   if (iter_data->criterion_ec)
-     {
-        if (iter_data->criterion_ec == ec) iter_data->criterion_ec = NULL;
-        return;
-     }
-
-   iter_data->result_ec = ec;
-}
-
 static void
 _e_policy_desk_area_cb_top_ec_get(struct wl_listener *listener, void *data)
 {
-   E_Desk_Area_Data_EC_Get *client_data;
-   E_Desk_Area_Data_EC_Get iter_data = {0,};
+   E_Desk_Area_Data_EC_Get *get_data;
+   E_Desk_Area *eda;
    E_Policy_Desk_Area *pda;
-   E_Policy_Desk_Area_Layer *pdal;
-   E_View_Tree *layer_tree;
+
+   E_Client *ec;
    unsigned int x;
 
    pda = wl_container_of(listener, pda, top_ec_get);
-   client_data = (E_Desk_Area_Data_EC_Get *) data;
-   iter_data.criterion_ec = NULL;
+   get_data = (E_Desk_Area_Data_EC_Get *) data;
+   eda = get_data->eda;
+
+#ifdef NEED_REFINE_EDA_LAYERS_LIST
+   E_Comp *comp;
+   comp = e_comp_get();
+#endif
 
    e_comp_ec_list_lock();
 
-   for (x = _e_desk_area_layer_util_map_to_eda_layer(E_LAYER_CLIENT_CURSOR);
-        x >= _e_desk_area_layer_util_map_to_eda_layer(E_LAYER_CLIENT_DESKTOP);
-        x--)
+   for (x = e_comp_canvas_layer_map(E_LAYER_CLIENT_CURSOR); x >= e_comp_canvas_layer_map(E_LAYER_CLIENT_DESKTOP); x--)
      {
-        pdal = pda->layers[x];
-        if (!pdal) continue;
+#ifdef NEED_REFINE_EDA_LAYERS_LIST
+        if (!comp->layers[x].clients) continue;
 
-        layer_tree = e_policy_desk_area_layer_view_tree_get(pdal);
-        e_view_for_each_view_reverse(e_view_tree_view_get(layer_tree), _e_policy_desk_area_iter_ec_get, &iter_data);
-        if (iter_data.result_ec)
+        EINA_INLIST_REVERSE_FOREACH(comp->layers[x].clients, ec)
           {
-             client_data->result_ec = iter_data.result_ec;
+             if (e_object_is_del(E_OBJECT(ec))) continue;
+             if (!e_desk_area_has_ec(eda, ec)) continue;
+
              e_comp_ec_list_unlock();
+             get_data->result_ec = ec;
              return;
           }
+#else
+        if (!eda->layers[x].clients) continue;
+
+        EINA_INLIST_REVERSE_FOREACH(eda->layers[x].clients, ec)
+            if (!e_object_is_del(E_OBJECT(ec)))
+              {
+                 e_comp_ec_list_unlock();
+                 get_data->result_ec = ec;
+                 return;
+              }
+#endif
      }
 
    e_comp_ec_list_unlock();
@@ -507,34 +483,49 @@ _e_policy_desk_area_cb_top_ec_get(struct wl_listener *listener, void *data)
 static void
 _e_policy_desk_area_cb_bottom_ec_get(struct wl_listener *listener, void *data)
 {
-   E_Desk_Area_Data_EC_Get *client_data;
-   E_Desk_Area_Data_EC_Get iter_data = {0,};
+   E_Desk_Area_Data_EC_Get *get_data;
+   E_Desk_Area *eda;
    E_Policy_Desk_Area *pda;
-   E_Policy_Desk_Area_Layer *pdal;
-   E_View_Tree *layer_tree;
+
+   E_Client *ec;
    unsigned int x;
 
    pda = wl_container_of(listener, pda, bottom_ec_get);
-   client_data = (E_Desk_Area_Data_EC_Get *) data;
-   iter_data.criterion_ec = NULL;
+   get_data = (E_Desk_Area_Data_EC_Get *) data;
+   eda = get_data->eda;
+
+#ifdef NEED_REFINE_EDA_LAYERS_LIST
+   E_Comp *comp;
+   comp = e_comp_get();
+#endif
 
    e_comp_ec_list_lock();
 
-   for (x = _e_desk_area_layer_util_map_to_eda_layer(E_LAYER_CLIENT_DESKTOP);
-        x <= _e_desk_area_layer_util_map_to_eda_layer(E_LAYER_CLIENT_CURSOR);
-        x++)
+   for (x = e_comp_canvas_layer_map(E_LAYER_CLIENT_DESKTOP); x <= e_comp_canvas_layer_map(E_LAYER_CLIENT_CURSOR); x++)
      {
-        pdal = pda->layers[x];
-        if (!pdal) continue;
+#ifdef NEED_REFINE_EDA_LAYERS_LIST
+        if (!comp->layers[x].clients) continue;
 
-        layer_tree = e_policy_desk_area_layer_view_tree_get(pdal);
-        e_view_for_each_view(e_view_tree_view_get(layer_tree), _e_policy_desk_area_iter_ec_get, &iter_data);
-        if (iter_data.result_ec)
+        EINA_INLIST_FOREACH(comp->layers[x].clients, ec)
           {
-             client_data->result_ec = iter_data.result_ec;
+             if (e_object_is_del(E_OBJECT(ec))) continue;
+             if (!e_desk_area_has_ec(eda, ec)) continue;
+
              e_comp_ec_list_unlock();
+             get_data->result_ec = ec;
              return;
           }
+#else
+        if (!eda->layers[x].clients) continue;
+
+        EINA_INLIST_FOREACH(eda->layers[x].clients, ec)
+            if (!e_object_is_del(E_OBJECT(ec)))
+              {
+                 e_comp_ec_list_unlock();
+                 get_data->result_ec = ec;
+                 return;
+              }
+#endif
      }
 
    e_comp_ec_list_unlock();
@@ -569,7 +560,7 @@ _e_policy_desk_area_cb_layer_obj_get(struct wl_listener *listener, void *data)
    E_View *layer_view;
 
    pda = wl_container_of(listener, pda, layer_obj_get);
-   pdal = pda->layers[_e_desk_area_layer_util_map_to_eda_layer(obj_data->layer)];
+   pdal = pda->layers[obj_data->layer];
 
    layer_view = e_policy_desk_area_layer_obj_get(pdal);
    if (layer_view)
@@ -607,33 +598,47 @@ _desk_area_cb_client_get_above(struct wl_listener *listener, void *data)
 {
    E_Policy_Desk_Area *pda;
    E_Desk_Area_Data_EC_Get *client_data = (E_Desk_Area_Data_EC_Get *) data;
-   E_Desk_Area_Data_EC_Get iter_data = {0,};
-   E_Policy_Desk_Area_Layer *pdal;
-   E_View_Tree *layer_tree;
-   E_Client *ec;
+   E_Desk_Area *eda;
+   E_Client *ec, *ec2;
    unsigned int x;
 
    pda = wl_container_of(listener, pda, client_above_get);
-   iter_data.criterion_ec = client_data->criterion_ec;
+   eda = pda->desk_area;
    ec = client_data->criterion_ec;
 
+#ifdef NEED_REFINE_EDA_LAYERS_LIST
+   E_Comp *comp;
+   comp = e_comp_get();
+#endif
+
    e_comp_ec_list_lock();
 
-   x = _e_desk_area_layer_util_map_to_eda_layer(ec->layer);
-   pdal = pda->layers[x];
-   if (!pdal)
+   if (EINA_INLIST_GET(ec)->next) //check current layer
      {
-        ERR("EDA: Couldn't get layer of ec(%p):%s / layer:%d", ec, e_client_icccm_title_get(ec), ec->layer);
-        return;
-     }
+        EINA_INLIST_FOREACH(EINA_INLIST_GET(ec)->next, ec2)
+          {
+#ifdef NEED_REFINE_EDA_LAYERS_LIST
+             if (ec == ec2) continue;
+             if (e_object_is_del(E_OBJECT(ec2))) continue;
+             if (!e_desk_area_has_ec(eda, ec2)) continue;
 
-   layer_tree = e_policy_desk_area_layer_view_tree_get(pdal);
-   e_view_for_each_view(e_view_tree_view_get(layer_tree), _e_policy_desk_area_iter_ec_get, &iter_data);
-   if (iter_data.result_ec)
-     {
-        client_data->result_ec = iter_data.result_ec;
-        e_comp_ec_list_unlock();
-        return;
+             client_data->result_ec = ec2;
+             e_comp_ec_list_unlock();
+             return;
+#else
+             if (ec == ec2)
+               {
+                  ELOGF("FATAL", "CHECK the ec inlist next", ec);
+                  continue;
+               }
+             if (!e_object_is_del(E_OBJECT(ec2)))
+               {
+                  client_data->result_ec = ec2;
+                  e_comp_ec_list_unlock();
+                  return;
+               }
+#endif
+          }
      }
 
    e_comp_ec_list_unlock();
@@ -641,24 +646,48 @@ _desk_area_cb_client_get_above(struct wl_listener *listener, void *data)
    if (ec->layer == E_LAYER_CLIENT_CURSOR) return;
    if (!e_util_client_layer_validate(ec->layer)) return;
 
-   e_comp_ec_list_lock();
+   e_comp_ec_list_lock();;
 
    /* go up the layers until we find one */
-   for (x = _e_desk_area_layer_util_map_to_eda_layer(ec->layer) + 1;
-        x <= _e_desk_area_layer_util_map_to_eda_layer(E_LAYER_CLIENT_CURSOR);
-        x++)
+   for (x = e_comp_canvas_layer_map(ec->layer) + 1; x <= e_comp_canvas_layer_map(E_LAYER_CLIENT_CURSOR); x++)
      {
-        pdal = pda->layers[x];
-        if (!pdal) continue;
+#ifdef NEED_REFINE_EDA_LAYERS_LIST
+        if (!comp->layers[x].clients) continue;
 
-        layer_tree = e_policy_desk_area_layer_view_tree_get(pdal);
-        e_view_for_each_view(e_view_tree_view_get(layer_tree), _e_policy_desk_area_iter_ec_get, &iter_data);
-        if (iter_data.result_ec)
+        EINA_INLIST_FOREACH(comp->layers[x].clients, ec2)
           {
-             client_data->result_ec = iter_data.result_ec;
+             if (ec == ec2)
+               {
+                  ELOGF("FATAL", "[eda:%p] EC exist above layer. ec layer_map:%d, cur layer_map:%d",
+                        ec, eda, e_comp_canvas_layer_map(ec->layer), x);
+                  continue;
+               }
+             if (e_object_is_del(E_OBJECT(ec2))) continue;
+             if (!e_desk_area_has_ec(eda, ec2)) continue;
+
+             client_data->result_ec = ec2;
              e_comp_ec_list_unlock();
              return;
           }
+#else
+        if (!eda->layers[x].clients) continue;
+
+        EINA_INLIST_FOREACH(eda->layers[x].clients, ec2)
+          {
+             if (ec == ec2)
+               {
+                  ELOGF("FATAL", "[eda:%p] EC exist above layer. ec layer_map:%d, cur layer_map:%d",
+                        ec, eda, e_comp_canvas_layer_map(ec->layer), x);
+                  continue;
+               }
+             if (!e_object_is_del(E_OBJECT(ec2)))
+               {
+                  client_data->result_ec = ec2;
+                  e_comp_ec_list_unlock();
+                  return;
+               }
+          }
+#endif
      }
 
    e_comp_ec_list_unlock();
@@ -669,36 +698,51 @@ _desk_area_cb_client_get_below(struct wl_listener *listener, void *data)
 {
    E_Policy_Desk_Area *pda;
    E_Desk_Area_Data_EC_Get *client_data = (E_Desk_Area_Data_EC_Get *) data;
-   E_Desk_Area_Data_EC_Get iter_data = {0,};
-   E_Policy_Desk_Area_Layer *pdal;
-   E_View_Tree *layer_tree;
+   E_Desk_Area *eda;
+   E_Client *ec, *ec2;
    unsigned int x;
-   E_Client *ec;
+   Eina_Inlist *l;
    E_Layer ec_layer, ec_layer_cw;
    int cw_layer;
-   E_Desk_Area_Layer eda_layer;
 
    pda = wl_container_of(listener, pda, client_below_get);
-   iter_data.criterion_ec = client_data->criterion_ec;
+   eda = pda->desk_area;
    ec = client_data->criterion_ec;
 
+#ifdef NEED_REFINE_EDA_LAYERS_LIST
+   E_Comp *comp;
+   comp = e_comp_get();
+#endif
+
    e_comp_ec_list_lock();
 
-   x = _e_desk_area_layer_util_map_to_eda_layer(ec->layer);
-   pdal = pda->layers[x];
-   if (!pdal)
+   if (EINA_INLIST_GET(ec)->prev) //check current layer
      {
-        ERR("EDA: Couldn't get layer of ec(%p):%s / layer:%d", ec, e_client_icccm_title_get(ec), ec->layer);
-        return;
-     }
+        for (l = EINA_INLIST_GET(ec)->prev; l; l = l->prev)
+          {
+             ec2 = EINA_INLIST_CONTAINER_GET(l, E_Client);
+#ifdef NEED_REFINE_EDA_LAYERS_LIST
+             if (ec == ec2) continue;
+             if (e_object_is_del(E_OBJECT(ec2))) continue;
+             if (!e_desk_area_has_ec(eda, ec2)) continue;
 
-   layer_tree = e_policy_desk_area_layer_view_tree_get(pdal);
-   e_view_for_each_view_reverse(e_view_tree_view_get(layer_tree), _e_policy_desk_area_iter_ec_get, &iter_data);
-   if (iter_data.result_ec)
-     {
-        client_data->result_ec = iter_data.result_ec;
-        e_comp_ec_list_unlock();
-        return;
+             client_data->result_ec = ec2;
+             e_comp_ec_list_unlock();
+             return;
+#else
+             if (ec == ec2)
+               {
+                  ELOGF("FATAL", "CHECK the ec inlist prev", ec);
+                  continue;
+               }
+             if (!e_object_is_del(E_OBJECT(ec2)))
+               {
+                  client_data->result_ec = ec2;
+                  e_comp_ec_list_unlock();
+                  return;
+               }
+#endif
+          }
      }
 
    e_comp_ec_list_unlock();
@@ -714,7 +758,7 @@ _desk_area_cb_client_get_below(struct wl_listener *listener, void *data)
              if (ec_layer != ec_layer_cw)
                {
                   ELOGF("EDA", "[eda:%p] LAYER is not same. USE obj layer! (ec->layer:%d, obj:%d). block:%d, pending:%d)",
-                        ec, pda->desk_area, ec_layer, ec_layer_cw, ec->layer_block, ec->layer_pending);
+                        ec, eda, ec_layer, ec_layer_cw, ec->layer_block, ec->layer_pending);
                   ec_layer = ec_layer_cw;
                }
           }
@@ -723,25 +767,51 @@ _desk_area_cb_client_get_below(struct wl_listener *listener, void *data)
    if (ec_layer == E_LAYER_CLIENT_DESKTOP) return;
    if (!e_util_client_layer_validate(ec_layer)) return;
 
-   e_comp_ec_list_lock();
-
    /* go down the layers until we find one */
-   eda_layer = _e_desk_area_layer_util_map_to_eda_layer(ec_layer);
-   for (x = _e_desk_area_layer_util_below_layer_get(eda_layer);
-        x >= _e_desk_area_layer_util_map_to_eda_layer(E_LAYER_CLIENT_DESKTOP);
-        x--)
+   x = e_comp_canvas_layer_map(ec_layer);
+   if (x > 0) x--;
+
+   e_comp_ec_list_lock();;
+
+   for (; x >= e_comp_canvas_layer_map(E_LAYER_CLIENT_DESKTOP); x--)
      {
-        pdal = pda->layers[x];
-        if (!pdal) continue;
+#ifdef NEED_REFINE_EDA_LAYERS_LIST
+        if (!comp->layers[x].clients) continue;
 
-        layer_tree = e_policy_desk_area_layer_view_tree_get(pdal);
-        e_view_for_each_view_reverse(e_view_tree_view_get(layer_tree), _e_policy_desk_area_iter_ec_get, &iter_data);
-        if (iter_data.result_ec)
+        EINA_INLIST_REVERSE_FOREACH(comp->layers[x].clients, ec2)
           {
-             client_data->result_ec = iter_data.result_ec;
+             if (ec == ec2)
+               {
+                  ELOGF("FATAL", "[eda:%p] EC exist below layer. ec layer_map:%d, cur layer_map:%d",
+                        ec, eda, e_comp_canvas_layer_map(ec_layer), x);
+                  continue;
+               }
+             if (e_object_is_del(E_OBJECT(ec2))) continue;
+             if (!e_desk_area_has_ec(eda, ec2)) continue;
+
+             client_data->result_ec = ec2;
              e_comp_ec_list_unlock();
              return;
           }
+#else
+        if (!eda->layers[x].clients) continue;
+
+        EINA_INLIST_REVERSE_FOREACH(eda->layers[x].clients, ec2)
+          {
+             if (ec == ec2)
+               {
+                  ELOGF("FATAL", "[eda:%p] EC exist below layer. ec layer_map:%d, cur layer_map:%d",
+                        ec, eda, e_comp_canvas_layer_map(ec_layer), x);
+                  continue;
+               }
+             if (!e_object_is_del(E_OBJECT(ec2)))
+               {
+                  client_data->result_ec = ec2;
+                  e_comp_ec_list_unlock();
+                  return;
+               }
+          }
+#endif
      }
 
    e_comp_ec_list_unlock();
@@ -757,61 +827,48 @@ _desk_area_client_check_visible(E_Client *ec)
    return e_client_visible_get(ec);
 }
 
-static void
-_e_policy_desk_area_iter_visible_ec_get(E_View *view, int sx, int sy, void *user_data)
-{
-   E_Desk_Area_Data_EC_Get *iter_data = (E_Desk_Area_Data_EC_Get *) user_data;
-   E_Client *ec;
-
-   if (iter_data->result_ec) return;
-   if (view->type != E_VIEW_TYPE_CLIENT) return;
-
-   ec = e_view_data_get(view, "E_Client");
-   if (e_object_is_del(E_OBJECT(ec))) return;
-
-   if (iter_data->criterion_ec)
-     {
-        if (iter_data->criterion_ec == ec) iter_data->criterion_ec = NULL;
-        return;
-     }
-
-   if (!_desk_area_client_check_visible(ec)) return;
-
-   iter_data->result_ec = ec;
-}
-
 static void
 _desk_area_cb_client_get_visible_above(struct wl_listener *listener, void *data)
 {
    E_Policy_Desk_Area *pda;
    E_Desk_Area_Data_EC_Get *client_data = (E_Desk_Area_Data_EC_Get *) data;
-   E_Desk_Area_Data_EC_Get iter_data = {0,};
-   E_Policy_Desk_Area_Layer *pdal;
-   E_View_Tree *layer_tree;
+   E_Desk_Area *eda;
+   E_Client *ec, *ec2;
    unsigned int x;
-   E_Client *ec;
 
    pda = wl_container_of(listener, pda, client_visible_above_get);
-   iter_data.criterion_ec = client_data->criterion_ec;
+   eda = pda->desk_area;
    ec = client_data->criterion_ec;
 
+#ifdef NEED_REFINE_EDA_LAYERS_LIST
+   E_Comp *comp;
+   comp = e_comp_get();
+#endif
+
    e_comp_ec_list_lock();
 
-   x = _e_desk_area_layer_util_map_to_eda_layer(ec->layer);
-   pdal = pda->layers[x];
-   if (!pdal)
+   if (EINA_INLIST_GET(ec)->next) //check current layer
      {
-        ERR("EDA: Couldn't get layer of ec(%p):%s / layer:%d", ec, e_client_icccm_title_get(ec), ec->layer);
-        return;
-     }
+        EINA_INLIST_FOREACH(EINA_INLIST_GET(ec)->next, ec2)
+          {
+#ifdef NEED_REFINE_EDA_LAYERS_LIST
+             if (ec == ec2) continue;
+             if (!_desk_area_client_check_visible(ec2)) continue;
+             if (!e_desk_area_has_ec(eda, ec2)) continue;
 
-   layer_tree = e_policy_desk_area_layer_view_tree_get(pdal);
-   e_view_for_each_view(e_view_tree_view_get(layer_tree), _e_policy_desk_area_iter_visible_ec_get, &iter_data);
-   if (iter_data.result_ec)
-     {
-        client_data->result_ec = iter_data.result_ec;
-        e_comp_ec_list_unlock();
-        return;
+             client_data->result_ec = ec2;
+             e_comp_ec_list_unlock();
+             return;
+#else
+             if (ec == ec2) continue;
+             if (_desk_area_client_check_visible(ec2))
+               {
+                  client_data->result_ec = ec2;
+                  e_comp_ec_list_unlock();
+                  return;
+               }
+#endif
+          }
      }
 
    e_comp_ec_list_unlock();
@@ -819,24 +876,36 @@ _desk_area_cb_client_get_visible_above(struct wl_listener *listener, void *data)
    if (ec->layer == E_LAYER_CLIENT_CURSOR) return;
    if (!e_util_client_layer_validate(ec->layer)) return;
 
-   e_comp_ec_list_lock();
+   e_comp_ec_list_lock();;
 
    /* go up the layers until we find one */
-   for (x = _e_desk_area_layer_util_map_to_eda_layer(ec->layer) + 1;
-        x <= _e_desk_area_layer_util_map_to_eda_layer(E_LAYER_CLIENT_CURSOR);
-        x++)
+   for (x = e_comp_canvas_layer_map(ec->layer) + 1; x <= e_comp_canvas_layer_map(E_LAYER_CLIENT_CURSOR); x++)
      {
-        pdal = pda->layers[x];
-        if (!pdal) continue;
-
-        layer_tree = e_policy_desk_area_layer_view_tree_get(pdal);
-        e_view_for_each_view(e_view_tree_view_get(layer_tree), _e_policy_desk_area_iter_visible_ec_get, &iter_data);
-        if (iter_data.result_ec)
+#ifdef NEED_REFINE_EDA_LAYERS_LIST
+        if (!comp->layers[x].clients) continue;
+        EINA_INLIST_FOREACH(comp->layers[x].clients, ec2)
           {
-             client_data->result_ec = iter_data.result_ec;
+             if (ec == ec2) continue;
+             if (!_desk_area_client_check_visible(ec2)) continue;
+             if (!e_desk_area_has_ec(eda, ec2)) continue;
+
+             client_data->result_ec = ec2;
              e_comp_ec_list_unlock();
              return;
           }
+#else
+        if (!eda->layers[x].clients) continue;
+        EINA_INLIST_FOREACH(eda->layers[x].clients, ec2)
+          {
+             if (ec == ec2) continue;
+             if (_desk_area_client_check_visible(ec2))
+               {
+                  client_data->result_ec = ec2;
+                  e_comp_ec_list_unlock();
+                  return;
+               }
+          }
+#endif
      }
 
    e_comp_ec_list_unlock();
@@ -847,36 +916,47 @@ _desk_area_cb_client_get_visible_below(struct wl_listener *listener, void *data)
 {
    E_Policy_Desk_Area *pda;
    E_Desk_Area_Data_EC_Get *client_data = (E_Desk_Area_Data_EC_Get *) data;
-   E_Desk_Area_Data_EC_Get iter_data = {0,};
-   E_Policy_Desk_Area_Layer *pdal;
-   E_View_Tree *layer_tree;
+   E_Desk_Area *eda;
+   E_Client *ec, *ec2;
    unsigned int x;
-   E_Client *ec;
+   Eina_Inlist *l;
    E_Layer ec_layer, ec_layer_cw;
    int cw_layer;
-   E_Desk_Area_Layer eda_layer;
 
    pda = wl_container_of(listener, pda, client_visible_below_get);
-   iter_data.criterion_ec = client_data->criterion_ec;
+   eda = pda->desk_area;
    ec = client_data->criterion_ec;
 
+#ifdef NEED_REFINE_EDA_LAYERS_LIST
+   E_Comp *comp;
+   comp = e_comp_get();
+#endif
+
    e_comp_ec_list_lock();
 
-   x = _e_desk_area_layer_util_map_to_eda_layer(ec->layer);
-   pdal = pda->layers[x];
-   if (!pdal)
+   if (EINA_INLIST_GET(ec)->prev) //check current layer
      {
-        ERR("EDA: Couldn't get layer of ec(%p):%s / layer:%d", ec, e_client_icccm_title_get(ec), ec->layer);
-        return;
-     }
+        for (l = EINA_INLIST_GET(ec)->prev; l; l = l->prev)
+          {
+             ec2 = EINA_INLIST_CONTAINER_GET(l, E_Client);
+#ifdef NEED_REFINE_EDA_LAYERS_LIST
+             if (ec == ec2) continue;
+             if (!_desk_area_client_check_visible(ec2)) continue;
+             if (!e_desk_area_has_ec(eda, ec2)) continue;
 
-   layer_tree = e_policy_desk_area_layer_view_tree_get(pdal);
-   e_view_for_each_view_reverse(e_view_tree_view_get(layer_tree), _e_policy_desk_area_iter_visible_ec_get, &iter_data);
-   if (iter_data.result_ec)
-     {
-        client_data->result_ec = iter_data.result_ec;
-        e_comp_ec_list_unlock();
-        return;
+             client_data->result_ec = ec2;
+             e_comp_ec_list_unlock();
+             return;
+#else
+             if (ec == ec2) continue;
+             if (_desk_area_client_check_visible(ec2))
+               {
+                  client_data->result_ec = ec2;
+                  e_comp_ec_list_unlock();
+                  return;
+               }
+#endif
+          }
      }
 
    e_comp_ec_list_unlock();
@@ -892,34 +972,46 @@ _desk_area_cb_client_get_visible_below(struct wl_listener *listener, void *data)
              if (ec_layer != ec_layer_cw)
                {
                   ELOGF("EDA", "[eda:%p] LAYER is not same. USE obj layer! (ec->layer:%d, obj:%d). block:%d, pending:%d)",
-                        ec, pda->desk_area, ec_layer, ec_layer_cw, ec->layer_block, ec->layer_pending);
+                        ec, eda, ec_layer, ec_layer_cw, ec->layer_block, ec->layer_pending);
                   ec_layer = ec_layer_cw;
                }
           }
      }
 
-   if (ec_layer == E_LAYER_CLIENT_DESKTOP) return;
-   if (!e_util_client_layer_validate(ec_layer)) return;
+   /* go down the layers until we find one */
+   if (e_comp_canvas_layer_map(ec->layer) > e_comp_canvas_layer_map(E_LAYER_MAX)) return;
+   x = e_comp_canvas_layer_map(ec->layer);
+   if (x > 0) x--;
 
    e_comp_ec_list_lock();
 
-   /* go down the layers until we find one */
-   eda_layer = _e_desk_area_layer_util_map_to_eda_layer(ec_layer);
-   for (x = _e_desk_area_layer_util_below_layer_get(eda_layer);
-        x >= _e_desk_area_layer_util_map_to_eda_layer(E_LAYER_CLIENT_DESKTOP);
-        x--)
+   for (; x >= e_comp_canvas_layer_map(E_LAYER_CLIENT_DESKTOP); x--)
      {
-        pdal = pda->layers[x];
-        if (!pdal) continue;
-
-        layer_tree = e_policy_desk_area_layer_view_tree_get(pdal);
-        e_view_for_each_view_reverse(e_view_tree_view_get(layer_tree), _e_policy_desk_area_iter_visible_ec_get, &iter_data);
-        if (iter_data.result_ec)
+#ifdef NEED_REFINE_EDA_LAYERS_LIST
+        if (!comp->layers[x].clients) continue;
+        EINA_INLIST_REVERSE_FOREACH(comp->layers[x].clients, ec2)
           {
-             client_data->result_ec = iter_data.result_ec;
+             if (ec == ec2) continue;
+             if (!_desk_area_client_check_visible(ec2)) continue;
+             if (!e_desk_area_has_ec(eda, ec2)) continue;
+
+             client_data->result_ec = ec2;
              e_comp_ec_list_unlock();
              return;
           }
+#else
+        if (!eda->layers[x].clients) continue;
+        EINA_INLIST_REVERSE_FOREACH(eda->layers[x].clients, ec2)
+          {
+             if (ec == ec2) continue;
+             if (_desk_area_client_check_visible(ec2))
+               {
+                  client_data->result_ec = ec2;
+                  e_comp_ec_list_unlock();
+                  return;
+               }
+          }
+#endif
      }
 
    e_comp_ec_list_unlock();
@@ -2017,7 +2109,6 @@ _desk_area_cb_client_layer_set(struct wl_listener *listener, void *data)
      }
 
    layer_tree = e_policy_desk_area_layer_tree_get(pda, layer);
-   ELOGF("LAYER", "layer set to %d", ec, layer);
    e_view_reparent(ec_view, layer_tree);
    evas_object_layer_set(ec_view->eo, layer);
    if (ec->layer != layer)
@@ -2071,11 +2162,7 @@ _desk_area_cb_client_layer_get(struct wl_listener *listener, void *data)
 
    /* client could be on temperory layer while pending or block,
     * in that case, client restores back to ec->layer after pending/block finish */
-   if (ec->layer_block || ec->layer_pending)
-     {
-        ELOGF("LAYER", "layer blocked(%d) or pending(%d), ec->layer %d | evas obj layer %d", ec, ec->layer_block, ec->layer_pending, ec->layer, layer);
-        return;
-     }
+   if (ec->layer_block || ec->layer_pending) return;
 
    /* otherwise, client is on unexpected layer */
    ELOGF("LAYER", "layer dismatch ec->layer %d | evas obj layer %d ", ec, ec->layer, layer);
@@ -2140,42 +2227,97 @@ _e_comp_object_layers_update(unsigned int layer, E_Comp_Input_Inlist_Function_Ty
 static void
 _e_comp_object_layers_add(E_Desk_Area *eda, E_Comp_Object *cw, E_Comp_Object *above, E_Comp_Object *below, Eina_Bool prepend)
 {
-   if (!cw->ec) return;
-
-   E_Policy_Desk_Area *pda = e_policy_desk_area_get(eda);
-   E_View *view = e_view_client_view_get(e_client_view_get(cw->ec));
+#ifdef NEED_REFINE_EDA_LAYERS_LIST
+   E_Comp *comp;
+   comp = e_comp_get();
+#endif
 
    e_comp_ec_list_lock();
 
+#ifdef NEED_REFINE_EDA_LAYERS_LIST
    if (above)
      {
-        E_View *above_view = e_view_client_view_get(e_client_view_get(above->ec));
-        e_view_place_above(view, above_view);
+        comp->layers[above->layer].clients = eina_inlist_append_relative(comp->layers[above->layer].clients, EINA_INLIST_GET(cw->ec), EINA_INLIST_GET(above->ec));
+        comp->layers[above->layer].clients_count++;
         _e_comp_object_layers_update(above->layer, E_COMP_INPUT_INLIST_APPEND_RELATIVE, cw->ec, above->ec);
      }
    else if (below)
      {
-        E_View *below_view = e_view_client_view_get(e_client_view_get(below->ec));
-        e_view_place_below(view, below_view);
+        comp->layers[below->layer].clients = eina_inlist_prepend_relative(comp->layers[below->layer].clients, EINA_INLIST_GET(cw->ec), EINA_INLIST_GET(below->ec));
+        comp->layers[below->layer].clients_count++;
         _e_comp_object_layers_update(below->layer, E_COMP_INPUT_INLIST_PREPEND_RELATIVE, cw->ec, below->ec);
      }
    else
      {
-        E_Policy_Desk_Area_Layer *pdal = pda->layers[cw->layer];
         if (prepend)
           {
-             // prepend means bottom
-             E_View *layer_obj = e_policy_desk_area_layer_obj_get(pdal);
-             e_view_place_above(view, layer_obj);
+             comp->layers[cw->layer].clients = eina_inlist_prepend(comp->layers[cw->layer].clients, EINA_INLIST_GET(cw->ec));
              _e_comp_object_layers_update(cw->layer, E_COMP_INPUT_INLIST_PREPEND, cw->ec, NULL);
           }
-        else
+        else //this is either the layer object or a tough actin tinactin^W^W^Wfast stacking client
+          {
+             comp->layers[cw->layer].clients = eina_inlist_append(comp->layers[cw->layer].clients, EINA_INLIST_GET(cw->ec));
+             _e_comp_object_layers_update(cw->layer, E_COMP_INPUT_INLIST_APPEND, cw->ec, NULL);
+          }
+        comp->layers[cw->layer].clients_count++;
+     }
+#else
+   if (above)
+     {
+        eda->layers[above->layer].clients = eina_inlist_append_relative(eda->layers[above->layer].clients, EINA_INLIST_GET(cw->ec), EINA_INLIST_GET(above->ec));
+        eda->layers[above->layer].clients_count++;
+        _e_comp_object_layers_update(above->layer, E_COMP_INPUT_INLIST_APPEND_RELATIVE, cw->ec, above->ec);
+     }
+   else if (below)
+     {
+        eda->layers[below->layer].clients = eina_inlist_prepend_relative(eda->layers[below->layer].clients, EINA_INLIST_GET(cw->ec), EINA_INLIST_GET(below->ec));
+        eda->layers[below->layer].clients_count++;
+        _e_comp_object_layers_update(below->layer, E_COMP_INPUT_INLIST_PREPEND_RELATIVE, cw->ec, below->ec);
+     }
+   else
+     {
+        if (prepend)
           {
-             E_View_Tree *view_tree = e_policy_desk_area_layer_view_tree_get(pdal);
-             e_view_reparent(view, view_tree);
+             eda->layers[cw->layer].clients = eina_inlist_prepend(eda->layers[cw->layer].clients, EINA_INLIST_GET(cw->ec));
+             _e_comp_object_layers_update(cw->layer, E_COMP_INPUT_INLIST_PREPEND, cw->ec, NULL);
+          }
+        else //this is either the layer object or a tough actin tinactin^W^W^Wfast stacking client
+          {
+             eda->layers[cw->layer].clients = eina_inlist_append(eda->layers[cw->layer].clients, EINA_INLIST_GET(cw->ec));
              _e_comp_object_layers_update(cw->layer, E_COMP_INPUT_INLIST_APPEND, cw->ec, NULL);
           }
+        eda->layers[cw->layer].clients_count++;
+     }
+#endif
+
+   e_comp_ec_list_unlock();
+}
+
+static void
+_e_comp_object_layers_remove(E_Desk_Area *eda, E_Comp_Object *cw)
+{
+#ifdef NEED_REFINE_EDA_LAYERS_LIST
+   E_Comp *comp;
+   comp = e_comp_get();
+#endif
+
+   e_comp_ec_list_lock();
+
+#ifdef NEED_REFINE_EDA_LAYERS_LIST
+   if (cw->ec && comp->layers[cw->layer].clients)
+     {
+        comp->layers[cw->layer].clients = eina_inlist_remove(comp->layers[cw->layer].clients, EINA_INLIST_GET(cw->ec));
+        comp->layers[cw->layer].clients_count--;
+        _e_comp_object_layers_update(cw->layer, E_COMP_INPUT_INLIST_REMOVE, cw->ec, NULL);
      }
+#else
+   if (cw->ec && eda->layers[cw->layer].clients)
+     {
+        eda->layers[cw->layer].clients = eina_inlist_remove(eda->layers[cw->layer].clients, EINA_INLIST_GET(cw->ec));
+        eda->layers[cw->layer].clients_count--;
+        _e_comp_object_layers_update(cw->layer, E_COMP_INPUT_INLIST_REMOVE, cw->ec, NULL);
+     }
+#endif
 
    e_comp_ec_list_unlock();
 }
@@ -2199,6 +2341,10 @@ _e_comp_object_layer_update(E_Desk_Area *eda, Evas_Object *obj,
    E_Comp_Object *cw, *cw2 = NULL;
    Evas_Object *o = NULL;
    short layer;
+#ifdef NEED_REFINE_EDA_LAYERS_LIST
+   E_Comp *comp;
+   comp = e_comp_get();
+#endif
 
    cw = evas_object_smart_data_get(obj);
    if (!cw) return;
@@ -2218,13 +2364,17 @@ _e_comp_object_layer_update(E_Desk_Area *eda, Evas_Object *obj,
         cw2 = evas_object_data_get(o, "comp_obj");
         while (!cw2)
           {
-             if (evas_object_data_get(o, "layer_obj")) break;
+             if (!e_util_strcmp(evas_object_name_get(o), "layer_obj")) break;
 
              o = evas_object_above_get(o);
              if ((!o) || (o == cw->smart_obj)) break;
              if (evas_object_layer_get(o) != layer)
                {
-                  o = e_desk_area_layer_object_get(eda, E_LAYER_CLIENT_ALERT);
+#ifdef NEED_REFINE_EDA_LAYERS_LIST
+                  o = comp->layers[e_comp_canvas_layer_map(E_LAYER_CLIENT_ALERT)].obj;
+#else
+                  o = eda->layers[e_comp_canvas_layer_map(E_LAYER_CLIENT_ALERT)].obj;
+#endif
                }
              if (!o)
                {
@@ -2237,6 +2387,7 @@ _e_comp_object_layer_update(E_Desk_Area *eda, Evas_Object *obj,
           }
      }
 
+   _e_comp_object_layers_remove(eda, cw);
    if (cw2)
      {
         if (cw2->layer > cw->layer)
@@ -2253,8 +2404,6 @@ _e_comp_object_layer_update(E_Desk_Area *eda, Evas_Object *obj,
         else
           _e_comp_object_layers_add(eda, cw, NULL, NULL, 1);
      }
-   else if (evas_object_data_get(o, "layer_obj"))
-     _e_comp_object_layers_add(eda, cw, NULL, NULL, above? 1 : 0);
    else
      _e_comp_object_layers_add(eda, cw, NULL, NULL, 0);
 }
@@ -2267,6 +2416,10 @@ _e_comp_intercept_stack_helper(E_Desk_Area *eda, E_Comp_Object *cw, Evas_Object
    short layer;
    Evas_Object *o = stack;
    Eina_Bool raising = stack_cb == e_comp_object_stack_above;
+#ifdef NEED_REFINE_EDA_LAYERS_LIST
+   E_Comp *comp;
+   comp = e_comp_get();
+#endif
 
    /* We should consider topmost's layer_pending for subsurface */
    if ((cw->ec->layer_block) || _e_comp_object_is_pending(cw->ec))
@@ -2306,7 +2459,8 @@ _e_comp_intercept_stack_helper(E_Desk_Area *eda, E_Comp_Object *cw, Evas_Object
    while (!cw2)
      {
         /* check for non-client layer object */
-        if (evas_object_data_get(o, "layer_obj")) break;
+        if (!e_util_strcmp(evas_object_name_get(o), "layer_obj"))
+          break;
         /* find an existing client to use for layering
          * by walking up the object stack
          *
@@ -2321,7 +2475,11 @@ _e_comp_intercept_stack_helper(E_Desk_Area *eda, E_Comp_Object *cw, Evas_Object
              /* reached the top client layer somehow
               * use top client object
               */
-             o = e_desk_area_layer_object_get(eda, E_LAYER_CLIENT_CURSOR);
+#ifdef NEED_REFINE_EDA_LAYERS_LIST
+             o = comp->layers[e_comp_canvas_layer_map(E_LAYER_CLIENT_CURSOR)].obj;
+#else
+             o = eda->layers[e_comp_canvas_layer_map(E_LAYER_CLIENT_CURSOR)].obj;
+#endif
           }
         if (!o)
           /* top client layer window hasn't been stacked yet. this probably shouldn't happen?
@@ -2342,6 +2500,7 @@ _e_comp_intercept_stack_helper(E_Desk_Area *eda, E_Comp_Object *cw, Evas_Object
      return;
 
    /* remove existing layers */
+   _e_comp_object_layers_remove(eda, cw);
    if (cw2)
      {
         if (o == stack) //if stacking above, cw2 is above; else cw2 is below
@@ -2351,8 +2510,6 @@ _e_comp_intercept_stack_helper(E_Desk_Area *eda, E_Comp_Object *cw, Evas_Object
         else //if no stacking objects found, either raise or lower
           _e_comp_object_layers_add(eda, cw, raising ? NULL : cw2, raising ? cw2 : NULL, 0);
      }
-   else if (evas_object_data_get(stack, "layer_obj"))
-     _e_comp_object_layers_add(eda, cw, NULL, NULL, raising);
    else
      _e_comp_object_layers_add(eda, cw, NULL, NULL, 0);
 
@@ -2377,7 +2534,11 @@ _e_comp_intercept_stack_helper(E_Desk_Area *eda, E_Comp_Object *cw, Evas_Object
                   /* stack it above layer object */
                   int below_layer;
                   below_layer = (cw2->layer <= 0)? 0 : cw2->layer - 1 ;
-                  stack = e_desk_area_layer_object_get(eda, _e_desk_area_layer_util_map_to_eda_layer(below_layer));
+#ifdef NEED_REFINE_EDA_LAYERS_LIST
+                  stack = comp->layers[below_layer].obj;
+#else
+                  stack = eda->layers[below_layer].obj;
+#endif
                }
           }
         else
@@ -2392,7 +2553,11 @@ _e_comp_intercept_stack_helper(E_Desk_Area *eda, E_Comp_Object *cw, Evas_Object
              if ((new_stack) && (new_stack->layer == cw2->ec->layer))
                stack = new_stack->frame;
              else
-               stack = e_desk_area_layer_object_get(eda, _e_desk_area_layer_util_map_to_e_layer(cw2->layer));
+#ifdef NEED_REFINE_EDA_LAYERS_LIST
+               stack = comp->layers[cw2->layer].obj;
+#else
+               stack = eda->layers[cw2->layer].obj;
+#endif
           }
      }
 
@@ -2400,8 +2565,13 @@ _e_comp_intercept_stack_helper(E_Desk_Area *eda, E_Comp_Object *cw, Evas_Object
    if (cw->ec->new_client || (!ecstack) || (ecstack->frame != o))
      evas_object_data_set(cw->smart_obj, "client_restack", (void*)1);
    stack_cb(cw->smart_obj, stack);
-   if (e_desk_area_layer_object_get(eda, _e_desk_area_layer_util_map_to_e_layer(cw->layer)))
-     if (evas_object_below_get(cw->smart_obj) == e_desk_area_layer_object_get(eda, _e_desk_area_layer_util_map_to_e_layer(cw->layer)))
+#ifdef NEED_REFINE_EDA_LAYERS_LIST
+   if (comp->layers[cw->layer].obj)
+     if (evas_object_below_get(cw->smart_obj) == comp->layers[cw->layer].obj)
+#else
+   if (eda->layers[cw->layer].obj)
+     if (evas_object_below_get(cw->smart_obj) == eda->layers[cw->layer].obj)
+#endif
        {
           CRI("STACKING ERROR!!! ec:%p (cw->layer:%d, ec->layer:%d)", cw->ec, cw->layer, cw->ec->layer);
        }
@@ -2436,25 +2606,10 @@ _desk_area_cb_comp_object_lower(struct wl_listener *listener, void *data)
         return;
      }
 
-   //if (!EINA_INLIST_GET(cw->ec)->prev) return; //already lowest on layer
-#if 0 // skip lowest check on view... evas object stack and view still mismatch
-   pdal = pda->layers[cw->layer];
-   layer_tree = e_policy_desk_area_layer_view_tree_get(pdal);
-   if (e_view_tree_bottom_get(layer_tree) == e_view_client_view_get(e_client_view_get(ec)))
-   {
-      DBG("Already on bottom, but no skip...");
-   }
-   else if (e_policy_desk_area_layer_obj_get(pdal))
-     {
-        E_View *layer_view = e_policy_desk_area_layer_obj_get(pdal);
-        if (e_view_above_get(layer_view) == e_view_client_view_get(e_client_view_get(ec)))
-        {
-           DBG("Already on bottom, but no skip...");
-        }
-     }
-#endif
+   if (!EINA_INLIST_GET(cw->ec)->prev) return; //already lowest on layer
 
    o = evas_object_below_get(obj);
+   _e_comp_object_layers_remove(eda, cw);
    /* prepend to client list since this client should be the first item now */
    _e_comp_object_layers_add(eda, cw, NULL, NULL, 1);
    if (evas_object_layer_get(o) != evas_object_layer_get(obj)) return; //already at bottom!
@@ -2474,8 +2629,12 @@ _desk_area_cb_comp_object_raise(struct wl_listener *listener, void *data)
    E_Policy_Desk_Area_Private_Client *eda_client;
    E_Desk_Area *eda;
    E_Client *ec;
-   Evas_Object *obj, *o;
+   Evas_Object *obj, *o, *op;
    E_Comp_Object *cw;
+#ifdef NEED_REFINE_EDA_LAYERS_LIST
+   E_Comp *comp;
+   comp = e_comp_get();
+#endif
 
    eda_client = wl_container_of(listener, eda_client, comp_object_raise);
    eda = eda_client->eda;
@@ -2495,24 +2654,20 @@ _desk_area_cb_comp_object_raise(struct wl_listener *listener, void *data)
         e_comp_object_raise(obj);
         return;
      }
-   //if (!EINA_INLIST_GET(cw->ec)->next) return;//already highest on layer
-#if 0 // skip topmost check on view... evas object stack and view still mismatch
-   pdal = pda->layers[cw->layer];
-   layer_tree = e_policy_desk_area_layer_view_tree_get(pdal);
-   if (e_view_tree_top_get(layer_tree) == e_view_client_view_get(e_client_view_get(ec)))
-     {
-        DBG("Already on top, but no skip...");
-     }
-#endif
-
+   if (!EINA_INLIST_GET(cw->ec)->next) return;//already highest on layer
    o = evas_object_above_get(obj);
-   if (evas_object_layer_get(o) != evas_object_layer_get(obj))return; //already at top!
+   if (evas_object_layer_get(o) != evas_object_layer_get(obj)) return; //already at top!
 
    /* still stack below override below the layer marker */
-#if 0
-   for (op = o = e_desk_area_layer_object_get(eda, _e_desk_area_layer_util_map_to_e_layer(cw->layer));
-        o && o != e_desk_area_layer_object_get(eda, _e_desk_area_layer_util_map_to_e_layer(cw->layer - 1));
+#ifdef NEED_REFINE_EDA_LAYERS_LIST
+   for (op = o = comp->layers[cw->layer].obj;
+        o && o != comp->layers[cw->layer - 1].obj;
+        op = o, o = evas_object_below_get(o))
+#else
+   for (op = o = eda->layers[cw->layer].obj;
+        o && o != eda->layers[cw->layer - 1].obj;
         op = o, o = evas_object_below_get(o))
+#endif
      {
         if (evas_object_smart_smart_get(o))
           {
@@ -2522,8 +2677,7 @@ _desk_area_cb_comp_object_raise(struct wl_listener *listener, void *data)
              if (ec && (!ec->override)) break;
           }
      }
-#endif
-   e_comp_object_raise(obj);
+   e_comp_object_stack_below(obj, op);
    e_client_focus_defer_set(cw->ec);
 
    if (!cw->visible) return;
@@ -2544,6 +2698,10 @@ _desk_area_cb_comp_object_set_layer(struct wl_listener *listener, void *data)
    E_Comp_Wl_Client_Data *child_cdata;
    unsigned int l;
    int oldraise;
+#ifdef NEED_REFINE_EDA_LAYERS_LIST
+   E_Comp *comp;
+   comp = e_comp_get();
+#endif
 
    eda_client = wl_container_of(listener, eda_client, comp_object_set_layer);
    eda = eda_client->eda;
@@ -2554,11 +2712,8 @@ _desk_area_cb_comp_object_set_layer(struct wl_listener *listener, void *data)
    layer = layer_set_data->layer;
    l = e_comp_canvas_layer_map(layer);
 
-   ELOGF("COMP_OBJECT", "layer set to %d", ec, layer);
-
    if ((cw->ec->layer_block) || (cw->ec->layer_pending))
      {
-        ELOGF("COMP_OBJECT", "client is layer block(%d) or pending(%d)", ec, ec->layer_block, ec->layer_pending);
         /* doing a compositor effect, follow directions */
         e_comp_object_layer_set(obj, layer);
         if (layer == cw->ec->layer) //trying to put layer back
@@ -2598,32 +2753,27 @@ _desk_area_cb_comp_object_set_layer(struct wl_listener *listener, void *data)
                     evas_object_stack_below(obj, ec2->frame);
                }
              else
-               evas_object_stack_below(obj, ec2 ? ec2->frame : e_desk_area_layer_object_get(eda, _e_desk_area_layer_util_map_to_e_layer(cw->layer)));
+#ifdef NEED_REFINE_EDA_LAYERS_LIST
+               evas_object_stack_below(obj, ec2 ? ec2->frame : comp->layers[cw->layer].obj);
+#else
+               evas_object_stack_below(obj, ec2 ? ec2->frame : eda->layers[cw->layer].obj);
+#endif
           }
         return;
      }
 
 layer_set:
-   if (cw->layer == l)
-   {
-      ELOGF("COMP_OBJECT", "RETURNED, cw->layer:%d, l:%d", ec, cw->layer, l);
-      return;
-   }
+   if (cw->layer == l) return;
    if (!e_util_client_layer_validate(layer))
-   {
-      ELOGF("COMP_OBJECT", "RETURNED, layer is not valid %d", ec, layer);
      return; //invalid layer for clients not doing comp effects
-   }
    if (cw->ec->fullscreen)
      {
         cw->ec->saved.layer = layer;
-        ELOGF("COMP_OBJECT", "RETURNED, ec is fullscreen and saved the layer %d", ec, layer);
         return;
      }
    oldraise = e_config->transient.raise;
    cw->ec->layer = layer;
    e_client_input_thread_layer_set(cw->ec, layer);
-
    if (e_config->transient.layer)
      {
         E_Client *child;
@@ -2649,14 +2799,21 @@ layer_set:
 
    e_config->transient.raise = oldraise;
 
-   e_comp_object_layer_set(obj, layer);
+   _e_comp_object_layers_remove(eda, cw);
    cw->layer = e_comp_canvas_layer_map(layer);
    _e_comp_object_layers_add(eda, cw, NULL, NULL, 0);
    //if (cw->ec->new_client)
      //INF("CLIENT STACKED %p: %u", cw->ec, layer);
-   if (!e_desk_area_layer_object_get(eda, _e_desk_area_layer_util_map_to_e_layer(cw->layer))) return; //this is a layer marker
-   evas_object_stack_below(obj, e_desk_area_layer_object_get(eda, _e_desk_area_layer_util_map_to_e_layer(cw->layer)));
-   if (evas_object_below_get(obj) == e_desk_area_layer_object_get(eda, _e_desk_area_layer_util_map_to_e_layer(cw->layer)))
+   e_comp_object_layer_set(obj, layer);
+#ifdef NEED_REFINE_EDA_LAYERS_LIST
+   if (!comp->layers[cw->layer].obj) return; //this is a layer marker
+   evas_object_stack_below(obj, comp->layers[cw->layer].obj);
+   if (evas_object_below_get(obj) == comp->layers[cw->layer].obj)
+#else
+   if (!eda->layers[cw->layer].obj) return; //this is a layer marker
+   evas_object_stack_below(obj, eda->layers[cw->layer].obj);
+   if (evas_object_below_get(obj) == eda->layers[cw->layer].obj)
+#endif
      {
         /* can't stack a client above its own layer marker */
         CRI("STACKING ERROR!!! ec:%p (cw->layer:%d, ec->layer:%d)", cw->ec, cw->layer, cw->ec->layer);
@@ -2846,7 +3003,9 @@ _e_policy_desk_area_private_client_del(E_Policy_Desk_Area_Private_Client *eda_cl
 #ifdef CLIENT_DEL_STACK_ISSUE
 #else
    cw = evas_object_smart_data_get(ec->frame);
-   if (!cw)
+   if (cw)
+     _e_comp_object_layers_remove(eda, cw);
+   else
      ELOGF("EDA", "No Comp Object. Fix Me~!!", ec);
 #endif // CLIENT_DEL_STACK_ISSUE
 
@@ -3028,7 +3187,9 @@ _e_policy_desk_area_cb_client_free(void *data, E_Client *ec)
    ELOGF("EDA", "HOOK CLIENT FREE. desk_area:%p", ec, eda);
 
    cw = evas_object_smart_data_get(ec->frame);
-   if (!cw)
+   if (cw)
+     _e_comp_object_layers_remove(eda, cw);
+   else
      ELOGF("EDA", "No Comp Object. Fix Me~!!", ec);
 }
 #endif //CLIENT_DEL_STACK_ISSUE
@@ -3066,14 +3227,27 @@ _e_policy_desk_area_init_layer(E_Policy_Desk_Area *pda)
 {
    E_Policy_Desk_Area_Layer *pdal;
    E_Desk_Area_Layer eda_layer;
+   Evas_Object *obj;
+#ifdef NEED_REFINE_EDA_LAYERS_LIST
+   E_Comp *comp;
+   comp = e_comp_get();
+#endif
 
    /* init client's layers */
-   for (eda_layer = _e_desk_area_layer_util_map_to_eda_layer(E_LAYER_BOTTOM);
-        eda_layer <= _e_desk_area_layer_util_map_to_eda_layer(E_LAYER_MAX);
+   for (eda_layer = _e_desk_area_layer_util_map_to_eda_layer(E_LAYER_CLIENT_DESKTOP);
+        eda_layer <= _e_desk_area_layer_util_map_to_eda_layer(E_LAYER_CLIENT_CURSOR);
         eda_layer++)
      {
+
+#ifdef NEED_REFINE_EDA_LAYERS_LIST
+        obj = comp->layers[eda_layer].obj = evas_object_rectangle_add(e_comp_evas_get());
+#else
+        obj = eda->layers[eda_layer].obj = evas_object_rectangle_add(e_comp_evas_get());
+#endif
         pdal = e_policy_desk_area_layer_new(pda, _e_desk_area_layer_util_map_to_e_layer(eda_layer));
         if (pdal) pda->layers[eda_layer] = pdal;
+        evas_object_layer_set(obj, _e_desk_area_layer_util_map_to_e_layer(eda_layer));
+        evas_object_name_set(obj, "layer_obj");
      }
 }
 
index 61ab5a592470e2acded534bfc3954638f295dfa2..ea0099bae3d3c6c8b5b3f66db5cb74f82a4eef35 100644 (file)
@@ -6,7 +6,6 @@
 #include "e_view_intern.h"
 #include "e_view_rect.h"
 #include "e_client.h"
-#include "e_utils_intern.h"
 
 
 struct _E_Policy_Desk_Area_Layer
@@ -29,16 +28,9 @@ _e_policy_desk_area_layer_tree_destroy(E_View_Tree *tree)
 static void
 _e_policy_desk_area_layer_tree_child_add(E_View_Tree *tree, E_View *child)
 {
-   E_Policy_Desk_Area_Layer *pdal;
-   E_Policy_Container *container;
-
-   container = wl_container_of(tree, container, tree);
-   pdal = e_policy_container_impl_get(container);
-
-   if (child->eo) evas_object_layer_set(child->eo, pdal->layer);
-
-   // lower layer object
-   if (pdal->layer_bottom) e_view_lower_to_bottom(pdal->layer_bottom);
+   if (!child->eo)
+     return;
+   // doing something
 }
 
 static void
@@ -96,7 +88,6 @@ e_policy_desk_area_layer_new(E_Policy_Desk_Area *pda, E_Layer layer)
     E_Desk_Area *eda;
     E_View_Rect *layer_bottom_rect;
     int color[4] = {0, 0, 0, 255};
-    char layer_name[20] = "layer_obj_";
 
     EINA_SAFETY_ON_NULL_GOTO(pda, err);
 
@@ -125,14 +116,9 @@ e_policy_desk_area_layer_new(E_Policy_Desk_Area *pda, E_Layer layer)
     pdal->layer = layer;
     pdal->layer_bottom = e_view_rect_view_get(layer_bottom_rect);
 
-    evas_object_layer_set(pdal->layer_bottom->eo, layer);
-    eina_convert_itoa(layer, layer_name + strlen(layer_name));
-    evas_object_name_set(pdal->layer_bottom->eo, layer_name);
-    e_view_pass_events_set(pdal->layer_bottom, true);
-    e_view_name_set(pdal->layer_bottom, layer_name);
-    e_view_data_set(pdal->layer_bottom, "layer_obj", (void*) 1);
-    if (e_util_client_layer_validate(layer)) e_view_data_set(pdal->layer_bottom, "client_layer_obj", (void*) 1);
-
+    // TODO: set layer
+    //evas_object_layer_set(pdal->layer_bottom->eo, layer);
+    evas_object_name_set(pdal->layer_bottom->eo, "layer_obj");
    return pdal;
 
 err:
index 92f9938481d9acb5ac6662a3ec273ebf1b5e6edd..2030707e3c62b5f82b4ca90e3924f558d902f211 100644 (file)
@@ -27,6 +27,8 @@ using namespace std;
 # define E_COMP_TYPE (int) 0xE0b01003
 # define E_CLIENT_LAYER_COUNT 19
 
+#define NEED_REFINE_EDA_LAYERS_LIST
+
 typedef struct _E_Comp                       E_Comp;
 typedef struct _E_Comp_Wl_Client_Data        E_Comp_Client_Data;  // deprecated. use E_Comp_Wl_Client_Data intead of this.
 typedef struct _E_Comp_Wl_Data               E_Comp_Wl_Data;