1 #include "edje_private.h"
3 static Eina_Bool _edje_var_timer_cb(void *data);
4 static Eina_Bool _edje_var_anim_cb(void *data);
6 static Ecore_Animator *_edje_animator = NULL;
7 static Eina_List *_edje_anim_list = NULL;
10 _edje_var_timer_cb(void *data)
17 if (!et) return ECORE_CALLBACK_CANCEL;
19 // _edje_embryo_script_reset(ed);
20 embryo_program_vm_push(ed->collection->script);
21 _edje_embryo_globals_init(ed);
22 embryo_parameter_cell_push(ed->collection->script, (Embryo_Cell)et->val);
23 ed->var_pool->timers = eina_list_remove(ed->var_pool->timers, et);
30 pdata = embryo_program_data_get(ed->collection->script);
31 embryo_program_data_set(ed->collection->script, ed);
32 embryo_program_max_cycle_run_set(ed->collection->script, 5000000);
33 ret = embryo_program_run(ed->collection->script, fn);
34 if (ret == EMBRYO_PROGRAM_FAIL)
36 ERR("ERROR with embryo script (timer callback). "
42 embryo_error_string_get(embryo_program_error_get(ed->collection->script)));
44 else if (ret == EMBRYO_PROGRAM_TOOLONG)
46 ERR("ERROR with embryo script (timer callback). "
49 "ERROR: 'Script exceeded maximum allowed cycle count of %i'",
52 embryo_program_max_cycle_run_get(ed->collection->script));
54 embryo_program_data_set(ed->collection->script, pdata);
55 embryo_program_vm_pop(ed->collection->script);
58 return ECORE_CALLBACK_CANCEL;
62 _edje_var_anim_cb(void *data __UNUSED__)
64 Eina_List *l, *tl = NULL;
68 t = ecore_loop_time_get();
69 EINA_LIST_FOREACH(_edje_anim_list, l, tmp)
70 tl = eina_list_append(tl, tmp);
75 Edje_Var_Animator *ea;
77 ed = eina_list_data_get(tl);
81 tl = eina_list_remove(tl, ed);
82 if (!ed->var_pool) continue;
84 EINA_LIST_FOREACH(ed->var_pool->animators, l, tmp)
85 tl2 = eina_list_append(tl2, tmp);
86 ed->var_pool->walking_list++;
89 ea = eina_list_data_get(tl2);
90 if ((ed->var_pool) && (!ea->delete_me))
92 if ((!ed->paused) && (!ed->delete_me))
98 v = (t - ea->start) / ea->len;
100 // _edje_embryo_script_reset(ed);
101 embryo_program_vm_push(ed->collection->script);
102 _edje_embryo_globals_init(ed);
103 embryo_parameter_cell_push(ed->collection->script, (Embryo_Cell)ea->val);
104 embryo_parameter_cell_push(ed->collection->script, EMBRYO_FLOAT_TO_CELL(v));
109 pdata = embryo_program_data_get(ed->collection->script);
110 embryo_program_data_set(ed->collection->script, ed);
111 embryo_program_max_cycle_run_set(ed->collection->script, 5000000);
112 ret = embryo_program_run(ed->collection->script, fn);
113 if (ret == EMBRYO_PROGRAM_FAIL)
115 ERR("ERROR with embryo script (anim callback). "
116 "OBJECT NAME: '%s', "
117 "OBJECT FILE: '%s', "
119 ed->collection->part,
121 embryo_error_string_get(embryo_program_error_get(ed->collection->script)));
123 else if (ret == EMBRYO_PROGRAM_TOOLONG)
125 ERR("ERROR with embryo script (anim callback). "
126 "OBJECT NAME: '%s', "
127 "OBJECT FILE: '%s', "
128 "ERROR: 'Script exceeded maximum allowed cycle count of %i'",
129 ed->collection->part,
131 embryo_program_max_cycle_run_get(ed->collection->script));
133 embryo_program_data_set(ed->collection->script, pdata);
134 embryo_program_vm_pop(ed->collection->script);
137 if (v == 1.0) ea->delete_me = 1;
140 tl2 = eina_list_remove(tl2, ea);
147 ed->var_pool->walking_list--;
148 EINA_LIST_FOREACH(ed->var_pool->animators, l, ea)
152 l = eina_list_next(l);
153 ed->var_pool->animators = eina_list_remove(ed->var_pool->animators, ea);
157 l = eina_list_next(l);
159 if (!ed->var_pool->animators)
160 _edje_anim_list = eina_list_remove(_edje_anim_list, ed);
165 if (!_edje_anim_list)
169 ecore_animator_del(_edje_animator);
170 _edje_animator = NULL;
173 return !!_edje_animator;
179 return calloc(1, sizeof(Edje_Var));
183 _edje_var_free(Edje_Var *var)
185 if (var->type == EDJE_VAR_STRING)
196 _edje_var_init(Edje *ed)
199 if (!ed->collection) return;
200 if (!ed->collection->script) return;
201 if (ed->var_pool) return;
202 ed->var_pool = calloc(1, sizeof(Edje_Var_Pool));
203 if (!ed->var_pool) return;
204 embryo_program_vm_push(ed->collection->script);
205 ed->var_pool->size = embryo_program_variable_count_get(ed->collection->script);
206 embryo_program_vm_pop(ed->collection->script);
207 if (ed->var_pool->size > 0)
208 ed->var_pool->vars = calloc(1, sizeof(Edje_Var) * ed->var_pool->size);
212 _edje_var_shutdown(Edje *ed)
214 if (!ed->var_pool) return;
215 if (ed->var_pool->vars)
219 for (i = 0; i < ed->var_pool->size; i++)
221 if (ed->var_pool->vars[i].type == EDJE_VAR_STRING)
223 if (ed->var_pool->vars[i].data.s.v)
225 free(ed->var_pool->vars[i].data.s.v);
226 ed->var_pool->vars[i].data.s.v = NULL;
229 else if (ed->var_pool->vars[i].type == EDJE_VAR_LIST)
231 while (ed->var_pool->vars[i].data.l.v)
233 _edje_var_free(eina_list_data_get(ed->var_pool->vars[i].data.l.v));
234 ed->var_pool->vars[i].data.l.v = eina_list_remove_list(ed->var_pool->vars[i].data.l.v, ed->var_pool->vars[i].data.l.v);
238 free(ed->var_pool->vars);
240 while (ed->var_pool->timers)
244 et = eina_list_data_get(ed->var_pool->timers);
245 ecore_timer_del(et->timer);
247 ed->var_pool->timers = eina_list_remove(ed->var_pool->timers, et);
249 if (ed->var_pool->animators)
251 _edje_anim_list = eina_list_remove(_edje_anim_list, ed);
252 if (!_edje_anim_list)
256 ecore_animator_del(_edje_animator);
257 _edje_animator = NULL;
261 while (ed->var_pool->animators)
263 Edje_Var_Animator *ea;
265 ea = eina_list_data_get(ed->var_pool->animators);
267 ed->var_pool->animators = eina_list_remove(ed->var_pool->animators, ea);
274 _edje_var_string_id_get(Edje *ed, const char *string)
276 Embryo_Cell cell, *cptr;
279 if (!ed->collection) return 0;
280 if (!ed->collection->script) return 0;
281 if (!string) return 0;
282 cell = embryo_program_variable_find(ed->collection->script, (char *)string);
283 if (cell == EMBRYO_CELL_NONE) return 0;
284 cptr = embryo_data_address_get(ed->collection->script, cell);
290 _edje_var_var_int_get(Edje *ed __UNUSED__, Edje_Var *var)
293 if (var->type == EDJE_VAR_STRING)
299 f = atof(var->data.s.v);
301 var->data.s.v = NULL;
302 var->data.i.v = (int)f;
304 var->type = EDJE_VAR_INT;
306 else if (var->type == EDJE_VAR_FLOAT)
308 var->data.i.v = (int)(var->data.f.v);
309 var->type = EDJE_VAR_INT;
311 else if (var->type == EDJE_VAR_NONE)
313 var->type = EDJE_VAR_INT;
315 else if (var->type == EDJE_VAR_LIST)
319 else if (var->type == EDJE_VAR_HASH)
323 return var->data.i.v;
327 _edje_var_var_int_set(Edje *ed __UNUSED__, Edje_Var *var, int v)
330 if (var->type == EDJE_VAR_STRING)
335 var->data.s.v = NULL;
337 var->type = EDJE_VAR_INT;
339 else if (var->type == EDJE_VAR_FLOAT)
341 var->type = EDJE_VAR_INT;
343 else if (var->type == EDJE_VAR_NONE)
345 var->type = EDJE_VAR_INT;
347 else if (var->type == EDJE_VAR_LIST)
351 else if (var->type == EDJE_VAR_HASH)
359 _edje_var_var_float_get(Edje *ed __UNUSED__, Edje_Var *var)
362 if (var->type == EDJE_VAR_STRING)
368 f = atof(var->data.s.v);
370 var->data.s.v = NULL;
373 var->type = EDJE_VAR_FLOAT;
375 else if (var->type == EDJE_VAR_INT)
377 var->data.f.v = (double)(var->data.i.v);
378 var->type = EDJE_VAR_FLOAT;
380 else if (var->type == EDJE_VAR_NONE)
382 var->type = EDJE_VAR_FLOAT;
384 else if (var->type == EDJE_VAR_LIST)
388 else if (var->type == EDJE_VAR_HASH)
392 return var->data.f.v;
396 _edje_var_var_float_set(Edje *ed __UNUSED__, Edje_Var *var, double v)
399 if (var->type == EDJE_VAR_STRING)
404 var->data.s.v = NULL;
406 var->type = EDJE_VAR_FLOAT;
408 else if (var->type == EDJE_VAR_INT)
411 var->type = EDJE_VAR_FLOAT;
413 else if (var->type == EDJE_VAR_NONE)
415 var->type = EDJE_VAR_FLOAT;
417 else if (var->type == EDJE_VAR_LIST)
421 else if (var->type == EDJE_VAR_HASH)
429 _edje_var_var_str_get(Edje *ed __UNUSED__, Edje_Var *var)
432 if (var->type == EDJE_VAR_INT)
436 snprintf(buf, sizeof(buf), "%i", var->data.i.v);
437 var->data.s.v = strdup(buf);
438 var->type = EDJE_VAR_STRING;
440 else if (var->type == EDJE_VAR_FLOAT)
444 snprintf(buf, sizeof(buf), "%f", var->data.f.v);
445 var->data.s.v = strdup(buf);
446 var->type = EDJE_VAR_STRING;
448 else if (var->type == EDJE_VAR_NONE)
450 var->data.s.v = strdup("");
451 var->type = EDJE_VAR_STRING;
453 else if (var->type == EDJE_VAR_LIST)
457 else if (var->type == EDJE_VAR_HASH)
461 return var->data.s.v;
465 _edje_var_var_str_set(Edje *ed __UNUSED__, Edje_Var *var, const char *str)
468 if (var->type == EDJE_VAR_STRING)
473 var->data.s.v = NULL;
476 else if (var->type == EDJE_VAR_INT)
478 var->type = EDJE_VAR_STRING;
480 else if (var->type == EDJE_VAR_FLOAT)
482 var->type = EDJE_VAR_STRING;
484 else if (var->type == EDJE_VAR_NONE)
486 var->type = EDJE_VAR_STRING;
488 else if (var->type == EDJE_VAR_LIST)
492 else if (var->type == EDJE_VAR_HASH)
496 var->data.s.v = strdup(str);
500 _edje_var_int_get(Edje *ed, int id)
503 if (!ed->var_pool) return 0;
504 id -= EDJE_VAR_MAGIC_BASE;
505 if ((id < 0) || (id >= ed->var_pool->size)) return 0;
506 return _edje_var_var_int_get(ed, &(ed->var_pool->vars[id]));
510 _edje_var_int_set(Edje *ed, int id, int v)
513 if (!ed->var_pool) return;
514 id -= EDJE_VAR_MAGIC_BASE;
515 if ((id < 0) || (id >= ed->var_pool->size)) return;
516 _edje_var_var_int_set(ed, &(ed->var_pool->vars[id]), v);
520 _edje_var_float_get(Edje *ed, int id)
523 if (!ed->var_pool) return 0;
524 id -= EDJE_VAR_MAGIC_BASE;
525 if ((id < 0) || (id >= ed->var_pool->size)) return 0;
526 return _edje_var_var_float_get(ed, &(ed->var_pool->vars[id]));
530 _edje_var_float_set(Edje *ed, int id, double v)
533 if (!ed->var_pool) return;
534 id -= EDJE_VAR_MAGIC_BASE;
535 if ((id < 0) || (id >= ed->var_pool->size)) return;
536 _edje_var_var_float_set(ed, &(ed->var_pool->vars[id]), v);
540 _edje_var_str_get(Edje *ed, int id)
542 if (!ed) return NULL;
543 if (!ed->var_pool) return NULL;
544 id -= EDJE_VAR_MAGIC_BASE;
545 if ((id < 0) || (id >= ed->var_pool->size)) return NULL;
546 return _edje_var_var_str_get(ed, &(ed->var_pool->vars[id]));
550 _edje_var_str_set(Edje *ed, int id, const char *str)
553 if (!ed->var_pool) return;
555 id -= EDJE_VAR_MAGIC_BASE;
556 if ((id < 0) || (id >= ed->var_pool->size)) return;
557 _edje_var_var_str_set(ed, &(ed->var_pool->vars[id]), str);
563 _edje_var_list_var_append(Edje *ed, int id, Edje_Var *var)
566 if (!ed->var_pool) return;
567 id -= EDJE_VAR_MAGIC_BASE;
568 if ((id < 0) || (id >= ed->var_pool->size)) return;
569 if (ed->var_pool->vars[id].type != EDJE_VAR_LIST) return;
570 ed->var_pool->vars[id].data.l.v = eina_list_append(ed->var_pool->vars[id].data.l.v, var);
574 _edje_var_list_var_prepend(Edje *ed, int id, Edje_Var *var)
577 if (!ed->var_pool) return;
578 id -= EDJE_VAR_MAGIC_BASE;
579 if ((id < 0) || (id >= ed->var_pool->size)) return;
580 if (ed->var_pool->vars[id].type != EDJE_VAR_LIST) return;
581 ed->var_pool->vars[id].data.l.v = eina_list_prepend(ed->var_pool->vars[id].data.l.v, var);
585 _edje_var_list_var_append_relative(Edje *ed, int id, Edje_Var *var, Edje_Var *relative)
588 if (!ed->var_pool) return;
589 id -= EDJE_VAR_MAGIC_BASE;
590 if ((id < 0) || (id >= ed->var_pool->size)) return;
591 if (ed->var_pool->vars[id].type != EDJE_VAR_LIST) return;
592 ed->var_pool->vars[id].data.l.v = eina_list_append_relative(ed->var_pool->vars[id].data.l.v, var, relative);
596 _edje_var_list_var_prepend_relative(Edje *ed, int id, Edje_Var *var, Edje_Var *relative)
599 if (!ed->var_pool) return;
600 id -= EDJE_VAR_MAGIC_BASE;
601 if ((id < 0) || (id >= ed->var_pool->size)) return;
602 if (ed->var_pool->vars[id].type != EDJE_VAR_LIST) return;
603 ed->var_pool->vars[id].data.l.v = eina_list_prepend_relative(ed->var_pool->vars[id].data.l.v, var, relative);
607 _edje_var_list_nth(Edje *ed, int id, int n)
609 if (!ed) return NULL;
610 if (!ed->var_pool) return NULL;
611 id -= EDJE_VAR_MAGIC_BASE;
612 if ((id < 0) || (id >= ed->var_pool->size)) return NULL;
613 if (ed->var_pool->vars[id].type != EDJE_VAR_LIST) return NULL;
614 return eina_list_nth(ed->var_pool->vars[id].data.l.v, n);
618 _edje_var_list_count_get(Edje *ed, int id)
621 if (!ed->var_pool) return 0;
622 id -= EDJE_VAR_MAGIC_BASE;
623 if ((id < 0) || (id >= ed->var_pool->size)) return 0;
624 if (ed->var_pool->vars[id].type == EDJE_VAR_NONE)
625 ed->var_pool->vars[id].type = EDJE_VAR_LIST;
626 else if (ed->var_pool->vars[id].type != EDJE_VAR_LIST) return 0;
627 return eina_list_count(ed->var_pool->vars[id].data.l.v);
631 _edje_var_list_remove_nth(Edje *ed, int id, int n)
634 if (!ed->var_pool) return;
635 id -= EDJE_VAR_MAGIC_BASE;
636 if ((id < 0) || (id >= ed->var_pool->size)) return;
637 if (ed->var_pool->vars[id].type == EDJE_VAR_NONE)
638 ed->var_pool->vars[id].type = EDJE_VAR_LIST;
639 else if (ed->var_pool->vars[id].type != EDJE_VAR_LIST) return;
643 nth = eina_list_nth_list(ed->var_pool->vars[id].data.l.v, n);
646 _edje_var_free(eina_list_data_get(nth));
647 ed->var_pool->vars[id].data.l.v = eina_list_remove_list(ed->var_pool->vars[id].data.l.v, nth);
653 _edje_var_list_nth_int_get(Edje *ed, int id, int n)
656 if (!ed->var_pool) return 0;
657 id -= EDJE_VAR_MAGIC_BASE;
658 if ((id < 0) || (id >= ed->var_pool->size)) return 0;
659 if (ed->var_pool->vars[id].type == EDJE_VAR_NONE)
660 ed->var_pool->vars[id].type = EDJE_VAR_LIST;
661 else if (ed->var_pool->vars[id].type != EDJE_VAR_LIST) return 0;
665 id += EDJE_VAR_MAGIC_BASE;
666 var = _edje_var_list_nth(ed, id, n);
668 return _edje_var_var_int_get(ed, var);
673 _edje_var_list_nth_int_set(Edje *ed, int id, int n, int v)
676 if (!ed->var_pool) return;
677 id -= EDJE_VAR_MAGIC_BASE;
678 if ((id < 0) || (id >= ed->var_pool->size)) return;
679 if (ed->var_pool->vars[id].type == EDJE_VAR_NONE)
680 ed->var_pool->vars[id].type = EDJE_VAR_LIST;
681 else if (ed->var_pool->vars[id].type != EDJE_VAR_LIST) return;
685 id += EDJE_VAR_MAGIC_BASE;
686 var = _edje_var_list_nth(ed, id, n);
688 _edje_var_var_int_set(ed, var, v);
693 _edje_var_list_int_append(Edje *ed, int id, int v)
696 if (!ed->var_pool) return;
697 id -= EDJE_VAR_MAGIC_BASE;
698 if ((id < 0) || (id >= ed->var_pool->size)) return;
699 if (ed->var_pool->vars[id].type == EDJE_VAR_NONE)
700 ed->var_pool->vars[id].type = EDJE_VAR_LIST;
701 else if (ed->var_pool->vars[id].type != EDJE_VAR_LIST) return;
705 var = _edje_var_new();
707 id += EDJE_VAR_MAGIC_BASE;
708 _edje_var_var_int_set(ed, var, v);
709 _edje_var_list_var_append(ed, id, var);
714 _edje_var_list_int_prepend(Edje *ed, int id, int v)
717 if (!ed->var_pool) return;
718 id -= EDJE_VAR_MAGIC_BASE;
719 if ((id < 0) || (id >= ed->var_pool->size)) return;
720 if (ed->var_pool->vars[id].type == EDJE_VAR_NONE)
721 ed->var_pool->vars[id].type = EDJE_VAR_LIST;
722 else if (ed->var_pool->vars[id].type != EDJE_VAR_LIST) return;
726 var = _edje_var_new();
728 id += EDJE_VAR_MAGIC_BASE;
729 _edje_var_var_int_set(ed, var, v);
730 _edje_var_list_var_prepend(ed, id, var);
735 _edje_var_list_int_insert(Edje *ed, int id, int n, int v)
738 if (!ed->var_pool) return;
739 id -= EDJE_VAR_MAGIC_BASE;
740 if ((id < 0) || (id >= ed->var_pool->size)) return;
741 if (ed->var_pool->vars[id].type == EDJE_VAR_NONE)
742 ed->var_pool->vars[id].type = EDJE_VAR_LIST;
743 else if (ed->var_pool->vars[id].type != EDJE_VAR_LIST) return;
745 Edje_Var *var, *var_rel;
747 var = _edje_var_new();
749 id += EDJE_VAR_MAGIC_BASE;
750 _edje_var_var_int_set(ed, var, v);
751 var_rel = _edje_var_list_nth(ed, id, n);
753 _edje_var_list_var_append(ed, id, var);
755 _edje_var_list_var_prepend_relative(ed, id, var, var_rel);
760 _edje_var_list_nth_float_get(Edje *ed, int id, int n)
763 if (!ed->var_pool) return 0;
764 id -= EDJE_VAR_MAGIC_BASE;
765 if ((id < 0) || (id >= ed->var_pool->size)) return 0;
766 if (ed->var_pool->vars[id].type == EDJE_VAR_NONE)
767 ed->var_pool->vars[id].type = EDJE_VAR_LIST;
768 else if (ed->var_pool->vars[id].type != EDJE_VAR_LIST) return 0;
772 id += EDJE_VAR_MAGIC_BASE;
773 var = _edje_var_list_nth(ed, id, n);
775 return _edje_var_var_float_get(ed, var);
780 _edje_var_list_nth_float_set(Edje *ed, int id, int n, double v)
783 if (!ed->var_pool) return;
784 id -= EDJE_VAR_MAGIC_BASE;
785 if ((id < 0) || (id >= ed->var_pool->size)) return;
786 if (ed->var_pool->vars[id].type == EDJE_VAR_NONE)
787 ed->var_pool->vars[id].type = EDJE_VAR_LIST;
788 else if (ed->var_pool->vars[id].type != EDJE_VAR_LIST) return;
792 id += EDJE_VAR_MAGIC_BASE;
793 var = _edje_var_list_nth(ed, id, n);
795 _edje_var_var_float_set(ed, var, v);
800 _edje_var_list_float_append(Edje *ed, int id, double v)
803 if (!ed->var_pool) return;
804 id -= EDJE_VAR_MAGIC_BASE;
805 if ((id < 0) || (id >= ed->var_pool->size)) return;
806 if (ed->var_pool->vars[id].type == EDJE_VAR_NONE)
807 ed->var_pool->vars[id].type = EDJE_VAR_LIST;
808 else if (ed->var_pool->vars[id].type != EDJE_VAR_LIST) return;
812 var = _edje_var_new();
814 id += EDJE_VAR_MAGIC_BASE;
815 _edje_var_var_float_set(ed, var, v);
816 _edje_var_list_var_append(ed, id, var);
821 _edje_var_list_float_prepend(Edje *ed, int id, double v)
824 if (!ed->var_pool) return;
825 id -= EDJE_VAR_MAGIC_BASE;
826 if ((id < 0) || (id >= ed->var_pool->size)) return;
827 if (ed->var_pool->vars[id].type == EDJE_VAR_NONE)
828 ed->var_pool->vars[id].type = EDJE_VAR_LIST;
829 else if (ed->var_pool->vars[id].type != EDJE_VAR_LIST) return;
833 var = _edje_var_new();
835 id += EDJE_VAR_MAGIC_BASE;
836 _edje_var_var_float_set(ed, var, v);
837 _edje_var_list_var_prepend(ed, id, var);
842 _edje_var_list_float_insert(Edje *ed, int id, int n, double v)
845 if (!ed->var_pool) return;
846 id -= EDJE_VAR_MAGIC_BASE;
847 if ((id < 0) || (id >= ed->var_pool->size)) return;
848 if (ed->var_pool->vars[id].type == EDJE_VAR_NONE)
849 ed->var_pool->vars[id].type = EDJE_VAR_LIST;
850 else if (ed->var_pool->vars[id].type != EDJE_VAR_LIST) return;
852 Edje_Var *var, *var_rel;
854 var = _edje_var_new();
856 id += EDJE_VAR_MAGIC_BASE;
857 _edje_var_var_float_set(ed, var, v);
858 var_rel = _edje_var_list_nth(ed, id, n);
860 _edje_var_list_var_append(ed, id, var);
862 _edje_var_list_var_prepend_relative(ed, id, var, var_rel);
867 _edje_var_list_nth_str_get(Edje *ed, int id, int n)
869 if (!ed) return NULL;
870 if (!ed->var_pool) return NULL;
871 id -= EDJE_VAR_MAGIC_BASE;
872 if ((id < 0) || (id >= ed->var_pool->size)) return NULL;
873 if (ed->var_pool->vars[id].type == EDJE_VAR_NONE)
874 ed->var_pool->vars[id].type = EDJE_VAR_LIST;
875 else if (ed->var_pool->vars[id].type != EDJE_VAR_LIST) return NULL;
879 id += EDJE_VAR_MAGIC_BASE;
880 var = _edje_var_list_nth(ed, id, n);
881 if (!var) return NULL;
882 return _edje_var_var_str_get(ed, var);
887 _edje_var_list_nth_str_set(Edje *ed, int id, int n, const char *v)
890 if (!ed->var_pool) return;
891 id -= EDJE_VAR_MAGIC_BASE;
892 if ((id < 0) || (id >= ed->var_pool->size)) return;
893 if (ed->var_pool->vars[id].type == EDJE_VAR_NONE)
894 ed->var_pool->vars[id].type = EDJE_VAR_LIST;
895 else if (ed->var_pool->vars[id].type != EDJE_VAR_LIST) return;
899 id += EDJE_VAR_MAGIC_BASE;
900 var = _edje_var_list_nth(ed, id, n);
902 _edje_var_var_str_set(ed, var, v);
907 _edje_var_list_str_append(Edje *ed, int id, const char *v)
910 if (!ed->var_pool) return;
911 id -= EDJE_VAR_MAGIC_BASE;
912 if ((id < 0) || (id >= ed->var_pool->size)) return;
913 if (ed->var_pool->vars[id].type == EDJE_VAR_NONE)
914 ed->var_pool->vars[id].type = EDJE_VAR_LIST;
915 else if (ed->var_pool->vars[id].type != EDJE_VAR_LIST) return;
919 var = _edje_var_new();
921 id += EDJE_VAR_MAGIC_BASE;
922 _edje_var_var_str_set(ed, var, v);
923 _edje_var_list_var_append(ed, id, var);
928 _edje_var_list_str_prepend(Edje *ed, int id, const char *v)
931 if (!ed->var_pool) return;
932 id -= EDJE_VAR_MAGIC_BASE;
933 if ((id < 0) || (id >= ed->var_pool->size)) return;
934 if (ed->var_pool->vars[id].type == EDJE_VAR_NONE)
935 ed->var_pool->vars[id].type = EDJE_VAR_LIST;
936 else if (ed->var_pool->vars[id].type != EDJE_VAR_LIST) return;
940 var = _edje_var_new();
942 id += EDJE_VAR_MAGIC_BASE;
943 _edje_var_var_str_set(ed, var, v);
944 _edje_var_list_var_prepend(ed, id, var);
949 _edje_var_list_str_insert(Edje *ed, int id, int n, const char *v)
952 if (!ed->var_pool) return;
953 id -= EDJE_VAR_MAGIC_BASE;
954 if ((id < 0) || (id >= ed->var_pool->size)) return;
955 if (ed->var_pool->vars[id].type == EDJE_VAR_NONE)
956 ed->var_pool->vars[id].type = EDJE_VAR_LIST;
957 else if (ed->var_pool->vars[id].type != EDJE_VAR_LIST) return;
959 Edje_Var *var, *var_rel;
961 var = _edje_var_new();
963 id += EDJE_VAR_MAGIC_BASE;
964 _edje_var_var_str_set(ed, var, v);
965 var_rel = _edje_var_list_nth(ed, id, n);
967 _edje_var_list_var_append(ed, id, var);
969 _edje_var_list_var_prepend_relative(ed, id, var, var_rel);
974 _edje_var_timer_add(Edje *ed, double in, const char *fname, int val)
979 if (!ed->var_pool) return 0;
980 fn = embryo_program_function_find(ed->collection->script, (char *)fname);
981 if (fn == EMBRYO_FUNCTION_NONE) return 0;
982 et = calloc(1, sizeof(Edje_Var_Timer));
984 et->id = ++ed->var_pool->id_count;
988 et->timer = ecore_timer_add(in, _edje_var_timer_cb, et);
994 ed->var_pool->timers = eina_list_prepend(ed->var_pool->timers, et);
998 static Edje_Var_Timer *
999 _edje_var_timer_find(Edje *ed, int id)
1004 if (!ed->var_pool) return NULL;
1006 EINA_LIST_FOREACH(ed->var_pool->timers, l, et)
1007 if (et->id == id) return et;
1013 _edje_var_timer_del(Edje *ed, int id)
1017 et = _edje_var_timer_find(ed, id);
1020 ed->var_pool->timers = eina_list_remove(ed->var_pool->timers, et);
1021 ecore_timer_del(et->timer);
1026 _edje_var_anim_add(Edje *ed, double len, const char *fname, int val)
1028 Edje_Var_Animator *ea;
1031 if (!ed->var_pool) return 0;
1032 if (len <= 0.0) return 0;
1033 fn = embryo_program_function_find(ed->collection->script, (char *)fname);
1034 if (fn == EMBRYO_FUNCTION_NONE) return 0;
1035 ea = calloc(1, sizeof(Edje_Var_Animator));
1037 ea->start = ecore_loop_time_get();
1039 ea->id = ++ed->var_pool->id_count;
1043 if (!ed->var_pool->animators)
1044 _edje_anim_list = eina_list_append(_edje_anim_list, ed);
1045 ed->var_pool->animators = eina_list_prepend(ed->var_pool->animators, ea);
1046 if (!_edje_animator)
1047 _edje_animator = ecore_animator_add(_edje_var_anim_cb, NULL);
1051 static Edje_Var_Animator *
1052 _edje_var_anim_find(Edje *ed, int id)
1055 Edje_Var_Animator *ea;
1057 if (!ed->var_pool) return NULL;
1059 EINA_LIST_FOREACH(ed->var_pool->animators, l, ea)
1060 if (ea->id == id) return ea;
1066 _edje_var_anim_del(Edje *ed, int id)
1068 Edje_Var_Animator *ea;
1070 ea = _edje_var_anim_find(ed, id);
1073 if (ed->var_pool->walking_list)
1079 ed->var_pool->animators = eina_list_remove(ed->var_pool->animators, ea);
1082 if (ed->var_pool->animators) return;
1084 _edje_anim_list = eina_list_remove(_edje_anim_list, ed);
1085 if (!_edje_anim_list)
1089 ecore_animator_del(_edje_animator);
1090 _edje_animator = NULL;