Eolian: Integration of Ecore Animator

This commit is contained in:
Yossi Kantor 2014-03-24 13:23:14 +02:00 committed by Daniel Zaoui
parent b05a323877
commit 387c343394
5 changed files with 64 additions and 80 deletions

View File

@ -13,7 +13,9 @@ BUILT_SOURCES += \
lib/ecore/ecore_idle_enterer.eo.c \
lib/ecore/ecore_idle_enterer.eo.h \
lib/ecore/ecore_idle_exiter.eo.c \
lib/ecore/ecore_idle_exiter.eo.h
lib/ecore/ecore_idle_exiter.eo.h \
lib/ecore/ecore_animator.eo.c \
lib/ecore/ecore_animator.eo.h
ecoreeolianfilesdir = $(datadir)/eolian/include/ecore-@VMAJ@
ecoreeolianfiles_DATA = \
@ -22,7 +24,8 @@ ecoreeolianfiles_DATA = \
lib/ecore/ecore_job.eo \
lib/ecore/ecore_idler.eo \
lib/ecore/ecore_idle_enterer.eo \
lib/ecore/ecore_idle_exiter.eo
lib/ecore/ecore_idle_exiter.eo \
lib/ecore/ecore_animator.eo
EXTRA_DIST += \
${ecoreeolianfiles_DATA}
@ -43,7 +46,8 @@ nodist_installed_ecoremainheaders_DATA = \
lib/ecore/ecore_job.eo.h \
lib/ecore/ecore_idler.eo.h \
lib/ecore/ecore_idle_enterer.eo.h \
lib/ecore/ecore_idle_exiter.eo.h
lib/ecore/ecore_idle_exiter.eo.h \
lib/ecore/ecore_animator.eo.h
lib_ecore_libecore_la_SOURCES = \
lib/ecore/ecore.c \

View File

