raster pushed a commit to branch master. http://git.enlightenment.org/core/enlightenment.git/commit/?id=3f2ea651123c16693240999657e337122a4f7c73
commit 3f2ea651123c16693240999657e337122a4f7c73 Author: Carsten Haitzler (Rasterman) <ras...@rasterman.com> Date: Wed Jan 18 18:48:37 2017 +0900 e window stakcs - fix bugs with stacks by doing stack stuff in idle eval this moves ensuring windows are centered on their parent even when moved etc. for stack (and move the whole stack not just the specific window) in the idle enterer int he pahse before all the client evals take place. much cleaner! --- src/bin/e_client.c | 146 ++++++++++++++++++----------------------------------- 1 file changed, 49 insertions(+), 97 deletions(-) diff --git a/src/bin/e_client.c b/src/bin/e_client.c index 0ebd9b1..bc4e254 100644 --- a/src/bin/e_client.c +++ b/src/bin/e_client.c @@ -1582,28 +1582,7 @@ _e_client_cb_evas_move(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UN evas_object_geometry_get(ec->frame, &x, &y, NULL, NULL); if (ec->stack.prev || ec->stack.next) { - if (ec->stack.ignore == 0) - { - Eina_List *l, *list = e_client_stack_list_prepare(ec); - E_Client *child; - Evas_Coord bx, by, bw, bh, cw, ch, dx, dy; - - child = e_client_stack_bottom_get(ec); - dx = x - ec->pre_cb.x; - dy = y - ec->pre_cb.y; - if (child != ec) - evas_object_move(child->frame, child->x + dx, child->y + dy); - evas_object_geometry_get(child->frame, &bx, &by, &bw, &bh); - EINA_LIST_FOREACH(list->next, l, child) - { - if (child == ec) continue; - evas_object_geometry_get(child->frame, NULL, NULL, &cw, &ch); - evas_object_move(child->frame, - bx + ((bw - cw) / 2), - by + ((bh - ch) / 2)); - } - e_client_stack_list_finish(list); - } + // do nothing - handled by idle enterer eval } else { @@ -1642,81 +1621,7 @@ _e_client_cb_evas_resize(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_ evas_object_geometry_get(ec->frame, &x, &y, &w, &h); if (ec->stack.prev || ec->stack.next) { - if (ec->stack.ignore == 0) - { - Eina_List *l, *list = e_client_stack_list_prepare(ec); - E_Client *child; - Evas_Coord bx, by, bw, bh, cw, ch; - - if (e_client_util_resizing_get(ec)) - { - if (ec->dialog) - { - child = list->data; - evas_object_geometry_get(child->frame, &bx, &by, &bw, &bh); - EINA_LIST_FOREACH(list, l, child) - { - if (child == ec) continue; - if (!ec->dialog) - { - evas_object_resize(child->frame, bw, bh); - cw = bw; - ch = bh; - } - else - evas_object_geometry_get(child->frame, NULL, NULL, &cw, &ch); - evas_object_move(child->frame, - bx + ((bw - cw) / 2), - by + ((bh - ch) / 2)); - } - } - else - { - child = e_client_stack_bottom_get(ec); - evas_object_move(child->frame, x, y); - evas_object_resize(child->frame, w, h); - EINA_LIST_FOREACH(list->next, l, child) - { - if (child == ec) continue; - if (!ec->dialog) - { - evas_object_move(child->frame, x, y); - evas_object_resize(child->frame, w, h); - cw = w; - ch = h; - } - else - evas_object_geometry_get(child->frame, NULL, NULL, &cw, &ch); - evas_object_move(child->frame, - x + ((w - cw) / 2), - y + ((h - ch) / 2)); - } - } - } - else - { - if (ec == e_client_stack_bottom_get(ec)) - { - EINA_LIST_FOREACH(list->next, l, child) - { - if (child == ec) continue; - if (!ec->dialog) - { - evas_object_move(child->frame, x, y); - evas_object_resize(child->frame, w, h); - cw = w; - ch = h; - } - else - evas_object_geometry_get(child->frame, NULL, NULL, &cw, &ch); - evas_object_move(child->frame, - x + ((w - cw) / 2), - y + ((h - ch) / 2)); - } - } - } - e_client_stack_list_finish(list); - } + // do nothing - handled by idle enterer eval } else { @@ -2542,6 +2447,53 @@ e_client_idler_before(void) if (e_config->screen_limits != E_CLIENT_OFFSCREEN_LIMIT_ALLOW_FULL) _e_client_move_lost_window_to_center(ec); } + // handle window stack + if (!ec->stack.prev && ec->stack.next) + { + if (ec->stack.ignore == 0) + { + Eina_List *ll, *list = e_client_stack_list_prepare(ec); + E_Client *child, *bottom, *moving = NULL, *rel; + int x, y; + + bottom = rel = e_client_stack_bottom_get(ec); + EINA_LIST_FOREACH(list, ll, child) + { + if (child->moving) + { + moving = child; + break; + } + } + if (moving) + { + Evas_Coord ox, oy; + + evas_object_geometry_get(ec->frame, &ox, &oy, NULL, NULL); + rel = moving; + } + EINA_LIST_FOREACH(list, ll, child) + { + if (moving) + { + if (child == moving) continue; + } + else if (child == bottom) continue; + x = rel->x + ((rel->w - child->w) / 2); + y = rel->y + ((rel->h - child->h) / 2); + if ((x != child->x) || (y != child->y)) + { + child->x = x; + child->y = y; + child->pre_cb.x = x; + child->pre_cb.y = y; + child->changes.pos = 1; + child->changed = 1; + } + } + e_client_stack_list_finish(list); + } + } } if (_e_client_layout_cb) --