e_policy_desk_area: refine layer list to use e_view_tree 35/325435/1
authorJunseok Kim <juns.kim@samsung.com>
Fri, 11 Apr 2025 06:10:50 +0000 (15:10 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Tue, 10 Jun 2025 09:37:49 +0000 (18:37 +0900)
Change-Id: I584bac1f5025b93d0adbb964c156c741fc5ee5a4

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 9964faaed90eece789bfe2235ce9624cd5d411d9..0ed44a778882c4303864ce53570e68b5b41e722b 100644 (file)
@@ -3,10 +3,6 @@
 #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 03f38008fae98105c64cab0dcc63aaaa797d551f..44c8b2cf3a49c79a95f811394016b9b126878971 100644 (file)
@@ -34,12 +34,6 @@ 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 5e634fc1c8395564b81ee9b1cf2788b17b803a51..d6146639b3d52742e5eb252614d3a0ecd4285dc8 100644 (file)
@@ -407,7 +407,7 @@ _e_test_helper_message_append_client(Eldbus_Message_Iter *iter, E_Client *ec)
        x, y, w, h,
 
        /* layer */
-       evas_object_layer_get(ec->frame),
+       e_client_layer_get(ec),
 
        /* effect */
        evas_object_data_get(ec->frame, "effect_running"),
index 35c563598c13c00e1ef67c5842a820cfb84b1c0a..3ff7b2bcb3337f4ebe312c74f5c5484ee77296b2 100644 (file)
@@ -240,8 +240,26 @@ _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: assert(0);
+      default: break;
      }
+
+   /* 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;
 }
 
 
@@ -406,52 +424,58 @@ _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 *get_data;
-   E_Desk_Area *eda;
+   E_Desk_Area_Data_EC_Get *client_data;
+   E_Desk_Area_Data_EC_Get iter_data = {0,};
    E_Policy_Desk_Area *pda;
-
-   E_Client *ec;
+   E_Policy_Desk_Area_Layer *pdal;
+   E_View_Tree *layer_tree;
    unsigned int x;
 
    pda = wl_container_of(listener, pda, top_ec_get);
-   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
+   client_data = (E_Desk_Area_Data_EC_Get *) data;
+   iter_data.criterion_ec = NULL;
 
    e_comp_ec_list_lock();
 
-   for (x = e_comp_canvas_layer_map(E_LAYER_CLIENT_CURSOR); x >= e_comp_canvas_layer_map(E_LAYER_CLIENT_DESKTOP); x--)
+   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--)
      {
-#ifdef NEED_REFINE_EDA_LAYERS_LIST
-        if (!comp->layers[x].clients) continue;
+        pdal = pda->layers[x];
+        if (!pdal) continue;
 
-        EINA_INLIST_REVERSE_FOREACH(comp->layers[x].clients, ec)
+        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)
           {
-             if (e_object_is_del(E_OBJECT(ec))) continue;
-             if (!e_desk_area_has_ec(eda, ec)) continue;
-
+             client_data->result_ec = iter_data.result_ec;
              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();
@@ -460,49 +484,34 @@ _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 *get_data;
-   E_Desk_Area *eda;
+   E_Desk_Area_Data_EC_Get *client_data;
+   E_Desk_Area_Data_EC_Get iter_data = {0,};
    E_Policy_Desk_Area *pda;
-
-   E_Client *ec;
+   E_Policy_Desk_Area_Layer *pdal;
+   E_View_Tree *layer_tree;
    unsigned int x;
 
    pda = wl_container_of(listener, pda, bottom_ec_get);
-   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
+   client_data = (E_Desk_Area_Data_EC_Get *) data;
+   iter_data.criterion_ec = NULL;
 
    e_comp_ec_list_lock();
 
-   for (x = e_comp_canvas_layer_map(E_LAYER_CLIENT_DESKTOP); x <= e_comp_canvas_layer_map(E_LAYER_CLIENT_CURSOR); x++)
+   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++)
      {
-#ifdef NEED_REFINE_EDA_LAYERS_LIST
-        if (!comp->layers[x].clients) continue;
+        pdal = pda->layers[x];
+        if (!pdal) continue;
 
-        EINA_INLIST_FOREACH(comp->layers[x].clients, ec)
+        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)
           {
-             if (e_object_is_del(E_OBJECT(ec))) continue;
-             if (!e_desk_area_has_ec(eda, ec)) continue;
-
+             client_data->result_ec = iter_data.result_ec;
              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();
@@ -533,16 +542,15 @@ _e_policy_desk_area_cb_layer_obj_get(struct wl_listener *listener, void *data)
 {
    E_Desk_Area_Data_Layer_Object_Get *obj_data = (E_Desk_Area_Data_Layer_Object_Get *) data;
    E_Policy_Desk_Area *pda;
+   E_Policy_Desk_Area_Layer *pdal;
+   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)];
 
-#ifdef NEED_REFINE_EDA_LAYERS_LIST
-   E_Comp *comp;
-   comp = e_comp_get();
-   obj_data->layer_obj = comp->layers[e_comp_canvas_layer_map(obj_data->layer)].obj;
-#else
-   obj_data->layer_obj = eda->layers[e_comp_canvas_layer_map(obj_data->layer)].obj;
-#endif
+   layer_view = e_policy_desk_area_layer_obj_get(pdal);
+   if (layer_view)
+     obj_data->layer_obj = layer_view->eo;
 
    return;
 }
@@ -576,47 +584,33 @@ _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 *eda;
-   E_Client *ec, *ec2;
+   E_Desk_Area_Data_EC_Get iter_data = {0,};
+   E_Policy_Desk_Area_Layer *pdal;
+   E_View_Tree *layer_tree;
+   E_Client *ec;
    unsigned int x;
 
    pda = wl_container_of(listener, pda, client_above_get);
-   eda = pda->desk_area;
+   iter_data.criterion_ec = client_data->criterion_ec;
    ec = client_data->criterion_ec;
 
-#ifdef NEED_REFINE_EDA_LAYERS_LIST
-   E_Comp *comp;
-   comp = e_comp_get();
-#endif
-
    e_comp_ec_list_lock();
 
-   if (EINA_INLIST_GET(ec)->next) //check current layer
+   x = _e_desk_area_layer_util_map_to_eda_layer(ec->layer);
+   pdal = pda->layers[x];
+   if (!pdal)
      {
-        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;
+        ERR("EDA: Couldn't get layer of ec(%p):%s / layer:%d", ec, e_client_icccm_title_get(ec), ec->layer);
+        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
-          }
+   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;
      }
 
    e_comp_ec_list_unlock();
@@ -624,48 +618,24 @@ _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_comp_canvas_layer_map(ec->layer) + 1; x <= e_comp_canvas_layer_map(E_LAYER_CLIENT_CURSOR); x++)
+   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++)
      {
-#ifdef NEED_REFINE_EDA_LAYERS_LIST
-        if (!comp->layers[x].clients) continue;
+        pdal = pda->layers[x];
+        if (!pdal) continue;
 
-        EINA_INLIST_FOREACH(comp->layers[x].clients, ec2)
+        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)
           {
-             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;
+             client_data->result_ec = iter_data.result_ec;
              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();
@@ -676,51 +646,36 @@ _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 *eda;
-   E_Client *ec, *ec2;
+   E_Desk_Area_Data_EC_Get iter_data = {0,};
+   E_Policy_Desk_Area_Layer *pdal;
+   E_View_Tree *layer_tree;
    unsigned int x;
-   Eina_Inlist *l;
+   E_Client *ec;
    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);
-   eda = pda->desk_area;
+   iter_data.criterion_ec = client_data->criterion_ec;
    ec = client_data->criterion_ec;
 
-#ifdef NEED_REFINE_EDA_LAYERS_LIST
-   E_Comp *comp;
-   comp = e_comp_get();
-#endif
-
    e_comp_ec_list_lock();
 
-   if (EINA_INLIST_GET(ec)->prev) //check current layer
+   x = _e_desk_area_layer_util_map_to_eda_layer(ec->layer);
+   pdal = pda->layers[x];
+   if (!pdal)
      {
-        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;
+        ERR("EDA: Couldn't get layer of ec(%p):%s / layer:%d", ec, e_client_icccm_title_get(ec), ec->layer);
+        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
-          }
+   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;
      }
 
    e_comp_ec_list_unlock();
@@ -736,7 +691,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, eda, ec_layer, ec_layer_cw, ec->layer_block, ec->layer_pending);
+                        ec, pda->desk_area, ec_layer, ec_layer_cw, ec->layer_block, ec->layer_pending);
                   ec_layer = ec_layer_cw;
                }
           }
@@ -745,51 +700,25 @@ _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;
 
-   /* go down the layers until we find one */
-   x = e_comp_canvas_layer_map(ec_layer);
-   if (x > 0) x--;
-
-   e_comp_ec_list_lock();;
+   e_comp_ec_list_lock();
 
