forked from enlightenment/efl
parent
9f50836a12
commit
4a3d696dcf
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue