e-modules/comp-scale: use ecore_loop_time, fix scale out mouse warp, refactor draw function

SVN revision: 58171
This commit is contained in:
Hannes Janetzek 2011-03-29 08:39:36 +00:00
parent 1a7f3b42fe
commit 466443f71b
2 changed files with 103 additions and 85 deletions

View File

@ -130,41 +130,49 @@ _pager_place_windows(double scale)
static Eina_Bool
_pager_redraw(void *data)
{
Eina_List *l;
Item *it;
double scale, a, in, duration;
double in;
duration = scale_conf->pager_duration;
scale = (ecore_time_get() - start_time) / duration;
if (!scale_state)
scale = 1.0 - scale;
if (scale > 1.0) scale = 1.0;
if (scale < 0.0) scale = 0.0;
in = (ecore_loop_time_get() - start_time) / scale_conf->pager_duration;
if (scale_state)
{
in = log(14) * scale;
if (in >= 1.0)
{
_pager_place_windows(0.0);
_pager_place_desks(0.0);
scale_animator = NULL;
return ECORE_CALLBACK_CANCEL;
}
in = log(14) * in;
in = 1.0 / exp(in*in);
if (in > 1.0) in = 1.0;
}
else
{
in = log(14) * (1.0 - scale);
in = 1.0 - (1.0 / exp(in*in));
if (in >= 1.0)
{
_pager_finish();
scale_animator = NULL;
return ECORE_CALLBACK_CANCEL;
}
in = log(14) * (1.0 - in);
in = 1.0 / exp(in*in);
if (in < 0.0) in = 0.0;
}
if (in > 1.0) in = 1.0;
if (in < 0.0) in = 0.0;
_pager_place_desks(in);
_pager_place_windows(in);
if (scale_conf->pager_fade_windows)
{
Eina_List *l;
Item *it;
EINA_LIST_FOREACH(items, l, it)
{
a = 255.0;
double a = 255.0;
if ((it->desk != current_desk) &&
(it->desk != previous_desk))
@ -184,7 +192,10 @@ _pager_redraw(void *data)
if (scale_conf->pager_fade_popups)
{
a = 255.0 * in;
Eina_List *l;
Item *it;
double a = 255.0 * in;
EINA_LIST_FOREACH(popups, l, it)
evas_object_color_set(it->o_win, a, a, a, a);
@ -192,31 +203,20 @@ _pager_redraw(void *data)
if (scale_conf->pager_fade_desktop && background)
{
a = 255.0 * (0.5 + in/2.0);
double a = 255.0 * (0.5 + in/2.0);
evas_object_color_set(background->o_win, a, a, a, 255);
}
if (scale < 1.0 && scale > 0.0)
return 1;
e_manager_comp_evas_update(e_manager_current_get());
if (scale == 0.0)
{
_pager_finish();
}
else
{
_pager_place_windows(0.0);
_pager_place_desks(0.0);
}
scale_animator = NULL;
return 0;
return ECORE_CALLBACK_RENEW;
}
static void
_pager_in()
{
start_time = ecore_time_get();
start_time = ecore_loop_time_get();
scale_state = EINA_TRUE;
if (!scale_animator)
@ -229,7 +229,7 @@ _pager_out()
Eina_List *l;
double duration, now;
now = ecore_time_get();
now = ecore_loop_time_get();
duration = scale_conf->pager_duration;
if (now - start_time < duration)
@ -306,7 +306,7 @@ _pager_finish()
Eina_List *l;
E_Manager_Comp_Source *src;
E_Manager *man = zone->container->manager;
EINA_LIST_FOREACH((Eina_List *)e_manager_comp_src_list(man), l, src)
e_manager_comp_src_hidden_set(man, src, EINA_FALSE);
}
@ -422,7 +422,7 @@ _pager_win_cb_mouse_up(void *data, Evas *e, Evas_Object *obj, void *event_info)
if (!it->moved)
return;
if (x + it->bd->w > zone->x + zone->w) x = zone->x + zone->w - it->bd->w;
if (y + it->bd->h > zone->y + zone->h) y = zone->y + zone->h - it->bd->h;
if (x < zone->x) x = zone->x;
@ -454,7 +454,7 @@ _pager_win_cb_mouse_move(void *data, Evas *e, Evas_Object *obj, void *event_info
return;
it->moved = EINA_TRUE;
x = it->x + (ev->cur.canvas.x - ev->prev.canvas.x);
y = it->y + (ev->cur.canvas.y - ev->prev.canvas.y);
@ -521,7 +521,7 @@ _pager_win_cb_mouse_in(void *data, Evas *e, Evas_Object *obj, void *event_info)
if (!scale_state)
return;
mouse_activated = 0;
if (selected_item && (it != selected_item))
@ -544,10 +544,10 @@ _pager_win_cb_mouse_out(void *data, Evas *e, Evas_Object *obj, void *event_info)
if (!mouse_activated)
return;
if (selected_item == it)
{
edje_object_signal_emit(it->o, "mouse,out", "e");
edje_object_signal_emit(it->o, "mouse,out", "e");
selected_item = NULL;
}
}
@ -727,7 +727,10 @@ _pager_win_new(Evas *e, E_Manager *man, E_Manager_Comp_Source *src)
if (it->bd != e_border_focused_get())
edje_object_signal_emit(it->o, "mouse,out", "e");
else
selected_item = it;
{
edje_object_signal_emit(it->o, "mouse,in", "e");
selected_item = it;
}
if (scale_state)
_pager_redraw(NULL);
@ -988,11 +991,11 @@ _pager_run(E_Manager *man)
zone = e_util_zone_current_get(man);
if (!zone)
return EINA_FALSE;
current_desk = e_desk_current_get(zone);
if (!current_desk)
return EINA_FALSE;
input_win = ecore_x_window_input_new(zone->container->win,
0, 0, 1, 1);
ecore_x_window_show(input_win);
@ -1042,15 +1045,15 @@ _pager_run(E_Manager *man)
zone_clip = evas_object_rectangle_add(e);
evas_object_move(zone_clip, zone->x, zone->y);
evas_object_resize(zone_clip, zone->w, zone->h);
evas_object_show(zone_clip);
evas_object_show(zone_clip);
EINA_LIST_FOREACH((Eina_List *)e_manager_comp_src_list(man), l, src)
{
Item *it = _pager_win_new(e, man, src);
if (it)
evas_object_clip_set(it->o, zone_clip);
evas_object_clip_set(it->o, zone_clip);
}
if (background)
{
Evas_Object *o;
@ -1072,7 +1075,7 @@ _pager_run(E_Manager *man)
if ((x != zone->desk_x_current) || (y != zone->desk_y_current))
edje_object_signal_emit(o, "unfocused", "e");
evas_object_clip_set(o, zone_clip);
evas_object_clip_set(o, zone_clip);
}
}
_pager_place_desks(1.0);
@ -1115,7 +1118,7 @@ pager_run(E_Manager *man, const char *params, int init_method)
ecore_animator_del(scale_animator);
scale_animator = NULL;
}
ret = _pager_run(man);
if (ret)
@ -1146,7 +1149,7 @@ _pager_handler(void *data, const char *name, const char *info, int val,
/* XXX disabled for now. */
/* return; */
e = e_manager_comp_evas_get(man);
if (!strcmp(info, "change.comp"))
{
@ -1173,7 +1176,7 @@ _pager_handler(void *data, const char *name, const char *info, int val,
}
else if (!strcmp(info, "visibility.src"))
{
DBG("%s: %p | %p\n", info, man, src);
DBG("%s: %p | %p\n", info, man, src);
/* _pager_win_new(e, man, src); */
}
}

View File

@ -141,7 +141,7 @@ _scale_warp_to_win(Item *it, double advance)
{
ecore_x_pointer_warp(it->bd->zone->container->win,
(double)warp_x * (1.0 - advance) + (double)(it->x + it->w/2) * advance,
(double)warp_y * (1.0 - advance) + (double)(it->y + it->h/2) * advance);
(double)warp_y * (1.0 - advance) + (double)(it->y + it->h/2) * advance + 10);
}
static Eina_Bool
@ -151,7 +151,7 @@ _scale_warp_pointer(void *data)
if (it)
{
double in = (ecore_time_get() - warp_start) / 0.25;
double in = (ecore_loop_time_get() - warp_start) / 0.25;
if (in > 1.0) in = 1.0;
_scale_warp_to_win(it, in);
if (in < 1.0)
@ -167,23 +167,42 @@ _scale_redraw(void *data)
{
Eina_List *l;
Item *it;
double scale, a, in, duration;
double in, duration;
if (show_all_desks)
duration = scale_conf->desks_duration;
else
duration = scale_conf->scale_duration;
in = (ecore_loop_time_get() - start_time) / duration;
if (scale_state)
scale = (ecore_time_get() - start_time) / duration;
{
if (in >= 1.0)
{
_scale_place_windows(0.0);
scale_animator = NULL;
return ECORE_CALLBACK_CANCEL;
}
in = log(14) * in;
in = 1.0 / exp(in*in);
if (in > 1.0) in = 1.0;
}
else
scale = 1.0 - (ecore_time_get() - start_time) / duration;
{
printf("%f %f\n", (ecore_loop_time_get() - start_time), start_time);
if (scale > 1.0) scale = 1.0;
if (scale < 0.0) scale = 0.0;
if (in >= 1.0)
{
_scale_finish();
scale_animator = NULL;
return ECORE_CALLBACK_CANCEL;
}
in = log(14) * scale;
in = 1.0 / exp(in*in);
in = log(14) * (1.0 - in);
in = 1.0 / exp(in*in);
if (in < 0.0) in = 0.0;
}
_scale_place_windows(in);
@ -191,7 +210,7 @@ _scale_redraw(void *data)
{
EINA_LIST_FOREACH(items, l, it)
{
a = 255.0;
double a = 255.0;
if ((it->bd->desk != current_desk) && (selected_item != it))
{
@ -208,47 +227,40 @@ _scale_redraw(void *data)
}
if (warp_pointer && selected_item)
_scale_warp_to_win(selected_item, in);
a = 255.0 * in;
_scale_warp_to_win(selected_item, (1.0 - in));
EINA_LIST_FOREACH(items_fade, l, it)
{
double a = 255.0 * in;
if ((it->bd->desk == current_desk) || (it->bd->sticky))
evas_object_color_set(it->o, a, a, a, a);
}
if (scale_conf->fade_popups)
{
double a = 255.0 * in;
EINA_LIST_FOREACH(popups, l, it)
evas_object_color_set(it->o_win, a, a, a, a);
}
if (scale_conf->fade_desktop && background)
{
a = 255.0 * (0.5 + in/2.0);
double a = 255.0 * (0.5 + in/2.0);
evas_object_color_set(background->o_win, a, a, a, 255);
}
e_manager_comp_evas_update(e_manager_current_get());
if (scale < 1.0 && scale > 0.0)
return 1;
if ((!scale_state) && (scale == 0.0))
_scale_finish();
else
_scale_place_windows(0.0);
scale_animator = NULL;
return 0;
return ECORE_CALLBACK_RENEW;
}
static void
_scale_in()
{
start_time = ecore_time_get();
start_time = ecore_loop_time_get();
scale_state = EINA_TRUE;
_scale_place_windows(1.0);
@ -260,7 +272,7 @@ _scale_in()
static void
_scale_out(int mode)
{
double duration, now = ecore_time_get();
double duration, now = ecore_loop_time_get();
Item *ot, *it = selected_item;
Eina_List *l;
if (mode == 0)
@ -327,11 +339,12 @@ _scale_out(int mode)
evas_object_raise(it->o);
e_border_raise(it->bd);
if ((!it->moved) &&(init_method == GO_KEY) &&
if ((!it->moved) && (init_method == GO_KEY) &&
(e_config->focus_policy != E_FOCUS_CLICK))
{
warp_pointer = 1;
ecore_x_pointer_xy_get(it->bd->zone->container->win, &warp_x, &warp_y);
warp_x = it->bd->x + it->bd->w/2;
warp_y = it->bd->y + it->bd->h/2;
e_border_focus_set(it->bd, 1, 1);
}
else
@ -516,7 +529,7 @@ _scale_win_cb_mouse_move(void *data, Evas *e, Evas_Object *obj, void *event_info
Evas_Event_Mouse_Move *ev = event_info;
Item *it = data;
if (!it || !it->mouse_down)
if ((!it) || (!it->mouse_down))
return;
if (it->moved)
@ -532,7 +545,7 @@ _scale_win_cb_mouse_move(void *data, Evas *e, Evas_Object *obj, void *event_info
{
if (!scale_state)
return;
if (it->bd->maximized || it->bd->fullscreen || it->bd->lock_user_location)
return;
@ -549,7 +562,7 @@ _scale_win_cb_mouse_move(void *data, Evas *e, Evas_Object *obj, void *event_info
if (it->bd_x + it->bd->w > it->bd->zone->w)
it->bd_x = it->bd->zone->w - it->bd->w;
if (it->bd_y + it->bd->h > it->bd->zone->h)
it->bd_y = it->bd->zone->h - it->bd->h;
it->bd_y = it->bd->zone->h - it->bd->h;
}
}
@ -766,7 +779,7 @@ static void
_scale_warp_animator_run(Item *it)
{
ecore_x_pointer_xy_get(it->bd->zone->container->win, &warp_x, &warp_y);
warp_start = ecore_time_get();
warp_start = ecore_loop_time_get();
if (!warp_animator)
warp_animator = ecore_animator_add(_scale_warp_pointer, it);
@ -979,7 +992,7 @@ _scale_run(E_Manager *man)
if (!current_desk)
return EINA_FALSE;
start_time = ecore_time_get();
start_time = ecore_loop_time_get();
input_win = ecore_x_window_input_new(zone->container->win, 0, 0, 1, 1);
ecore_x_window_show(input_win);
@ -1136,7 +1149,7 @@ _scale_run(E_Manager *man)
it->bd_y += zone->y;
}
DBG("time: %f\n", ecore_time_get() - start_time);
DBG("time: %f\n", ecore_loop_time_get() - start_time);
it = NULL;
bd = NULL;
@ -1174,6 +1187,8 @@ _scale_run(E_Manager *man)
{
if (it != selected_item)
edje_object_signal_emit(it->o, "mouse,out", "e");
else
edje_object_signal_emit(it->o, "mouse,in", "e");
if (scale_conf->fade_windows)
{