forked from enlightenment/enlightenment
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:
parent
88518d8103
commit
f26f6cf3dd
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)))
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue