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
This commit is contained in:
Carsten Haitzler 2004-04-02 09:16:53 +00:00
parent 3c73786007
commit d22c821b4a
9 changed files with 497 additions and 27 deletions

View File

@ -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:
*

View File

@ -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 {

View File

@ -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
}

View File

@ -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

View File

@ -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)
{

View File

@ -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);
}

View File

@ -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

View File

@ -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

View File

@ -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);
}
}