From d22c821b4a9905e5137a1785d6891a0b0dc8559f Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Fri, 2 Apr 2004 09:16:53 +0000 Subject: [PATCH] timers and animators are now supported from the embryo scripts - WOOO! examples in e_logo.edc errr - the animators may have problems if somehow aan animator is deleted or object deleteded or file changed while running thru the list... SVN revision: 9567 --- legacy/edje/data/include/edje.inc | 14 +- legacy/edje/data/src/e_logo.edc | 14 ++ legacy/edje/src/lib/Edje.h | 7 + legacy/edje/src/lib/Edje_Edit.h | 30 +++- legacy/edje/src/lib/edje_embryo.c | 86 ++++++++-- legacy/edje/src/lib/edje_misc.c | 75 +++++++- legacy/edje/src/lib/edje_private.h | 33 ++-- legacy/edje/src/lib/edje_program.c | 1 + legacy/edje/src/lib/edje_var.c | 264 +++++++++++++++++++++++++++++ 9 files changed, 497 insertions(+), 27 deletions(-) diff --git a/legacy/edje/data/include/edje.inc b/legacy/edje/data/include/edje.inc index a8c0bc1570..d8074ffa78 100644 --- a/legacy/edje/data/include/edje.inc +++ b/legacy/edje/data/include/edje.inc @@ -34,8 +34,20 @@ native get_strlen(id); native get_str (id, dst[], maxlen); native set_str (id, str[]); +/********************/ +/* Edje timer calls */ +/********************/ +native timer (Float:in, fname[], val); +native cancel_timer(id); + +/*******************/ +/* Edje anim calls */ +/*******************/ +native anim (Float:len, fname[], val); +native cancel_anim(id); + /***********************************************************/ -/* Edje utility calls for dealign with edjes/programs etc. */ +/* Edje utility calls for dealing with edjes/programs etc. */ /***********************************************************/ /* Example: * diff --git a/legacy/edje/data/src/e_logo.edc b/legacy/edje/data/src/e_logo.edc index c2d576608e..531467f895 100644 --- a/legacy/edje/data/src/e_logo.edc +++ b/legacy/edje/data/src/e_logo.edc @@ -147,6 +147,18 @@ collections { public global_int; public global_float; public global_str; + + public timer_cb(val) + { + emit("PROGRAAAAAAAM", "TIMER@!@!@!@!@!@!@!"); + } + public anim_cb(val, Float: pos) + { + new buf[100]; + + snprintf(buf, 100, "val = %i, pos = %f", val, pos); + emit("PR AAAAAAAAANIM", buf); + } } parts { part { @@ -506,6 +518,8 @@ collections { set_state(PART:"logo", "clicked", 0.0); set_tween_state(PART:"logo", randf(), "default", 0.0, "clicked", 0.0); run_program(PROGRAM:"logo_click_d2"); + timer(2.5, "timer_cb", 777); + anim(1.5, "anim_cb", 7777); } } program { diff --git a/legacy/edje/src/lib/Edje.h b/legacy/edje/src/lib/Edje.h index 5f792b9d9a..3e77c97144 100644 --- a/legacy/edje/src/lib/Edje.h +++ b/legacy/edje/src/lib/Edje.h @@ -76,6 +76,13 @@ extern "C" { void edje_object_part_drag_page_get (Evas_Object *o, const char *part, double *dx, double *dy); void edje_object_part_drag_step (Evas_Object *o, const char *part, double dx, double dy); void edje_object_part_drag_page (Evas_Object *o, const char *part, double dx, double dy); + int edje_object_variable_id_get (Evas_Object *o, char *name); + int edje_object_variable_int_get (Evas_Object *o, int id); + void edje_object_variable_int_set (Evas_Object *o, int id, int val); + double edje_object_variable_float_get (Evas_Object *o, int id); + void edje_object_variable_float_set (Evas_Object *o, int id, double val); + char *edje_object_variable_str_get (Evas_Object *o, int id); + void edje_object_variable_str_set (Evas_Object *o, int id, char *str); #ifdef __cplusplus } diff --git a/legacy/edje/src/lib/Edje_Edit.h b/legacy/edje/src/lib/Edje_Edit.h index a9dd61a395..cdd6d94f29 100644 --- a/legacy/edje/src/lib/Edje_Edit.h +++ b/legacy/edje/src/lib/Edje_Edit.h @@ -382,6 +382,8 @@ typedef struct _Edje_Var Edje_Var; typedef struct _Edje_Var_Int Edje_Var_Int; typedef struct _Edje_Var_Float Edje_Var_Float; typedef struct _Edje_Var_String Edje_Var_String; +typedef struct _Edje_Var_Animator Edje_Var_Animator; +typedef struct _Edje_Var_Timer Edje_Var_Timer; typedef struct _Edje_Var_Pool Edje_Var_Pool; struct _Edje @@ -424,6 +426,7 @@ struct _Edje Evas_List *emissions; int load_error; int freeze; + /* variable pool for edje embryo scripts */ Edje_Var_Pool *var_pool; /* for faster lookups to avoid nth list walks */ int table_parts_size; @@ -600,10 +603,33 @@ struct _Edje_Var_String char *v; }; +struct _Edje_Var_Timer +{ + Edje *edje; + int id; + Embryo_Function func; + int val; + Ecore_Timer *timer; +}; + +struct _Edje_Var_Animator +{ + Edje *edje; + int id; + Embryo_Function func; + int val; + double start, len; + char delete_me; +}; + struct _Edje_Var_Pool { - int size; - Edje_Var *vars; + int id_count; + Evas_List *timers; + Evas_List *animators; + int size; + Edje_Var *vars; + int walking_list; }; struct _Edje_Var diff --git a/legacy/edje/src/lib/edje_embryo.c b/legacy/edje/src/lib/edje_embryo.c index 13c8ca9223..1421bafa72 100644 --- a/legacy/edje/src/lib/edje_embryo.c +++ b/legacy/edje/src/lib/edje_embryo.c @@ -169,17 +169,76 @@ _edje_embryo_fn_set_str(Embryo_Program *ep, Embryo_Cell *params) return 0; } -/* TIMERS... (tick off in N seconds from now) - * - * timer(Float:in, fname[], val) - * cancel_timer(id) - */ +/* timer(Float:in, fname[], val) */ +static Embryo_Cell +_edje_embryo_fn_timer(Embryo_Program *ep, Embryo_Cell *params) +{ + Edje *ed; + char *fname = NULL; + float f; + double in; + int val; + + CHKPARAM(3); + ed = embryo_program_data_get(ep); + GETSTR(fname, params[2]); + if ((!fname)) return 0; + f = EMBRYO_CELL_TO_FLOAT(params[1]); + in = (double)f; + val = params[3]; + return _edje_var_timer_add(ed, in, fname, val); +} + +/* cancel_timer(id) */ +static Embryo_Cell +_edje_embryo_fn_cancel_timer(Embryo_Program *ep, Embryo_Cell *params) +{ + Edje *ed; + int id; + + CHKPARAM(1); + ed = embryo_program_data_get(ep); + id = params[1]; + if (id <= 0) return 0; + _edje_var_timer_del(ed, id); + return 0; +} + +/* anim(Float:len, fname[], val) */ +static Embryo_Cell +_edje_embryo_fn_anim(Embryo_Program *ep, Embryo_Cell *params) +{ + Edje *ed; + char *fname = NULL; + float f; + double len; + int val; + + CHKPARAM(3); + ed = embryo_program_data_get(ep); + GETSTR(fname, params[2]); + if ((!fname)) return 0; + f = EMBRYO_CELL_TO_FLOAT(params[1]); + len = (double)f; + val = params[3]; + return _edje_var_anim_add(ed, len, fname, val); +} + +/* cancel_anim(id) */ +static Embryo_Cell +_edje_embryo_fn_cancel_anim(Embryo_Program *ep, Embryo_Cell *params) +{ + Edje *ed; + int id; + + CHKPARAM(1); + ed = embryo_program_data_get(ep); + id = params[1]; + if (id <= 0) return 0; + _edje_var_anim_del(ed, id); + return 0; +} -/* ANIMATORS... (run for N seconds, passing in position) - * - * anim(Float:length, fname[], ...) (varargs = series of int's - no strings)) - * cancel_anim(id); - */ /* EDJE... * @@ -385,6 +444,12 @@ _edje_embryo_script_init(Edje *ed) embryo_program_native_call_add(ep, "get_str", _edje_embryo_fn_get_str); embryo_program_native_call_add(ep, "get_strlen", _edje_embryo_fn_get_strlen); embryo_program_native_call_add(ep, "set_str", _edje_embryo_fn_set_str); + + embryo_program_native_call_add(ep, "timer", _edje_embryo_fn_timer); + embryo_program_native_call_add(ep, "cancel_timer", _edje_embryo_fn_cancel_timer); + + embryo_program_native_call_add(ep, "anim", _edje_embryo_fn_anim); + embryo_program_native_call_add(ep, "cancel_anim", _edje_embryo_fn_cancel_anim); embryo_program_native_call_add(ep, "emit", _edje_embryo_fn_emit); embryo_program_native_call_add(ep, "set_state", _edje_embryo_fn_set_state); @@ -418,6 +483,7 @@ _edje_embryo_script_reset(Edje *ed) _edje_embryo_globals_init(ed); } +/* this may change in future - thus "test_run" is its name */ void _edje_embryo_test_run(Edje *ed, char *fname, char *sig, char *src) { diff --git a/legacy/edje/src/lib/edje_misc.c b/legacy/edje/src/lib/edje_misc.c index 576a5f4b7c..cb0dc616f7 100644 --- a/legacy/edje/src/lib/edje_misc.c +++ b/legacy/edje/src/lib/edje_misc.c @@ -1,4 +1,77 @@ #include "Edje.h" #include "edje_private.h" -/* nothing in here yet */ +int +edje_object_variable_id_get(Evas_Object *obj, char *name) +{ + Edje *ed; + int id; + + ed = _edje_fetch(obj); + if ((!ed) || (!name)) return 0; + return _edje_var_string_id_get(ed, name); +} + +int +edje_object_variable_int_get(Evas_Object *obj, int id) +{ + Edje *ed; + + ed = _edje_fetch(obj); + if ((!ed) || (id <= 0)) return 0; + return _edje_var_int_get(ed, id); +} + +void +edje_object_variable_int_set(Evas_Object *obj, int id, int val) +{ + Edje *ed; + + ed = _edje_fetch(obj); + if ((!ed) || (id <= 0)) return; + _edje_var_int_set(ed, id, val); +} + +double +edje_object_variable_float_get(Evas_Object *obj, int id) +{ + Edje *ed; + + ed = _edje_fetch(obj); + if ((!ed) || (id <= 0)) return 0; + return _edje_var_float_get(ed, id); +} + +void +edje_object_variable_float_set(Evas_Object *obj, int id, double val) +{ + Edje *ed; + + ed = _edje_fetch(obj); + if ((!ed) || (id <= 0)) return; + _edje_var_float_set(ed, id, val); +} + +char * +edje_object_variable_str_get(Evas_Object *obj, int id) +{ + Edje *ed; + char *s; + + ed = _edje_fetch(obj); + if ((!ed) || (id <= 0)) return NULL; + s = _edje_var_str_get(ed, id); + if (!s) return NULL; + return strdup(s); +} + +void +edje_object_variable_str_set(Evas_Object *obj, int id, char *str) +{ + Edje *ed; + + ed = _edje_fetch(obj); + if ((!ed) || (id <= 0)) return; + if (!str) str = ""; + _edje_var_str_set(ed, id, str); +} diff --git a/legacy/edje/src/lib/edje_private.h b/legacy/edje/src/lib/edje_private.h index f09ac02960..a2a49cdb04 100644 --- a/legacy/edje/src/lib/edje_private.h +++ b/legacy/edje/src/lib/edje_private.h @@ -60,18 +60,25 @@ extern Evas_List *_edje_animators; extern Edje_Text_Style _edje_text_styles[EDJE_TEXT_EFFECT_LAST]; extern Evas_List *_edje_edjes; -void _edje_embryo_script_init (Edje *ed); -void _edje_embryo_script_shutdown (Edje *ed); -void _edje_embryo_script_reset (Edje *ed); -void _edje_embryo_test_run (Edje *ed, char *fname, char *sig, char *src); -void _edje_var_init (Edje *ed); -void _edje_var_shutdown (Edje *ed); -int _edje_var_string_id_get (Edje *ed, char *string); -int _edje_var_int_get (Edje *ed, int id); -void _edje_var_int_set (Edje *ed, int id, int v); -double _edje_var_float_get (Edje *ed, int id); -void _edje_var_float_set (Edje *ed, int id, double v); -const char *_edje_var_str_get (Edje *ed, int id); -void _edje_var_str_set (Edje *ed, int id, char *str); +void _edje_embryo_script_init (Edje *ed); +void _edje_embryo_script_shutdown (Edje *ed); +void _edje_embryo_script_reset (Edje *ed); +void _edje_embryo_test_run (Edje *ed, char *fname, char *sig, char *src); +void _edje_var_init (Edje *ed); +void _edje_var_shutdown (Edje *ed); +int _edje_var_string_id_get (Edje *ed, char *string); +int _edje_var_int_get (Edje *ed, int id); +void _edje_var_int_set (Edje *ed, int id, int v); +double _edje_var_float_get (Edje *ed, int id); +void _edje_var_float_set (Edje *ed, int id, double v); +const char *_edje_var_str_get (Edje *ed, int id); +void _edje_var_str_set (Edje *ed, int id, char *str); +int _edje_var_timer_add (Edje *ed, double in, char *fname, int val); +void _edje_var_timer_del (Edje *ed, int id); + +int _edje_var_anim_add (Edje *ed, double len, char *fname, int val); +void _edje_var_anim_del (Edje *ed, int id); +void _edje_var_anim_frametime_reset(void); + #endif diff --git a/legacy/edje/src/lib/edje_program.c b/legacy/edje/src/lib/edje_program.c index 700bd25ad3..af4497fb1a 100644 --- a/legacy/edje/src/lib/edje_program.c +++ b/legacy/edje/src/lib/edje_program.c @@ -20,6 +20,7 @@ edje_frametime_set(double t) ecore_timer_del(_edje_timer); _edje_timer = ecore_timer_add(_edje_frametime, _edje_timer_cb, NULL); } + _edje_var_anim_frametime_reset(); } double diff --git a/legacy/edje/src/lib/edje_var.c b/legacy/edje/src/lib/edje_var.c index 52a2500e64..553b84a4ea 100644 --- a/legacy/edje/src/lib/edje_var.c +++ b/legacy/edje/src/lib/edje_var.c @@ -1,6 +1,118 @@ #include "Edje.h" #include "edje_private.h" +static int _edje_var_timer_cb(void *data); +static int _edje_var_anim_cb(void *data); + +static Ecore_Timer *_edje_anim_timer = NULL; +static Evas_List *_edje_anim_list = NULL; + +static int +_edje_var_timer_cb(void *data) +{ + Edje_Var_Timer *et; + Edje *ed; + Embryo_Function fn; + + et = data; + if (!et) return 0; + ed = et->edje; + _edje_embryo_script_reset(ed); + embryo_parameter_cell_push(ed->collection->script, (Embryo_Cell)et->val); + ed->var_pool->timers = evas_list_remove(ed->var_pool->timers, et); + fn = et->func; + free(et); + embryo_program_run(ed->collection->script, fn); + return 0; +} + +static int +_edje_var_anim_cb(void *data) +{ + Evas_List *l, *tl = NULL; + double t; + + t = ecore_time_get(); + for (l = _edje_anim_list; l; l = l->next) + tl = evas_list_append(tl, l->data); + while (tl) + { + Edje *ed; + Evas_List *tl2; + int delete_me = 0; + + ed = tl->data; + _edje_ref(ed); + _edje_block(ed); + _edje_freeze(ed); + tl = evas_list_remove(tl, ed); + if (!ed->var_pool) continue; + tl2 = NULL; + for (l = ed->var_pool->animators; l; l = l->next) + tl2 = evas_list_append(tl2, l->data); + ed->var_pool->walking_list++; + while (tl2) + { + Edje_Var_Animator *ea; + + ea = tl2->data; + if ((ed->var_pool) && (!ea->delete_me)) + { + if ((!ed->paused) && (!ed->delete_me)) + { + Embryo_Function fn; + float v; + + v = (t - ea->start) / ea->len; + if (v > 1.0) v= 1.0; + _edje_embryo_script_reset(ed); + embryo_parameter_cell_push(ed->collection->script, (Embryo_Cell)ea->val); + embryo_parameter_cell_push(ed->collection->script, EMBRYO_FLOAT_TO_CELL(v)); + fn = ea->func; + embryo_program_run(ed->collection->script, fn); + if (v == 1.0) ea->delete_me = 1; + } + } + tl2 = evas_list_remove(tl2, ea); + if (ed->block_break) + { + evas_list_free(tl2); + break; + } + } + ed->var_pool->walking_list--; + for (l = ed->var_pool->animators; l;) + { + Edje_Var_Animator *ea; + + ea = l->data; + if (ea->delete_me) + { + l = l->next; + ed->var_pool->animators = evas_list_remove(ed->var_pool->animators, ea); + free(ea); + } + else + l = l->next; + } + if (!ed->var_pool->animators) + _edje_anim_list = evas_list_remove(_edje_anim_list, ed); + _edje_unblock(ed); + _edje_thaw(ed); + _edje_unref(ed); + } + if (!_edje_anim_list) + { + if (_edje_anim_timer) + { + ecore_timer_del(_edje_anim_timer); + _edje_anim_timer = NULL; + } + } + if (_edje_anim_timer) return 1; + return 0; +} + void _edje_var_init(Edje *ed) { @@ -34,6 +146,35 @@ _edje_var_shutdown(Edje *ed) } free(ed->var_pool->vars); } + while (ed->var_pool->timers) + { + Edje_Var_Timer *et; + + et = ed->var_pool->timers->data; + ecore_timer_del(et->timer); + free(et); + ed->var_pool->timers = evas_list_remove(ed->var_pool->timers, et); + } + if (ed->var_pool->animators) + { + _edje_anim_list = evas_list_remove(_edje_anim_list, ed); + if (!_edje_anim_list) + { + if (_edje_anim_timer) + { + ecore_timer_del(_edje_anim_timer); + _edje_anim_timer = NULL; + } + } + } + while (ed->var_pool->animators) + { + Edje_Var_Animator *ea; + + ea = ed->var_pool->animators->data; + free(ea); + ed->var_pool->animators = evas_list_remove(ed->var_pool->animators, ea); + } free(ed->var_pool); ed->var_pool = NULL; } @@ -248,3 +389,126 @@ _edje_var_str_set(Edje *ed, int id, char *str) ed->var_pool->vars[id].data.s.v = strdup(str); } +int +_edje_var_timer_add(Edje *ed, double in, char *fname, int val) +{ + Edje_Var_Timer *et; + Embryo_Function fn; + + if (!ed->var_pool) return 0; + fn = embryo_program_function_find(ed->collection->script, fname); + if (fn == EMBRYO_FUNCTION_NONE) return 0; + ed->var_pool->id_count++; + et = calloc(1, sizeof(Edje_Var_Timer)); + if (!et) return 0; + et->id = ed->var_pool->id_count; + et->edje = ed; + et->func = fn; + et->val = val; + et->timer = ecore_timer_add(in, _edje_var_timer_cb, et); + if (!et->timer) + { + free(et); + return 0; + } + ed->var_pool->timers = evas_list_prepend(ed->var_pool->timers, et); + return et->id; +} + +void +_edje_var_timer_del(Edje *ed, int id) +{ + Evas_List *l; + + if (!ed->var_pool) return; + for (l = ed->var_pool->timers; l; l = l->next) + { + Edje_Var_Timer *et; + + et = l->data; + if (et->id == id) + { + ed->var_pool->timers = evas_list_remove(ed->var_pool->timers, et); + ecore_timer_del(et->timer); + free(et); + return; + } + } +} + +int +_edje_var_anim_add(Edje *ed, double len, char *fname, int val) +{ + Edje_Var_Animator *ea; + Embryo_Function fn; + + if (!ed->var_pool) return 0; + if (len <= 0.0) return 0; + fn = embryo_program_function_find(ed->collection->script, fname); + if (fn == EMBRYO_FUNCTION_NONE) return 0; + ed->var_pool->id_count++; + ea = calloc(1, sizeof(Edje_Var_Animator)); + if (!ea) return 0; + ea->start = ecore_time_get(); + ea->len = len; + ea->id = ed->var_pool->id_count; + ea->edje = ed; + ea->func = fn; + ea->val = val; + if (!_edje_anim_list) + _edje_anim_list = evas_list_append(_edje_anim_list, ed); + ed->var_pool->animators = evas_list_prepend(ed->var_pool->animators, ea); + if (!_edje_anim_timer) + _edje_anim_timer = ecore_timer_add(edje_frametime_get(), _edje_var_anim_cb, NULL); + return ea->id; +} + +void +_edje_var_anim_del(Edje *ed, int id) +{ + Evas_List *l; + + if (!ed->var_pool) return; + for (l = ed->var_pool->animators; l; l = l->next) + { + Edje_Var_Animator *ea; + + ea = l->data; + if (ea->id == id) + { + if (!ed->var_pool->walking_list) + { + ed->var_pool->animators = evas_list_remove(ed->var_pool->animators, ea); + free(ea); + if (!ed->var_pool->animators) + { + _edje_anim_list = evas_list_remove(_edje_anim_list, ed); + if (!_edje_anim_list) + { + if (_edje_anim_timer) + { + ecore_timer_del(_edje_anim_timer); + _edje_anim_timer = NULL; + } + } + } + } + else + ea->delete_me = 1; + return; + } + } +} + +void +_edje_var_anim_frametime_reset(void) +{ + double ft; + + if (_edje_anim_timer) + { + ft = edje_frametime_get(); + ecore_timer_del(_edje_anim_timer); + _edje_anim_timer = ecore_timer_add(ft, _edje_var_anim_cb, NULL); + } +}