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;
}
}
}
+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();
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();
{
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;
}
{
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();
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();
{
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();
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;
}
}
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();
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();
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();
{
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();
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();
}
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)
/* 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);
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();
}
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;
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)
{
}
}
- _e_comp_object_layers_remove(eda, cw);
if (cw2)
{
if (cw2->layer > cw->layer)
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);
}
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))
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
*
/* 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?
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
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);
/* 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
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));
}
}
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);
}
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!
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;
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))
{
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;
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;
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
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;
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);
#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
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
{
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");
}
}