From: Junseok Kim Date: Fri, 11 Apr 2025 06:10:50 +0000 (+0900) Subject: e_policy_desk_area: refine layer list to use e_view_tree X-Git-Tag: accepted/tizen/unified/20250612.024607~33 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1ef5ec43b80778dec018b3b84d446b48bfe359ba;p=platform%2Fupstream%2Fenlightenment.git e_policy_desk_area: refine layer list to use e_view_tree Change-Id: I584bac1f5025b93d0adbb964c156c741fc5ee5a4 --- diff --git a/src/bin/core/e_desk_area.c b/src/bin/core/e_desk_area.c index 9964faaed9..0ed44a7788 100644 --- a/src/bin/core/e_desk_area.c +++ b/src/bin/core/e_desk_area.c @@ -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 typedef struct _E_Desk_Area_Private E_Desk_Area_Private; diff --git a/src/bin/core/e_desk_area_intern.h b/src/bin/core/e_desk_area_intern.h index 03f38008fa..44c8b2cf3a 100644 --- a/src/bin/core/e_desk_area_intern.h +++ b/src/bin/core/e_desk_area_intern.h @@ -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; diff --git a/src/bin/debug/e_test_helper.c b/src/bin/debug/e_test_helper.c index 5e634fc1c8..d6146639b3 100644 --- a/src/bin/debug/e_test_helper.c +++ b/src/bin/debug/e_test_helper.c @@ -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"), diff --git a/src/bin/windowmgr/e_policy_desk_area.c b/src/bin/windowmgr/e_policy_desk_area.c index 35c563598c..3ff7b2bcb3 100644 --- a/src/bin/windowmgr/e_policy_desk_area.c +++ b/src/bin/windowmgr/e_policy_desk_area.c @@ -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"); } } diff --git a/src/bin/windowmgr/e_policy_desk_area_layer.c b/src/bin/windowmgr/e_policy_desk_area_layer.c index ea0099bae3..61ab5a5924 100644 --- a/src/bin/windowmgr/e_policy_desk_area_layer.c +++ b/src/bin/windowmgr/e_policy_desk_area_layer.c @@ -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: diff --git a/src/include/e_comp.h b/src/include/e_comp.h index 46b5a6588f..67adaeb64d 100644 --- a/src/include/e_comp.h +++ b/src/include/e_comp.h @@ -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;