e17: disable input events of windows while deskflip animation is going

- set focus at the end of deskflip animation
- delay show after first move to not draw at final position first
- move window further out to decrease the chance of having comp 
  get border_hide event before final position..   


SVN revision: 58092
This commit is contained in:
Hannes Janetzek 2011-03-25 23:14:52 +00:00
parent a39d970c77
commit 8957ea6191
2 changed files with 56 additions and 17 deletions

View File

@ -576,6 +576,11 @@ _e_desk_show_begin(E_Desk *desk, int mode, int dx, int dy)
E_Border *bd; E_Border *bd;
double t; double t;
if (dx < 0) dx = -1;
if (dx > 0) dx = 1;
if (dy < 0) dy = -1;
if (dy > 0) dy = 1;
t = ecore_loop_time_get(); t = ecore_loop_time_get();
bl = e_container_border_list_first(desk->zone->container); bl = e_container_border_list_first(desk->zone->container);
while ((bd = e_container_border_list_next(bl))) while ((bd = e_container_border_list_next(bl)))
@ -595,8 +600,8 @@ _e_desk_show_begin(E_Desk *desk, int mode, int dx, int dy)
bd->fx.start.t = t; bd->fx.start.t = t;
if (mode == 1) if (mode == 1)
{ {
bd->fx.start.x = bd->zone->w * dx; bd->fx.start.x = bd->zone->w * (dx * 1.5);
bd->fx.start.y = bd->zone->h * dy; bd->fx.start.y = bd->zone->h * (dy * 1.5);
} }
else if (mode == 2) else if (mode == 2)
{ {
@ -633,13 +638,14 @@ _e_desk_show_begin(E_Desk *desk, int mode, int dx, int dy)
else else
bd->fx.start.y += bd->zone->container->h - (bd->zone->y + bd->zone->h); bd->fx.start.y += bd->zone->container->h - (bd->zone->y + bd->zone->h);
e_border_fx_offset(bd, bd->fx.start.x, bd->fx.start.y); e_border_fx_offset(bd, bd->fx.start.x, bd->fx.start.y);
e_border_show(bd); e_border_comp_hidden_set(bd, EINA_TRUE);
} }
} }
} }
e_container_border_list_free(bl); e_container_border_list_free(bl);
if (desk->animator) ecore_animator_del(desk->animator); if (desk->animator) ecore_animator_del(desk->animator);
desk->animator = ecore_animator_add(_e_desk_show_animator, desk); desk->animator = ecore_animator_add(_e_desk_show_animator, desk);
desk->animating = EINA_TRUE;
} }
static void static void
@ -657,9 +663,19 @@ _e_desk_show_end(E_Desk *desk)
if (bd->moving) if (bd->moving)
e_border_fx_offset(bd, 0, 0); e_border_fx_offset(bd, 0, 0);
else if ((bd->desk == desk) && (!bd->sticky)) else if ((bd->desk == desk) && (!bd->sticky))
e_border_fx_offset(bd, 0, 0); {
e_border_fx_offset(bd, 0, 0);
e_border_comp_hidden_set(bd, EINA_FALSE);
if (!bd->visible)
e_border_show(bd);
}
} }
} }
if (e_config->focus_last_focused_per_desktop)
e_desk_last_focused_focus(desk);
e_container_border_list_free(bl); e_container_border_list_free(bl);
ecore_x_window_shadow_tree_flush(); ecore_x_window_shadow_tree_flush();
ev = E_NEW(E_Event_Desk_After_Show, 1); ev = E_NEW(E_Event_Desk_After_Show, 1);
@ -678,6 +694,14 @@ _e_desk_show_animator(void *data)
double t, dt, spd; double t, dt, spd;
desk = data; desk = data;
if (!desk->animating)
{
_e_desk_show_end(desk);
desk->animator = NULL;
return ECORE_CALLBACK_CANCEL;
}
t = ecore_loop_time_get(); t = ecore_loop_time_get();
dt = -1.0; dt = -1.0;
spd = e_config->desk_flip_animate_time; spd = e_config->desk_flip_animate_time;
@ -691,11 +715,14 @@ _e_desk_show_animator(void *data)
} }
else if ((bd->desk == desk) && (!bd->sticky)) else if ((bd->desk == desk) && (!bd->sticky))
{ {
if (!bd->visible)
e_border_show(bd);
dt = (t - bd->fx.start.t) / spd; dt = (t - bd->fx.start.t) / spd;
if (dt > 1.0) dt = 1.0; if (dt > 1.0) dt = 1.0;
dt = 1.0 - dt; dt = 1.0 - dt;
dt *= dt; /* decelerate - could be a better hack */ dt *= dt; /* decelerate - could be a better hack */
e_border_fx_offset(bd, e_border_fx_offset(bd,
((double)bd->fx.start.x * dt), ((double)bd->fx.start.x * dt),
((double)bd->fx.start.y * dt)); ((double)bd->fx.start.y * dt));
} }
@ -703,11 +730,8 @@ _e_desk_show_animator(void *data)
} }
e_container_border_list_free(bl); e_container_border_list_free(bl);
if (dt <= 0.0) if (dt <= 0.0)
{ desk->animating = EINA_FALSE;
_e_desk_show_end(desk);
desk->animator = NULL;
return ECORE_CALLBACK_CANCEL;
}
return ECORE_CALLBACK_RENEW; return ECORE_CALLBACK_RENEW;
} }
@ -718,6 +742,11 @@ _e_desk_hide_begin(E_Desk *desk, int mode, int dx, int dy)
E_Border *bd; E_Border *bd;
double t; double t;
if (dx < 0) dx = -1;
if (dx > 0) dx = 1;
if (dy < 0) dy = -1;
if (dy > 0) dy = 1;
t = ecore_loop_time_get(); t = ecore_loop_time_get();
bl = e_container_border_list_first(desk->zone->container); bl = e_container_border_list_first(desk->zone->container);
while ((bd = e_container_border_list_next(bl))) while ((bd = e_container_border_list_next(bl)))
@ -735,8 +764,8 @@ _e_desk_hide_begin(E_Desk *desk, int mode, int dx, int dy)
bd->fx.start.t = t; bd->fx.start.t = t;
if (mode == 1) if (mode == 1)
{ {
bd->fx.start.x = bd->zone->w * -dx; bd->fx.start.x = bd->zone->w * (-dx * 1.5);
bd->fx.start.y = bd->zone->h * -dy; bd->fx.start.y = bd->zone->h * (-dy * 1.5);
} }
else if (mode == 2) else if (mode == 2)
{ {
@ -773,12 +802,14 @@ _e_desk_hide_begin(E_Desk *desk, int mode, int dx, int dy)
else else
bd->fx.start.y += bd->zone->container->h - (bd->zone->y + bd->zone->h); bd->fx.start.y += bd->zone->container->h - (bd->zone->y + bd->zone->h);
e_border_fx_offset(bd, 0, 0); e_border_fx_offset(bd, 0, 0);
e_border_comp_hidden_set(bd, EINA_TRUE);
} }
} }
} }
e_container_border_list_free(bl); e_container_border_list_free(bl);
if (desk->animator) ecore_animator_del(desk->animator); if (desk->animator) ecore_animator_del(desk->animator);
desk->animator = ecore_animator_add(_e_desk_hide_animator, desk); desk->animator = ecore_animator_add(_e_desk_hide_animator, desk);
desk->animating = EINA_TRUE;
} }
static void static void
@ -797,6 +828,7 @@ _e_desk_hide_end(E_Desk *desk)
else if ((bd->desk == desk) && (!bd->sticky)) else if ((bd->desk == desk) && (!bd->sticky))
{ {
e_border_fx_offset(bd, 0, 0); e_border_fx_offset(bd, 0, 0);
e_border_comp_hidden_set(bd, EINA_FALSE);
e_border_hide(bd, 2); e_border_hide(bd, 2);
} }
} }
@ -814,6 +846,14 @@ _e_desk_hide_animator(void *data)
double t, dt, spd; double t, dt, spd;
desk = data; desk = data;
if (!desk->animating)
{
_e_desk_hide_end(desk);
desk->animator = NULL;
return ECORE_CALLBACK_CANCEL;
}
t = ecore_loop_time_get(); t = ecore_loop_time_get();
dt = -1.0; dt = -1.0;
spd = e_config->desk_flip_animate_time; spd = e_config->desk_flip_animate_time;
@ -837,11 +877,9 @@ _e_desk_hide_animator(void *data)
} }
} }
e_container_border_list_free(bl); e_container_border_list_free(bl);
if ((dt < 0.0) || (dt >= 1.0)) if ((dt < 0.0) || (dt >= 1.0))
{ desk->animating = EINA_FALSE;
_e_desk_hide_end(desk);
desk->animator = NULL;
return ECORE_CALLBACK_CANCEL;
}
return ECORE_CALLBACK_RENEW; return ECORE_CALLBACK_RENEW;
} }

View File

@ -27,6 +27,7 @@ struct _E_Desk
Evas_Object *bg_object; Evas_Object *bg_object;
Ecore_Animator *animator; Ecore_Animator *animator;
Eina_Bool animating;
}; };
struct _E_Event_Desk_Show struct _E_Event_Desk_Show