-   for (; x >= e_comp_canvas_layer_map(E_LAYER_CLIENT_DESKTOP); x--)
+   /* 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--)
      {
-#ifdef NEED_REFINE_EDA_LAYERS_LIST
-        if (!comp->layers[x].clients) continue;
+        pdal = pda->layers[x];
+        if (!pdal) continue;
 
-        EINA_INLIST_REVERSE_FOREACH(comp->layers[x].clients, ec2)
+        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)
           {
-             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;
+             client_data->result_ec = iter_data.result_ec;
              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();
@@ -805,48 +734,61 @@ _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 *eda;
-   E_Client *ec, *ec2;
+   E_Desk_Area_Data_EC_Get iter_data = {0,};
+   E_Policy_Desk_Area_Layer *pdal;
+   E_View_Tree *layer_tree;
    unsigned int x;
+   E_Client *ec;
 
    pda = wl_container_of(listener, pda, client_visible_above_get);
-   eda = pda->desk_area;
+   iter_data.criterion_ec = client_data->criterion_ec;
    ec = client_data->criterion_ec;
 
-#ifdef NEED_REFINE_EDA_LAYERS_LIST
-   E_Comp *comp;
-   comp = e_comp_get();
-#endif
-
    e_comp_ec_list_lock();
 
-   if (EINA_INLIST_GET(ec)->next) //check current layer
+   x = _e_desk_area_layer_util_map_to_eda_layer(ec->layer);
+   pdal = pda->layers[x];
+   if (!pdal)
      {
-        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;
+        ERR("EDA: Couldn't get layer of ec(%p):%s / layer:%d", ec, e_client_icccm_title_get(ec), ec->layer);
+        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
-          }
+   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;
      }
 
    e_comp_ec_list_unlock();
@@ -854,36 +796,24 @@ _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_comp_canvas_layer_map(ec->layer) + 1; x <= e_comp_canvas_layer_map(E_LAYER_CLIENT_CURSOR); x++)
+   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++)
      {
-#ifdef NEED_REFINE_EDA_LAYERS_LIST
-        if (!comp->layers[x].clients) continue;
-        EINA_INLIST_FOREACH(comp->layers[x].clients, ec2)
-          {
-             if (ec == ec2) continue;
-             if (!_desk_area_client_check_visible(ec2)) continue;
-             if (!e_desk_area_has_ec(eda, ec2)) continue;
+        pdal = pda->layers[x];
+        if (!pdal) continue;
 
-             client_data->result_ec = ec2;
+        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;
           }
-#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();
@@ -894,47 +824,36 @@ _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 *eda;
-   E_Client *ec, *ec2;
+   E_Desk_Area_Data_EC_Get iter_data = {0,};
+   E_Policy_Desk_Area_Layer *pdal;
+   E_View_Tree *layer_tree;
    unsigned int x;
-   Eina_Inlist *l;
+   E_Client *ec;
    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);
-   eda = pda->desk_area;
+   iter_data.criterion_ec = client_data->criterion_ec;
    ec = client_data->criterion_ec;
 
-#ifdef NEED_REFINE_EDA_LAYERS_LIST
-   E_Comp *comp;
-   comp = e_comp_get();
-#endif
-
    e_comp_ec_list_lock();
 
-   if (EINA_INLIST_GET(ec)->prev) //check current layer
+   x = _e_desk_area_layer_util_map_to_eda_layer(ec->layer);
+   pdal = pda->layers[x];
+   if (!pdal)
      {
-        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;
+        ERR("EDA: Couldn't get layer of ec(%p):%s / layer:%d", ec, e_client_icccm_title_get(ec), ec->layer);
+        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
-          }
+   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;
      }
 
    e_comp_ec_list_unlock();
@@ -950,46 +869,34 @@ _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, eda, ec_layer, ec_layer_cw, ec->layer_block, ec->layer_pending);
+                        ec, pda->desk_area, ec_layer, ec_layer_cw, ec->layer_block, ec->layer_pending);
                   ec_layer = ec_layer_cw;
                }
           }
      }
 
-   /* 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--;
+   if (ec_layer == E_LAYER_CLIENT_DESKTOP) return;
+   if (!e_util_client_layer_validate(ec_layer)) return;
 
    e_comp_ec_list_lock();
 
-   for (; x >= e_comp_canvas_layer_map(E_LAYER_CLIENT_DESKTOP); x--)
+   /* 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--)
      {
-#ifdef NEED_REFINE_EDA_LAYERS_LIST
-        if (!comp->layers[x].clients) continue;
-        EINA_INLIST_REVERSE_FOREACH(comp->layers[x].clients, ec2)
-          {
-             if (ec == ec2) continue;
-             if (!_desk_area_client_check_visible(ec2)) continue;
-             if (!e_desk_area_has_ec(eda, ec2)) continue;
+        pdal = pda->layers[x];
+        if (!pdal) continue;
 
-             client_data->result_ec = ec2;
+        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;
           }
-#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();
@@ -2087,6 +1994,7 @@ _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)
@@ -2140,7 +2048,11 @@ _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) return;
+   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;
+     }
 
    /* otherwise, client is on unexpected layer */
    ELOGF("LAYER", "layer dismatch ec->layer %d | evas obj layer %d ", ec, ec->layer, layer);
@@ -2205,97 +2117,42 @@ _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)
 {
-#ifdef NEED_REFINE_EDA_LAYERS_LIST
-   E_Comp *comp;
-   comp = e_comp_get();
-#endif
+   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));
 
    e_comp_ec_list_lock();
 
-#ifdef NEED_REFINE_EDA_LAYERS_LIST
-   if (above)
-     {
-        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)
-     {
-        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
-     {
-        if (prepend)
-          {
-             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 //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_View *above_view = e_view_client_view_get(e_client_view_get(above->ec));
+        e_view_place_above(view, above_view);
         _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_View *below_view = e_view_client_view_get(e_client_view_get(below->ec));
+        e_view_place_below(view, below_view);
         _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)
           {
-             eda->layers[cw->layer].clients = eina_inlist_prepend(eda->layers[cw->layer].clients, EINA_INLIST_GET(cw->ec));
+             // prepend means bottom
+             E_View *layer_obj = e_policy_desk_area_layer_obj_get(pdal);
+             e_view_place_above(view, layer_obj);
              _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
+        else
           {
-             eda->layers[cw->layer].clients = eina_inlist_append(eda->layers[cw->layer].clients, EINA_INLIST_GET(cw->ec));
+             E_View_Tree *view_tree = e_policy_desk_area_layer_view_tree_get(pdal);
+             e_view_reparent(view, view_tree);
              _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();
 }
@@ -2319,10 +2176,6 @@ _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;
@@ -2342,17 +2195,13 @@ _e_comp_object_layer_update(E_Desk_Area *eda, Evas_Object *obj,
         cw2 = evas_object_data_get(o, "comp_obj");
         while (!cw2)
           {
-             if (!e_util_strcmp(evas_object_name_get(o), "layer_obj")) break;
+             if (evas_object_data_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)
                {
-#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
+                  o = e_desk_area_layer_object_get(eda, E_LAYER_CLIENT_ALERT);
                }
              if (!o)
                {
@@ -2365,7 +2214,6 @@ _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)
@@ -2382,6 +2230,8 @@ _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);
 }
@@ -2394,10 +2244,6 @@ _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))
@@ -2437,8 +2283,7 @@ _e_comp_intercept_stack_helper(E_Desk_Area *eda, E_Comp_Object *cw, Evas_Object
    while (!cw2)
      {
         /* check for non-client layer object */
-        if (!e_util_strcmp(evas_object_name_get(o), "layer_obj"))
-          break;
+        if (evas_object_data_get(o, "layer_obj")) break;
         /* find an existing client to use for layering
          * by walking up the object stack
          *
@@ -2453,11 +2298,7 @@ _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
               */
-#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
+             o = e_desk_area_layer_object_get(eda, E_LAYER_CLIENT_CURSOR);
           }
         if (!o)
           /* top client layer window hasn't been stacked yet. this probably shouldn't happen?
@@ -2478,7 +2319,6 @@ _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
@@ -2488,6 +2328,8 @@ _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);
 
@@ -2512,11 +2354,7 @@ _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 ;
-#ifdef NEED_REFINE_EDA_LAYERS_LIST
-                  stack = comp->layers[below_layer].obj;
-#else
-                  stack = eda->layers[below_layer].obj;
-#endif
+                  stack = e_desk_area_layer_object_get(eda, _e_desk_area_layer_util_map_to_eda_layer(below_layer));
                }
           }
         else
@@ -2531,11 +2369,7 @@ _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
-#ifdef NEED_REFINE_EDA_LAYERS_LIST
-               stack = comp->layers[cw2->layer].obj;
-#else
-               stack = eda->layers[cw2->layer].obj;
-#endif
+               stack = e_desk_area_layer_object_get(eda, _e_desk_area_layer_util_map_to_e_layer(cw2->layer));
           }
      }
 
@@ -2543,13 +2377,8 @@ _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);
-#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
+   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)))
        {
           CRI("STACKING ERROR!!! ec:%p (cw->layer:%d, ec->layer:%d)", cw->ec, cw->layer, cw->ec->layer);
        }
@@ -2584,10 +2413,25 @@ _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 (!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
 
    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!
@@ -2607,12 +2451,8 @@ _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, *op;
+   Evas_Object *obj, *o;
    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;
@@ -2632,20 +2472,24 @@ _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 (!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
+
    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 */
-#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;
+#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));
         op = o, o = evas_object_below_get(o))
-#endif
      {
         if (evas_object_smart_smart_get(o))
           {
@@ -2655,7 +2499,8 @@ _desk_area_cb_comp_object_raise(struct wl_listener *listener, void *data)
              if (ec && (!ec->override)) break;
           }
      }
-   e_comp_object_stack_below(obj, op);
+#endif
+   e_comp_object_raise(obj);
    e_client_focus_defer_set(cw->ec);
 
    if (!cw->visible) return;
@@ -2676,10 +2521,6 @@ _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;
@@ -2690,8 +2531,11 @@ _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
@@ -2731,27 +2575,32 @@ _desk_area_cb_comp_object_set_layer(struct wl_listener *listener, void *data)
                     evas_object_stack_below(obj, ec2->frame);
                }
              else
