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

Reply via email to