cedric's timer freeze code.

SVN revision: 33967
This commit is contained in:
Carsten Haitzler 2008-03-09 15:56:17 +00:00
parent 9f50836a12
commit 4a3d696dcf
3 changed files with 93 additions and 9 deletions

View File

@ -277,6 +277,8 @@ extern "C" {
EAPI Ecore_Timer *ecore_timer_add(double in, int (*func) (void *data), const void *data);
EAPI void *ecore_timer_del(Ecore_Timer *timer);
EAPI void ecore_timer_interval_set(Ecore_Timer *timer, double in);
EAPI void ecore_timer_freeze(Ecore_Timer *timer);
EAPI void ecore_timer_thaw(Ecore_Timer *timer);
EAPI Ecore_Animator *ecore_animator_add(int (*func) (void *data), const void *data);
EAPI void *ecore_animator_del(Ecore_Animator *animator);

View File

@ -281,14 +281,16 @@ struct _Ecore_Exe
struct _Ecore_Timer
{
Ecore_List2 __list_data;
Ecore_List2 __list_data;
ECORE_MAGIC;
double in;
double at;
signed char delete_me : 1;
signed char just_added : 1;
int (*func) (void *data);
void *data;
double in;
double at;
double pending;
unsigned char delete_me : 1;
unsigned char just_added : 1;
unsigned char frozen : 1;
int (*func) (void *data);
void *data;
};
struct _Ecore_Idler

View File

@ -6,6 +6,7 @@ static void _ecore_timer_set(Ecore_Timer *timer, double at, double in, int (*fun
static int timers_added = 0;
static int timers_delete_me = 0;
static Ecore_Timer *timers = NULL;
static Ecore_Timer *suspended = NULL;
static double last_check = 0.0;
/**
@ -95,6 +96,58 @@ ecore_timer_interval_set(Ecore_Timer *timer, double in)
timer->in = in;
}
/**
*
*
*/
EAPI void
ecore_timer_freeze(Ecore_Timer *timer)
{
double now;
if (!ECORE_MAGIC_CHECK(timer, ECORE_MAGIC_TIMER))
{
ECORE_MAGIC_FAIL(timer, ECORE_MAGIC_TIMER,
"ecore_timer_freeze");
return ;
}
/* Timer already frozen */
if (timer->frozen)
return ;
timers = _ecore_list2_remove(timers, timer);
suspended = _ecore_list2_prepend(suspended, timer);
now = ecore_time_get();
timer->pending = timer->at - now;
timer->at = 0.0;
timer->frozen = 1;
}
EAPI void
ecore_timer_thaw(Ecore_Timer *timer)
{
double now;
if (!ECORE_MAGIC_CHECK(timer, ECORE_MAGIC_TIMER))
{
ECORE_MAGIC_FAIL(timer, ECORE_MAGIC_TIMER,
"ecore_timer_thaw");
return ;
}
/* Timer not frozen */
if (!timer->frozen)
return ;
suspended = _ecore_list2_remove(suspended, timer);
now = ecore_time_get();
_ecore_timer_set(timer, timer->pending + now, timer->in, timer->func, timer->data);
}
void
_ecore_timer_shutdown(void)
{
@ -107,6 +160,16 @@ _ecore_timer_shutdown(void)
ECORE_MAGIC_SET(timer, ECORE_MAGIC_NONE);
free(timer);
}
while (suspended)
{
Ecore_Timer *timer;
timer = suspended;
suspended = _ecore_list2_remove(suspended, timer);
ECORE_MAGIC_SET(timer, ECORE_MAGIC_NONE);
free(timer);
}
}
void
@ -130,6 +193,21 @@ _ecore_timer_cleanup(void)
if (timers_delete_me == 0) return;
}
}
for (l = (Ecore_List2 *)suspended; l;)
{
Ecore_Timer *timer;
timer = (Ecore_Timer *)l;
l = l->next;
if (timer->delete_me)
{
suspended = _ecore_list2_remove(suspended, timer);
ECORE_MAGIC_SET(timer, ECORE_MAGIC_NONE);
free(timer);
timers_delete_me--;
if (timers_delete_me == 0) return;
}
}
timers_delete_me = 0;
}
@ -188,8 +266,8 @@ _ecore_timer_call(double when)
{
timer = (Ecore_Timer *)l;
if ((timer->at <= when) &&
(!timer->just_added) &&
(!timer->delete_me))
(timer->just_added == 0) &&
(timer->delete_me == 0))
{
timers = _ecore_list2_remove(timers, timer);
_ecore_timer_call(when);
@ -233,6 +311,8 @@ _ecore_timer_set(Ecore_Timer *timer, double at, double in, int (*func) (void *da
timer->func = func;
timer->data = data;
timer->just_added = 1;
timer->frozen = 0;
timer->pending = 0.0;
if (timers)
{
for (l = ((Ecore_List2 *)(timers))->last; l; l = l->prev)