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

Reply via email to