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

Reply via email to