-#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
+               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)));
           }
         return;
      }
 
 layer_set:
-   if (cw->layer == l) return;
+   if (cw->layer == l)
+   {
+      ELOGF("COMP_OBJECT", "RETURNED, cw->layer:%d, l:%d", ec, 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;
@@ -2777,21 +2626,14 @@ layer_set:
 
    e_config->transient.raise = oldraise;
 
-   _e_comp_object_layers_remove(eda, cw);
+   e_comp_object_layer_set(obj, layer);
    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);
-   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
+   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)))
      {
         /* 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);
@@ -3065,9 +2907,7 @@ _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)
-     _e_comp_object_layers_remove(eda, cw);
-   else
+   if (!cw)
      ELOGF("EDA", "No Comp Object. Fix Me~!!", ec);
 #endif // CLIENT_DEL_STACK_ISSUE
 
@@ -3186,9 +3026,7 @@ _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)
-     _e_comp_object_layers_remove(eda, cw);
-   else
+   if (!cw)
      ELOGF("EDA", "No Comp Object. Fix Me~!!", ec);
 }
 #endif //CLIENT_DEL_STACK_ISSUE
@@ -3233,27 +3071,14 @@ _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_CLIENT_DESKTOP);
-        eda_layer <= _e_desk_area_layer_util_map_to_eda_layer(E_LAYER_CLIENT_CURSOR);
+   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);
         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 ea0099bae3d3c6c8b5b3f66db5cb74f82a4eef35..61ab5a592470e2acded534bfc3954638f295dfa2 100644 (file)
@@ -6,6 +6,7 @@
 #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
@@ -28,9 +29,16 @@ _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)
 {
-   if (!child->eo)
-     return;
-   // doing something
+   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);
 }
 
 static void
@@ -88,6 +96,7 @@ 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);
 
@@ -116,9 +125,14 @@ 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);
 
-    // TODO: set layer
-    //evas_object_layer_set(pdal->layer_bottom->eo, layer);
-    evas_object_name_set(pdal->layer_bottom->eo, "layer_obj");
+    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);
+
    return pdal;
 
 err:
index 46b5a6588ffed1e6825402db0c6b1f4741763541..67adaeb64dafe0fd46f0d0b75ddd949011c35ec3 100644 (file)
@@ -31,8 +31,6 @@ 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;