discomfitor pushed a commit to branch master. http://git.enlightenment.org/core/enlightenment.git/commit/?id=f26f6cf3dd36fab54789cebd5f02180b86286e27
commit f26f6cf3dd36fab54789cebd5f02180b86286e27 Author: Mike Blumenkrantz <zm...@osg.samsung.com> Date: Fri Mar 11 18:17:06 2016 -0500 be less pedantic during efx move/resize operations about object geometry assume that an object is where it's supposed to be in order to avoid failing to correctly animate objects which modify set geometries, such as e clients --- src/bin/efx/e_efx_private.h | 1 + src/bin/efx/efx_move.c | 28 ++++++++++++++++------------ src/bin/efx/efx_resize.c | 17 +++++++++++++++-- 3 files changed, 32 insertions(+), 14 deletions(-) diff --git a/src/bin/efx/e_efx_private.h b/src/bin/efx/e_efx_private.h index 95e9422..0462493 100644 --- a/src/bin/efx/e_efx_private.h +++ b/src/bin/efx/e_efx_private.h @@ -71,6 +71,7 @@ struct E_EFX E_Efx_Map_Data map_data; Eina_List *followers; Eina_List *queue; + int x, y, w, h; }; void _e_efx_zoom_calc(void *, void *, Evas_Object *obj, Evas_Map *map); diff --git a/src/bin/efx/efx_move.c b/src/bin/efx/efx_move.c index d837149..c73011a 100644 --- a/src/bin/efx/efx_move.c +++ b/src/bin/efx/efx_move.c @@ -23,13 +23,11 @@ _obj_del(E_Efx_Move_Data *emd, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED } static void -_move(Evas_Object *obj, int x, int y) +_move(E_EFX *e, int x, int y) { - Evas_Coord ox, oy; - - evas_object_geometry_get(obj, &ox, &oy, NULL, NULL); - evas_object_move(obj, ox + x, oy + y); - //DBG("%p to (%d,%d)", obj, ox + x, oy + y); + e->x += x, e->y += y; + evas_object_move(e->obj, e->x + x, e->y + y); + //DBG("%p to (%d,%d)", e->obj, e->x + x, e->y + y); } static Eina_Bool @@ -44,7 +42,11 @@ _move_circle_cb(E_Efx_Move_Data *emd, double pos) pct = ecore_animator_pos_map(pos, emd->speed, 0, 0); degrees = pct * emd->degrees; - evas_object_geometry_get(emd->e->obj, &ox, &oy, &w, &h); + ox = emd->e->x, oy = emd->e->y; + if (emd->e->resize_data) + w = emd->e->w, h = emd->e->h; + else + evas_object_geometry_get(emd->e->obj, NULL, NULL, &w, &h); r = (degrees * M_PI) / 180.0; rad = sqrt((emd->current.x + w/2.0 - emd->e->map_data.move_center->x) * (emd->current.x + w/2.0 - emd->e->map_data.move_center->x) + (emd->current.y + h/2.0 - emd->e->map_data.move_center->y) * (emd->current.y + h/2.0 - emd->e->map_data.move_center->y)); @@ -55,11 +57,12 @@ _move_circle_cb(E_Efx_Move_Data *emd, double pos) xx = lround(x); yy = lround(y); //DBG("move: %g || %g,%g", degrees, x, y); + emd->e->x = xx, emd->e->y = yy; evas_object_move(emd->e->obj, xx, yy); e_efx_maps_apply(emd->e, emd->e->obj, NULL, E_EFX_MAPS_APPLY_ALL); EINA_LIST_FOREACH(emd->e->followers, l, e) { - _move(e->obj, xx - ox, yy - oy); + _move(e, xx - ox, yy - oy); e_efx_maps_apply(e, e->obj, NULL, E_EFX_MAPS_APPLY_ALL); } @@ -81,11 +84,11 @@ _move_cb(E_Efx_Move_Data *emd, double pos) x = lround(pct * (double)emd->change.x) - emd->current.x; y = lround(pct * (double)emd->change.y) - emd->current.y; _e_efx_resize_adjust(emd->e, &x, &y); - _move(emd->e->obj, x, y); + _move(emd->e, x, y); e_efx_maps_apply(emd->e, emd->e->obj, NULL, E_EFX_MAPS_APPLY_ALL); EINA_LIST_FOREACH(emd->e->followers, l, e) { - _move(e->obj, x, y); + _move(e, x, y); e_efx_maps_apply(e, e->obj, NULL, E_EFX_MAPS_APPLY_ALL); } @@ -157,6 +160,7 @@ e_efx_move(Evas_Object *obj, E_Efx_Effect_Speed speed, const Evas_Point *end_poi emd = e->move_data; emd->e = e; emd->speed = speed; + e->x = x, e->y = y; emd->change.x = end_point->x - x; emd->change.y = end_point->y - y; emd->current.x = emd->current.y = 0; @@ -202,8 +206,8 @@ e_efx_move_circle(Evas_Object *obj, E_Efx_Effect_Speed speed, const Evas_Point * emd = e->move_data; emd->e = e; emd->speed = speed; - emd->start.x = emd->current.x = x; - emd->start.y = emd->current.y = y; + e->x = emd->start.x = emd->current.x = x; + e->y = emd->start.y = emd->current.y = y; emd->degrees = degrees; emd->cb = cb; emd->data = (void*)data; diff --git a/src/bin/efx/efx_resize.c b/src/bin/efx/efx_resize.c index 054ba0b..af9983a 100644 --- a/src/bin/efx/efx_resize.c +++ b/src/bin/efx/efx_resize.c @@ -44,7 +44,10 @@ _resize_anchor(E_Efx_Resize_Data *erd) _e_efx_resize_adjust(erd->e, &x, &y); if ((!x) && (!y)) return; - evas_object_geometry_get(erd->e->obj, &cx, &cy, NULL, NULL); + if (erd->e->move_data) + cx = erd->e->x, cy = erd->e->y; + else + evas_object_geometry_get(erd->e->obj, &cx, &cy, NULL, NULL); x += cx, y += cy; evas_object_move(erd->e->obj, x, y); } @@ -61,11 +64,14 @@ _resize_cb(E_Efx_Resize_Data *erd, double pos) factor = ecore_animator_pos_map(pos, erd->speed, 0, 0); w = lround(factor * (erd->w - erd->start_w)) + erd->start_w; h = lround(factor * (erd->h - erd->start_h)) + erd->start_h; + //DBG("%p to (%dx%d)", erd->e->obj, w, h); + erd->e->w = w, erd->e->h = h; evas_object_resize(erd->e->obj, w, h); _resize_anchor(erd); return EINA_TRUE; } /* lround will usually be off by 1 at the end, so we manually set this here */ + erd->e->w = erd->w, erd->e->h = erd->h; evas_object_resize(erd->e->obj, erd->w, erd->h); _resize_anchor(erd); @@ -85,6 +91,7 @@ _resize_stop(Evas_Object *obj, Eina_Bool reset) erd = e->resize_data; if (reset) { + erd->e->w = erd->start_w, erd->e->h = erd->start_h; evas_object_resize(obj, erd->start_w, erd->start_h); evas_object_event_callback_del_full(obj, EVAS_CALLBACK_FREE, (Evas_Object_Event_Cb)_obj_del, erd); if (erd->moving) @@ -118,7 +125,9 @@ _e_efx_resize_adjust(E_EFX *e, int *ax, int *ay) int x, y, w, h; if (!erd) return; - evas_object_geometry_get(e->obj, &x, &y, &w, &h); + if (e->move_data) + x = e->x, y = e->y; + w = e->w, h = e->h; switch (erd->anchor_type) { case TOP_RIGHT: @@ -165,6 +174,10 @@ e_efx_resize(Evas_Object *obj, E_Efx_Effect_Speed speed, const Evas_Point *posit erd->cb = cb; erd->data = (void*)data; evas_object_geometry_get(obj, &x, &y, &erd->start_w, &erd->start_h); + e->w = erd->start_w; + e->h = erd->start_h; + if (e->move_data) + x = e->x, y = e->y; INF("resize: %p || %dx%d => %dx%d %s over %gs", obj, erd->start_w, erd->start_h, w, h, e_efx_speed_str[speed], total_time); if (position && ((position->x != x) || (position->y != y))) { --