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)))
      {

-- 


Reply via email to