This patch give the possibilite to suspend the execution of a timer
for as long as you want. Freezing a timer, remove it from the main
active timer list and push it on the suspended list waiting to be
thaw. The code is fairly simple, and remove the need to handle this in
the application.
--
Cedric BAIL
From f76b3304e01f5e8700cce4c57666dd449c19bf03 Mon Sep 17 00:00:00 2001
From: Cedric BAIL <[EMAIL PROTECTED]>
Date: Tue, 26 Feb 2008 14:41:35 +0100
Subject: [PATCH] First test for an ecore timer freeze and thaw support.
---
src/lib/ecore/Ecore.h | 2 +
src/lib/ecore/ecore_timer.c | 84 +++++++++++++++++++++++++++++++++++++++++-
2 files changed, 84 insertions(+), 2 deletions(-)
diff --git a/src/lib/ecore/Ecore.h b/src/lib/ecore/Ecore.h
index ccae207..f4e517b 100644
--- a/src/lib/ecore/Ecore.h
+++ b/src/lib/ecore/Ecore.h
@@ -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);
diff --git a/src/lib/ecore/ecore_timer.c b/src/lib/ecore/ecore_timer.c
index fafb539..480e0a3 100644
--- a/src/lib/ecore/ecore_timer.c
+++ b/src/lib/ecore/ecore_timer.c
@@ -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)
--
1.5.2.5
From f11bb12d92ce85eace54dcdb0fbad47f3e2310a9 Mon Sep 17 00:00:00 2001
From: Cedric BAIL <[EMAIL PROTECTED]>
Date: Wed, 27 Feb 2008 14:12:03 +0100
Subject: [PATCH] Add the pending property to ecore timer needed for suspending it.
---
src/lib/ecore/ecore_private.h | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
diff --git a/src/lib/ecore/ecore_private.h b/src/lib/ecore/ecore_private.h
index e7d6970..ad14c5d 100644
--- a/src/lib/ecore/ecore_private.h
+++ b/src/lib/ecore/ecore_private.h
@@ -285,6 +285,7 @@ struct _Ecore_Timer
ECORE_MAGIC;
double in;
double at;
+ double pending;
signed char delete_me : 1;
signed char just_added : 1;
int (*func) (void *data);
--
1.5.2.5
-------------------------------------------------------------------------
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-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel