[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