@ -75,6 +75,8 @@ enum
*
* @{
*/
#include "ecore_animator.eo.h"
#if 0
#define ECORE_ANIMATOR_CLASS ecore_animator_class_get()
const Eo_Class *ecore_animator_class_get(void) EINA_CONST;
@ -114,7 +116,7 @@ enum
*
*/
#define ecore_animator_timeline_constructor(runtime, func, data) ECORE_ANIMATOR_ID(ECORE_ANIMATOR_SUB_ID_TIMELINE_CONSTRUCTOR), EO_TYPECHECK(double, runtime), EO_TYPECHECK(Ecore_Timeline_Cb, func), EO_TYPECHECK(const void *, data)
#endif
/**
* @}
*/

View File

@ -18,9 +18,7 @@
if (!eo_isa((obj), ECORE_ANIMATOR_CLASS)) \
return
EAPI Eo_Op ECORE_ANIMATOR_BASE_ID = EO_NOOP;
struct _Ecore_Animator_Private_Data
struct _Ecore_Animator_Data
{
EINA_INLIST;
Ecore_Animator *obj;
@ -37,13 +35,13 @@ struct _Ecore_Animator_Private_Data
Eina_Bool just_added : 1;
};
typedef struct _Ecore_Animator_Private_Data Ecore_Animator_Private_Data;
typedef struct _Ecore_Animator_Data Ecore_Animator_Data;
static Eina_Bool _ecore_animator_run(void *data);
static Eina_Bool _ecore_animator(void *data);
static int animators_delete_me = 0;
static Ecore_Animator_Private_Data *animators = NULL;
static Ecore_Animator_Data *animators = NULL;
static double animators_frametime = 1.0 / 30.0;
static Ecore_Animator_Source src = ECORE_ANIMATOR_SOURCE_TIMER;
@ -103,7 +101,7 @@ _end_tick(void)
static Eina_Bool
_do_tick(void)
{
Ecore_Animator_Private_Data *animator;
Ecore_Animator_Data *animator;
EINA_INLIST_FOREACH(animators, animator)
{
@ -126,14 +124,14 @@ _do_tick(void)
}
if (animators_delete_me)
{
Ecore_Animator_Private_Data *l;
Ecore_Animator_Data *l;
for (l = animators; l; )
{
animator = l;
l = (Ecore_Animator_Private_Data *)EINA_INLIST_GET(l)->next;
l = (Ecore_Animator_Data *)EINA_INLIST_GET(l)->next;
if (animator->delete_me)
{
animators = (Ecore_Animator_Private_Data *)
animators = (Ecore_Animator_Data *)
eina_inlist_remove(EINA_INLIST_GET(animators),
EINA_INLIST_GET(animator));
@ -158,7 +156,7 @@ _do_tick(void)
static Eina_Bool
_ecore_animator_add(Ecore_Animator *obj,
Ecore_Animator_Private_Data *animator,
Ecore_Animator_Data *animator,
Ecore_Task_Cb func,
const void *data)
{
@ -182,13 +180,13 @@ _ecore_animator_add(Ecore_Animator *obj,
animator->func = func;
animator->data = (void *)data;
animator->just_added = EINA_TRUE;
animators = (Ecore_Animator_Private_Data *)eina_inlist_append(EINA_INLIST_GET(animators), EINA_INLIST_GET(animator));
animators = (Ecore_Animator_Data *)eina_inlist_append(EINA_INLIST_GET(animators), EINA_INLIST_GET(animator));
_begin_tick();
return EINA_TRUE;
}
static void
_constructor(Eo *obj, void *_pd EINA_UNUSED, va_list *list EINA_UNUSED)
EOLIAN static void
_ecore_animator_eo_base_constructor(Eo *obj, Ecore_Animator_Data *_pd EINA_UNUSED)
{
eo_error_set(obj);
ERR("only custom constructor can be used with '%s' class", MY_CLASS_NAME);
@ -206,14 +204,10 @@ ecore_animator_add(Ecore_Task_Cb func,
return animator;
}
static void
_animator_constructor(Eo *obj, void *_pd, va_list *list)
EOLIAN static void
_ecore_animator_constructor(Eo *obj, Ecore_Animator_Data *animator, Ecore_Task_Cb func, const void *data)
{
Ecore_Task_Cb func = va_arg(*list, Ecore_Task_Cb);
const void *data = va_arg(*list, const void *);
_ecore_lock();
Ecore_Animator_Private_Data *animator = _pd;
_ecore_animator_add(obj, animator, func, data);
_ecore_unlock();
}
@ -230,16 +224,12 @@ ecore_animator_timeline_add(double runtime,
return animator;
}
static void
_animator_timeline_constructor(Eo *obj, void *_pd, va_list *list)
EOLIAN static void
_ecore_animator_timeline_constructor(Eo *obj, Ecore_Animator_Data *animator, double runtime, Ecore_Timeline_Cb func, const void *data)
{
_ecore_lock();
double runtime = va_arg(*list, double);
if (runtime <= 0.0) runtime = 0.0;
Ecore_Timeline_Cb func = va_arg(*list, Ecore_Timeline_Cb);
const void *data = va_arg(*list, const void *);
Ecore_Animator_Private_Data *animator = _pd;
if (!_ecore_animator_add(obj, animator, _ecore_animator_run, NULL)) goto unlock;
animator->data = obj;
@ -493,7 +483,7 @@ ecore_animator_del(Ecore_Animator *obj)
if (!obj) return NULL;
EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
Ecore_Animator_Private_Data *animator = eo_data_scope_get(obj, MY_CLASS);
Ecore_Animator_Data *animator = eo_data_scope_get(obj, MY_CLASS);
_ecore_lock();
if (!animator) goto unlock;
@ -513,11 +503,9 @@ unlock:
return data;
}
static void
_destructor(Eo *obj, void *_pd, va_list *list EINA_UNUSED)
EOLIAN static void
_ecore_animator_eo_base_destructor(Eo *obj, Ecore_Animator_Data *pd)
{
Ecore_Animator_Private_Data *pd = _pd;
pd->delete_me = EINA_TRUE;
animators_delete_me++;
@ -552,13 +540,11 @@ ecore_animator_freeze(Ecore_Animator *animator)
eo_do(animator, eo_event_freeze());
}
static void
_ecore_animator_freeze(Eo *obj EINA_UNUSED, void *_pd,
va_list *list EINA_UNUSED)
EOLIAN static void
_ecore_animator_eo_base_event_freeze(Eo *obj EINA_UNUSED, Ecore_Animator_Data *animator)
{
EINA_MAIN_LOOP_CHECK_RETURN;
_ecore_lock();
Ecore_Animator_Private_Data *animator = _pd;
if (animator->delete_me) goto unlock;
animator->suspended = EINA_TRUE;
@ -573,12 +559,10 @@ ecore_animator_thaw(Ecore_Animator *animator)
eo_do(animator, eo_event_thaw());
}
static void
_ecore_animator_thaw(Eo *obj EINA_UNUSED, void *_pd,
va_list *list EINA_UNUSED)
EOLIAN static void
_ecore_animator_eo_base_event_thaw(Eo *obj EINA_UNUSED, Ecore_Animator_Data *animator)
{
EINA_MAIN_LOOP_CHECK_RETURN;
Ecore_Animator_Private_Data *animator = _pd;
_ecore_lock();
if (animator->delete_me) goto unlock;
@ -646,10 +630,10 @@ _ecore_animator_shutdown(void)
_end_tick();
while (animators)
{
Ecore_Animator_Private_Data *animator;
Ecore_Animator_Data *animator;
animator = animators;
animators = (Ecore_Animator_Private_Data *)eina_inlist_remove(EINA_INLIST_GET(animators), EINA_INLIST_GET(animators));
animators = (Ecore_Animator_Data *)eina_inlist_remove(EINA_INLIST_GET(animators), EINA_INLIST_GET(animators));
eo_do(animator->obj, eo_parent_set(NULL));
if (eo_destructed_is(animator->obj))
@ -675,7 +659,7 @@ static Eina_Bool
_ecore_animator_run(void *data)
{
Ecore_Animator *obj = data;
Ecore_Animator_Private_Data *animator = eo_data_scope_get(obj, MY_CLASS);
Ecore_Animator_Data *animator = eo_data_scope_get(obj, MY_CLASS);
double pos = 0.0, t;
Eina_Bool run_ret;
@ -703,38 +687,4 @@ _ecore_animator(void *data EINA_UNUSED)
return r;
}
static void
_class_constructor(Eo_Class *klass)
{
const Eo_Op_Func_Description func_desc[] = {
EO_OP_FUNC(EO_BASE_ID(EO_BASE_SUB_ID_CONSTRUCTOR), _constructor),
EO_OP_FUNC(EO_BASE_ID(EO_BASE_SUB_ID_DESTRUCTOR), _destructor),
EO_OP_FUNC(EO_BASE_ID(EO_BASE_SUB_ID_EVENT_FREEZE), _ecore_animator_freeze),
EO_OP_FUNC(EO_BASE_ID(EO_BASE_SUB_ID_EVENT_THAW), _ecore_animator_thaw),
EO_OP_FUNC(ECORE_ANIMATOR_ID(ECORE_ANIMATOR_SUB_ID_CONSTRUCTOR), _animator_constructor),
EO_OP_FUNC(ECORE_ANIMATOR_ID(ECORE_ANIMATOR_SUB_ID_TIMELINE_CONSTRUCTOR), _animator_timeline_constructor),
EO_OP_FUNC_SENTINEL
};
eo_class_funcs_set(klass, func_desc);
}
static const Eo_Op_Description op_desc[] = {
EO_OP_DESCRIPTION(ECORE_ANIMATOR_SUB_ID_CONSTRUCTOR, "Add an animator to call func at every animation tick during main loop execution."),
EO_OP_DESCRIPTION(ECORE_ANIMATOR_SUB_ID_TIMELINE_CONSTRUCTOR, "Add an animator that runs for a limited time"),
EO_OP_DESCRIPTION_SENTINEL
};
static const Eo_Class_Description class_desc = {
EO_VERSION,
MY_CLASS_NAME,
EO_CLASS_TYPE_REGULAR,
EO_CLASS_DESCRIPTION_OPS(&ECORE_ANIMATOR_BASE_ID, op_desc, ECORE_ANIMATOR_SUB_ID_LAST),
NULL,
sizeof(Ecore_Animator_Private_Data),
_class_constructor,
NULL
};
EO_DEFINE_CLASS(ecore_animator_class_get, &class_desc, EO_BASE_CLASS, NULL)
#include "ecore_animator.eo.c"

View File

@ -0,0 +1,27 @@
class Ecore_Animator (Eo_Base)
{
eo_prefix: ecore_animator;
constructors {
timeline_constructor {
/*@ Contructor. */
params {
@in double runtime;
@in Ecore_Timeline_Cb func;
@in const void *data;
}
}
constructor {
/*@ Contructor. */
params {
@in Ecore_Task_Cb func;
@in const void *data;
}
}
}
implements {
Eo_Base::constructor;
Eo_Base::destructor;
Eo_Base::event_freeze;
Eo_Base::event_thaw;
}
}

View File

@ -53,6 +53,7 @@ class Ecore_Timer (Eo_Base)
Eo_Base::constructor;
Eo_Base::destructor;
Eo_Base::event_freeze;
Eo_Base::event_freeze::get;
Eo_Base::event_thaw;
}
}