[Pkg-e-commits] [SCM] Core abstraction layer for enlightenment DR 0.17 branch, upstream-vcs, updated. d6ccd8186518c58c26c1b20e1ea5de408340bb80

raster raster at alioth.debian.org
Mon Mar 10 15:24:35 UTC 2008


The following commit has been merged in the upstream-vcs branch:
commit 37d71f4babe790aced6f2d1b38a80f7f3bdb8964
Author: raster <raster>
Date:   Sun Mar 9 15:56:17 2008 +0000

    cedric's timer freeze code.

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_private.h b/src/lib/ecore/ecore_private.h
index e7d6970..e8eeb47 100644
--- a/src/lib/ecore/ecore_private.h
+++ b/src/lib/ecore/ecore_private.h
@@ -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
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)

-- 
Core abstraction layer for enlightenment DR 0.17



More information about the Pkg-e-commits mailing list