summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarsten Haitzler (Rasterman) <raster@rasterman.com>2014-08-01 09:31:18 +0900
committerCarsten Haitzler (Rasterman) <raster@rasterman.com>2014-08-01 09:31:18 +0900
commitaa6e9c2968b4d4ffdb5015fd90a6a8cb22566c34 (patch)
tree5f9c3fd68c58ef0d2659031afc3d5095afd49716
parent6e7b42111ff797dfff2957213f60b56e2cc6cfdf (diff)
downloadefl-aa6e9c2968b4d4ffdb5015fd90a6a8cb22566c34.tar.gz
ecore animator - this fixes suspended animators still waking up
@fix this fixes a long standing issue where a suspended animator still is waking up as originally suspended animators were expected to hang out for a small time. as e's comp uses a suspended animator, this is a problem as it causes continual wakupes every single frame (60hz or so) with this suspended animator. this fixes that and accounts for suspended animators with tick begin/end
-rw-r--r--src/lib/ecore/ecore_anim.c38
1 files changed, 30 insertions, 8 deletions
diff --git a/src/lib/ecore/ecore_anim.c b/src/lib/ecore/ecore_anim.c
index 3d73f301b3..e85efe6f1e 100644
--- a/src/lib/ecore/ecore_anim.c
+++ b/src/lib/ecore/ecore_anim.c
@@ -43,6 +43,7 @@ static Eina_Bool _ecore_animator(void *data);
static int animators_delete_me = 0;
static Ecore_Animator_Data *animators = NULL;
static double animators_frametime = 1.0 / 30.0;
+static unsigned int animators_suspended = 0;
static Ecore_Animator_Source src = ECORE_ANIMATOR_SOURCE_TIMER;
static Ecore_Timer *timer = NULL;
@@ -53,6 +54,16 @@ static Ecore_Cb end_tick_cb = NULL;
static const void *end_tick_data = NULL;
static Eina_Bool animator_ran = EINA_FALSE;
+static Eina_Bool
+_have_animators(void)
+{
+ if ((animators) &&
+ (animators_suspended < eina_inlist_count(EINA_INLIST_GET(animators)))
+ )
+ return EINA_TRUE;
+ return EINA_FALSE;
+}
+
static void
_begin_tick(void)
{
@@ -131,6 +142,7 @@ _do_tick(void)
l = (Ecore_Animator_Data *)EINA_INLIST_GET(l)->next;
if (animator->delete_me)
{
+ if (animator->suspended) animators_suspended--;
animators = (Ecore_Animator_Data *)
eina_inlist_remove(EINA_INLIST_GET(animators),
EINA_INLIST_GET(animator));
@@ -146,7 +158,7 @@ _do_tick(void)
}
}
}
- if (!animators)
+ if (!_have_animators())
{
_end_tick();
return ECORE_CALLBACK_CANCEL;
@@ -521,7 +533,7 @@ ecore_animator_frametime_set(double frametime)
if (animators_frametime == frametime) goto unlock;
animators_frametime = frametime;
_end_tick();
- if (animators) _begin_tick();
+ if (_have_animators()) _begin_tick();
unlock:
_ecore_unlock();
}
@@ -545,9 +557,13 @@ _ecore_animator_eo_base_event_freeze(Eo *obj EINA_UNUSED, Ecore_Animator_Data *a
{
EINA_MAIN_LOOP_CHECK_RETURN;
_ecore_lock();
-
if (animator->delete_me) goto unlock;
- animator->suspended = EINA_TRUE;
+ if (!animator->suspended)
+ {
+ animator->suspended = EINA_TRUE;
+ animators_suspended++;
+ if (!_have_animators()) _end_tick();
+ }
unlock:
_ecore_unlock();
}
@@ -566,7 +582,12 @@ _ecore_animator_eo_base_event_thaw(Eo *obj EINA_UNUSED, Ecore_Animator_Data *ani
_ecore_lock();
if (animator->delete_me) goto unlock;
- animator->suspended = EINA_FALSE;
+ if (animator->suspended)
+ {
+ animator->suspended = EINA_FALSE;
+ animators_suspended--;
+ if (_have_animators()) _begin_tick();
+ }
unlock:
_ecore_unlock();
}
@@ -578,7 +599,7 @@ ecore_animator_source_set(Ecore_Animator_Source source)
_ecore_lock();
src = source;
_end_tick();
- if (animators) _begin_tick();
+ if (_have_animators()) _begin_tick();
_ecore_unlock();
}
@@ -598,7 +619,7 @@ ecore_animator_custom_source_tick_begin_callback_set(Ecore_Cb func,
begin_tick_cb = func;
begin_tick_data = data;
_end_tick();
- if (animators) _begin_tick();
+ if (_have_animators()) _begin_tick();
_ecore_unlock();
}
@@ -611,7 +632,7 @@ ecore_animator_custom_source_tick_end_callback_set(Ecore_Cb func,
end_tick_cb = func;
end_tick_data = data;
_end_tick();
- if (animators) _begin_tick();
+ if (_have_animators()) _begin_tick();
_ecore_unlock();
}
@@ -633,6 +654,7 @@ _ecore_animator_shutdown(void)
Ecore_Animator_Data *animator;
animator = animators;
+ if (animator->suspended) animators_suspended--;
animators = (Ecore_Animator_Data *)eina_inlist_remove(EINA_INLIST_GET(animators), EINA_INLIST_GET(animators));
eo_do(animator->obj, eo_parent_set(NULL));