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
This commit is contained in:
Mike Blumenkrantz 2016-03-11 18:17:06 -05:00
parent 88518d8103
commit f26f6cf3dd
3 changed files with 32 additions and 14 deletions

View File

@ -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);

View File

@ -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;

View File

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