From 16e5cd42f8b5bc2eed632702da7579011b6364b2 Mon Sep 17 00:00:00 2001 From: Doyoun Kang Date: Wed, 3 Jun 2020 19:11:01 +0900 Subject: [PATCH] e_desk_group: fix bug for _e_desk_group_ec_restack Change-Id: I17ceea00f73a099875593f3ab683305099db8fba --- src/bin/e_desk_group.c | 195 +++++++---------------------------------- 1 file changed, 31 insertions(+), 164 deletions(-) diff --git a/src/bin/e_desk_group.c b/src/bin/e_desk_group.c index 8179fce77e..1c2375655b 100644 --- a/src/bin/e_desk_group.c +++ b/src/bin/e_desk_group.c @@ -381,57 +381,6 @@ e_desk_group_ec_remove(E_Desk_Group *edg, E_Client *ec) edg->ec_lists[edgc_layer] = eina_list_remove(edg->ec_lists[edgc_layer], ec); } -static E_Client * -_get_bottom_ec_of_above_edg(E_Desk_Group *edg) -{ - E_Desk_Group *prev_edg = NULL; - E_Client *bottom = NULL; - - prev_edg = e_desk_desk_group_above_get(edg->desk, edg); - if (prev_edg) - { - Eina_List *l; - int i; - - for (i=0; iec_lists[i], l, bottom) - { - if (bottom) - goto find_bottom; - } - } - } - -find_bottom: - return bottom; -} - -static E_Client * -_get_top_ec_of_below_edg(E_Desk_Group *edg) -{ - E_Desk_Group *next_edg = NULL; - E_Client *top = NULL; - Eina_List *l; - int i; - - next_edg = e_desk_desk_group_below_get(edg->desk, edg); - if (next_edg) - { - for (i=E_DESK_GROUP_CLIENT_LAYER_MAX-1; i>=0; i--) - { - EINA_LIST_FOREACH(next_edg->ec_lists[i], l, top) - { - if (top) - goto find_top; - } - } - } - -find_top: - return top; -} - static E_Client * _find_above_ec_in_same_edgc_layer(E_Desk_Group *edg, E_Client *ec) { @@ -750,136 +699,54 @@ e_desk_group_ec_layer_set(E_Desk_Group *edg, E_Client *ec, E_Layer layer) evas_object_layer_set(ec->frame, edg_layer); } -static E_Client * -_find_above_ec(E_Desk_Group *edg, E_Client *ec) +static void +_e_desk_group_ec_restack(E_Desk_Group *edg, E_Client *ec) { - E_Client *above = NULL; - E_Desk_Group_Client_Layer edgc_layer; - Eina_List *l; - int index; - int i; - - edgc_layer = e_client_desk_group_client_layer_get(ec); - - index = eina_list_data_idx(edg->ec_lists[edgc_layer], ec); - if (index < 0) - { - // error... - return NULL; - } - else if (index > 0) - { - above = eina_list_nth(edg->ec_lists[edgc_layer], index-1); - if (above && above->frame) - { - // find above ec in same layer - return above; - } - } + E_Client *above = NULL, *below = NULL; - // search for above layer - for (i=edgc_layer+1; iec_lists[i], l, above) - { - if (above && above->frame) - { - // find above ec - return above; - } - } - } + // 1. find below ec in same edgc layer in same edg + below = _find_below_ec_in_same_edgc_layer(edg, ec); + if (below) goto find_below; - return NULL; -} + // 2. find above ec in same edgc layer in same edg + above = _find_above_ec_in_same_edgc_layer(edg, ec); + if (above) goto find_above; -static E_Client * -_find_below_ec(E_Desk_Group *edg, E_Client *ec) -{ - E_Client *below = NULL; - E_Desk_Group_Client_Layer edgc_layer; - Eina_List *l; - int index; - int i; + // 3. find bottom ec in above edgc layer in same edg + above = _find_bottom_ec_in_above_edgc_layer(edg, ec); + if (above) goto find_above; - edgc_layer = e_client_desk_group_client_layer_get(ec); + // 4. find bottom ec in above edg + above = _find_bottom_ec_in_above_edg(edg); + if (above) goto find_above; - index = eina_list_data_idx(edg->ec_lists[edgc_layer], ec); - if (index < 0) - { - // error... - return NULL; - } - else - { - below = eina_list_nth(edg->ec_lists[edgc_layer], index+1); - if (below && below->frame) - { - // find below ec in same layer - return below; - } - } + // 5. if not found, just evas_object_raise + ELOGF("EDG", "RESTACK raise... call evas_object_raise", ec); + evas_object_raise(ec->frame); + return; - // search for below layer - for (i=edgc_layer-1; i>=E_DESK_GROUP_CLIENT_LAYER_DESKTOP; i--) +find_below: + if (below) { - EINA_LIST_FOREACH(edg->ec_lists[i], l, below) + ELOGF("EDG", "STACK_ABOVE... below(win:0x%08zx, ec:%p)", ec, e_client_util_win_get(below), below); + if (below->frame) { - if (below && below->frame) - { - // find below ec - return below; - } + ELOGF("EDG", "STACK_ABOVE... call evas_object_stack_above", ec); + evas_object_stack_above(ec->frame, below->frame); } } + return; - return NULL; -} - -static void -_e_desk_group_ec_restack(E_Desk_Group *edg, E_Client *ec) -{ - E_Client *above = NULL, *below = NULL; - - above = _find_above_ec(edg, ec); +find_above: if (above) { - evas_object_stack_below(ec->frame, above->frame); - goto end; - } - - below = _find_below_ec(edg, ec); - if (below) - { - evas_object_stack_above(ec->frame, below->frame); - goto end; - } - - if (!above && !below) - { - // check another edg... - above = _get_bottom_ec_of_above_edg(edg); - if (above) - { - if (above->frame) - { - evas_object_stack_below(ec->frame, above->frame); - goto end; - } - } - - below = _get_top_ec_of_below_edg(edg); - if (below) + ELOGF("EDG", "STACK_BELOW... above(win:0x%08zx, ec:%p)", ec, e_client_util_win_get(above), above); + if (above->frame) { - if (below->frame) - { - evas_object_stack_above(ec->frame, below->frame); - goto end; - } + ELOGF("EDG", "STACK_BELOW... call evas_object_stack_below", ec); + evas_object_stack_below(ec->frame, above->frame); } } - -end: return; } -- 2.34.1