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;
}
}
}
-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();
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();
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)
{
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();
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();
{
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();
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;
- 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();
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();
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();
{
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();
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();
}
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)
- {
- 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);
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();
}
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 (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)
{
}
}
+ _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 (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
*
/* 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?
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 ;
- 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
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
}
}
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);
}
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!
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;
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))
{
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;
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
- 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;
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);
#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
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
{
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");
}
}