Enlightenment CVS committal Author : raster Project : e17 Module : libs/ecore
Dir : e17/libs/ecore/src/lib/ecore Modified Files: Ecore.h ecore_private.h ecore_timer.c Log Message: cedric's timer freeze code. =================================================================== RCS file: /cvs/e/e17/libs/ecore/src/lib/ecore/Ecore.h,v retrieving revision 1.60 retrieving revision 1.61 diff -u -3 -r1.60 -r1.61 --- Ecore.h 26 Jan 2008 14:41:34 -0000 1.60 +++ Ecore.h 9 Mar 2008 15:56:17 -0000 1.61 @@ -277,6 +277,8 @@ 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); =================================================================== RCS file: /cvs/e/e17/libs/ecore/src/lib/ecore/ecore_private.h,v retrieving revision 1.50 retrieving revision 1.51 diff -u -3 -r1.50 -r1.51 --- ecore_private.h 28 Jan 2008 11:20:57 -0000 1.50 +++ ecore_private.h 9 Mar 2008 15:56:17 -0000 1.51 @@ -281,14 +281,16 @@ 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 =================================================================== RCS file: /cvs/e/e17/libs/ecore/src/lib/ecore/ecore_timer.c,v retrieving revision 1.18 retrieving revision 1.19 diff -u -3 -r1.18 -r1.19 --- ecore_timer.c 25 Jan 2008 18:28:16 -0000 1.18 +++ ecore_timer.c 9 Mar 2008 15:56:17 -0000 1.19 @@ -6,6 +6,7 @@ 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 @@ 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_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 @@ 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 @@ { 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 @@ 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) ------------------------------------------------------------------------- This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2008. http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs