Enlightenment CVS committal
Author : raster
Project : e17
Module : libs/edje
Dir : e17/libs/edje/src/lib
Modified Files:
Edje.h Edje_Edit.h edje_embryo.c edje_misc.c edje_private.h
edje_program.c edje_var.c
Log Message:
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...
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/edje/src/lib/Edje.h,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -3 -r1.26 -r1.27
--- Edje.h 8 Mar 2004 02:43:48 -0000 1.26
+++ Edje.h 2 Apr 2004 09:16:52 -0000 1.27
@@ -76,6 +76,13 @@
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
}
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/edje/src/lib/Edje_Edit.h,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -3 -r1.7 -r1.8
--- Edje_Edit.h 1 Apr 2004 15:32:17 -0000 1.7
+++ Edje_Edit.h 2 Apr 2004 09:16:52 -0000 1.8
@@ -382,6 +382,8 @@
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 @@
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 @@
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
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/edje/src/lib/edje_embryo.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -3 -r1.8 -r1.9
--- edje_embryo.c 2 Apr 2004 03:55:38 -0000 1.8
+++ edje_embryo.c 2 Apr 2004 09:16:53 -0000 1.9
@@ -169,17 +169,76 @@
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 @@
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_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)
{
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/edje/src/lib/edje_misc.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -3 -r1.1 -r1.2
--- edje_misc.c 1 Apr 2004 15:32:17 -0000 1.1
+++ edje_misc.c 2 Apr 2004 09:16:53 -0000 1.2
@@ -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);
+}
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/edje/src/lib/edje_private.h,v
retrieving revision 1.63
retrieving revision 1.64
diff -u -3 -r1.63 -r1.64
--- edje_private.h 2 Apr 2004 00:16:21 -0000 1.63
+++ edje_private.h 2 Apr 2004 09:16:53 -0000 1.64
@@ -60,18 +60,25 @@
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
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/edje/src/lib/edje_program.c,v
retrieving revision 1.32
retrieving revision 1.33
diff -u -3 -r1.32 -r1.33
--- edje_program.c 1 Apr 2004 15:32:17 -0000 1.32
+++ edje_program.c 2 Apr 2004 09:16:53 -0000 1.33
@@ -20,6 +20,7 @@
ecore_timer_del(_edje_timer);
_edje_timer = ecore_timer_add(_edje_frametime, _edje_timer_cb, NULL);
}
+ _edje_var_anim_frametime_reset();
}
double
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/edje/src/lib/edje_var.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -3 -r1.1 -r1.2
--- edje_var.c 30 Mar 2004 10:30:35 -0000 1.1
+++ edje_var.c 2 Apr 2004 09:16:53 -0000 1.2
@@ -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 @@
}
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 @@
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);
+ }
+}
-------------------------------------------------------
This SF.Net email is sponsored by: IBM Linux Tutorials
Free Linux tutorial presented by Daniel Robbins, President and CEO of
GenToo technologies. Learn everything from fundamentals to system
administration.http://ads.osdn.com/?ad_id=1470&alloc_id=3638&op=click
_______________________________________________
enlightenment-cvs mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs