1 #include "edje_private.h"
3 static void _edje_emit_cb(Edje *ed, const char *sig, const char *src, Edje_Message_Signal_Data *data, Eina_Bool prop);
4 static void _edje_param_copy(Edje_Real_Part *src_part, const char *src_param, Edje_Real_Part *dst_part, const char *dst_param);
5 static void _edje_param_set(Edje_Real_Part *part, const char *param, const char *value);
7 int _edje_anim_count = 0;
8 Ecore_Animator *_edje_timer = NULL;
9 Eina_List *_edje_animators = NULL;
11 /*============================================================================*
13 *============================================================================*/
16 edje_frametime_set(double t)
18 ecore_animator_frametime_set(t);
22 edje_frametime_get(void)
24 return ecore_animator_frametime_get();
28 edje_object_propagate_callback_add(Evas_Object *obj, void (*func)(void *data, Evas_Object *o, const char *emission, const char *source), void *data)
31 Edje_Signal_Callback *escb;
33 ed = _edje_fetch(obj);
35 if (ed->delete_me) return;
36 escb = calloc(1, sizeof(Edje_Signal_Callback));
37 escb->propagate = EINA_TRUE;
38 escb->signal = eina_stringshare_add("*");
39 escb->source = eina_stringshare_add("*");
42 ed->callbacks = eina_list_append(ed->callbacks, escb);
43 if (ed->walking_callbacks)
46 ed->just_added_callbacks = 1;
49 _edje_callbacks_patterns_clean(ed);
53 edje_object_signal_callback_add(Evas_Object *obj, const char *emission, const char *source, void (*func)(void *data, Evas_Object *o, const char *emission, const char *source), void *data)
56 Edje_Signal_Callback *escb;
58 if ((!emission) || (!source) || (!func)) return;
59 ed = _edje_fetch(obj);
61 if (ed->delete_me) return;
62 escb = calloc(1, sizeof(Edje_Signal_Callback));
64 escb->signal = eina_stringshare_add(emission);
66 escb->source = eina_stringshare_add(source);
69 ed->callbacks = eina_list_append(ed->callbacks, escb);
70 if (ed->walking_callbacks)
73 ed->just_added_callbacks = 1;
76 _edje_callbacks_patterns_clean(ed);
80 edje_object_signal_callback_del(Evas_Object *obj, const char *emission, const char *source, void (*func)(void *data, Evas_Object *o, const char *emission, const char *source))
84 Edje_Signal_Callback *escb;
86 if ((!emission) || (!source) || (!func)) return NULL;
87 ed = _edje_fetch(obj);
89 if (ed->delete_me) return NULL;
90 EINA_LIST_FOREACH(ed->callbacks, l, escb)
92 if ((escb->func == func) &&
93 ((!escb->signal && !emission[0]) ||
94 (escb->signal && !strcmp(escb->signal, emission))) &&
95 ((!escb->source && !source[0]) ||
96 (escb->source && !strcmp(escb->source, source))))
101 if (ed->walking_callbacks)
104 ed->delete_callbacks = 1;
108 _edje_callbacks_patterns_clean(ed);
110 ed->callbacks = eina_list_remove_list(ed->callbacks, l);
111 if (escb->signal) eina_stringshare_del(escb->signal);
112 if (escb->source) eina_stringshare_del(escb->source);
122 edje_object_signal_callback_del_full(Evas_Object *obj, const char *emission, const char *source, Edje_Signal_Cb func, void *data)
126 Edje_Signal_Callback *escb;
128 if ((!emission) || (!source) || (!func)) return NULL;
129 ed = _edje_fetch(obj);
130 if (!ed) return NULL;
131 if (ed->delete_me) return NULL;
132 EINA_LIST_FOREACH(ed->callbacks, l, escb)
134 if ((escb->func == func) && (escb->data == data) &&
135 ((!escb->signal && !emission[0]) ||
136 (escb->signal && !strcmp(escb->signal, emission))) &&
137 ((!escb->source && !source[0]) ||
138 (escb->source && !strcmp(escb->source, source))))
143 if (ed->walking_callbacks)
146 ed->delete_callbacks = 1;
150 _edje_callbacks_patterns_clean(ed);
152 ed->callbacks = eina_list_remove_list(ed->callbacks, l);
153 if (escb->signal) eina_stringshare_del(escb->signal);
154 if (escb->source) eina_stringshare_del(escb->source);
164 edje_object_signal_emit(Evas_Object *obj, const char *emission, const char *source)
168 if ((!emission) || (!source)) return;
169 ed = _edje_fetch(obj);
171 if (ed->delete_me) return;
172 _edje_emit(ed, (char *)emission, (char *)source);
175 /* FIXDOC: Verify/Expand */
177 edje_object_play_set(Evas_Object *obj, Eina_Bool play)
182 Edje_Running_Program *runp;
185 ed = _edje_fetch(obj);
187 if (ed->delete_me) return;
190 if (!ed->paused) return;
192 t = ecore_time_get() - ed->paused_at;
193 EINA_LIST_FOREACH(ed->actions, l, runp)
194 runp->start_time += t;
198 if (ed->paused) return;
199 ed->paused = EINA_TRUE;
200 ed->paused_at = ecore_time_get();
203 for (i = 0; i < ed->table_parts_size; i++)
206 rp = ed->table_parts[i];
207 if (rp->part->type == EDJE_PART_TYPE_GROUP && rp->swallowed_object)
208 edje_object_play_set(rp->swallowed_object, play);
213 edje_object_play_get(const Evas_Object *obj)
217 ed = _edje_fetch(obj);
218 if (!ed) return EINA_FALSE;
219 if (ed->delete_me) return EINA_FALSE;
220 if (ed->paused) return EINA_FALSE;
224 /* FIXDOC: Verify/Expand */
226 edje_object_animation_set(Evas_Object *obj, Eina_Bool on)
232 ed = _edje_fetch(obj);
234 if (ed->delete_me) return;
240 Eina_List *newl = NULL;
243 EINA_LIST_FOREACH(ed->actions, l, data)
244 newl = eina_list_append(newl, data);
247 Edje_Running_Program *runp;
249 runp = eina_list_data_get(newl);
250 newl = eina_list_remove(newl, eina_list_data_get(newl));
251 _edje_program_run_iterate(runp, runp->start_time + TO_DOUBLE(runp->program->tween.time));
252 if (_edje_block_break(ed))
254 eina_list_free(newl);
261 _edje_emit(ed, "load", NULL);
262 if (evas_object_visible_get(obj))
264 evas_object_hide(obj);
265 evas_object_show(obj);
270 for (i = 0; i < ed->table_parts_size; i++)
273 rp = ed->table_parts[i];
274 if (rp->part->type == EDJE_PART_TYPE_GROUP && rp->swallowed_object)
275 edje_object_animation_set(rp->swallowed_object, on);
283 edje_object_animation_get(const Evas_Object *obj)
287 ed = _edje_fetch(obj);
288 if (!ed) return EINA_FALSE;
289 if (ed->delete_me) return EINA_FALSE;
290 if (ed->no_anim) return EINA_FALSE;
294 /* Private Routines */
297 _edje_program_run_iterate(Edje_Running_Program *runp, double tim)
302 Edje_Program_Target *pt;
306 if (ed->delete_me) return EINA_FALSE;
310 t = FROM_DOUBLE(tim - runp->start_time);
311 total = runp->program->tween.time;
313 if (t > FROM_INT(1)) t = FROM_INT(1);
314 EINA_LIST_FOREACH(runp->program->targets, l, pt)
318 rp = ed->table_parts[pt->id % ed->table_parts_size];
320 _edje_part_pos_set(ed, rp,
321 runp->program->tween.mode, t,
322 runp->program->tween.v1,
323 runp->program->tween.v2);
326 if (t >= FROM_INT(1))
328 Edje_Program_After *pa;
330 EINA_LIST_FOREACH(runp->program->targets, l, pt)
334 rp = ed->table_parts[pt->id % ed->table_parts_size];
337 _edje_part_description_apply(ed, rp,
338 runp->program->state,
339 runp->program->value,
342 _edje_part_pos_set(ed, rp,
343 runp->program->tween.mode, ZERO,
344 runp->program->tween.v1,
345 runp->program->tween.v2);
352 if (!ed->walking_actions)
355 ed->actions = eina_list_remove(ed->actions, runp);
357 _edje_animators = eina_list_remove(_edje_animators, ed);
359 // _edje_emit(ed, "program,stop", runp->program->name);
360 if (_edje_block_break(ed))
362 if (!ed->walking_actions) free(runp);
365 EINA_LIST_FOREACH(runp->program->after, l, pa)
371 pr = ed->table_programs[pa->id % ed->table_programs_size];
372 if (pr) _edje_program_run(ed, pr, 0, "", "");
373 if (_edje_block_break(ed))
375 if (!ed->walking_actions) free(runp);
382 if (!ed->walking_actions) free(runp);
395 _edje_program_end(Edje *ed, Edje_Running_Program *runp)
398 Edje_Program_Target *pt;
399 // const char *pname = NULL;
402 if (ed->delete_me) return;
405 EINA_LIST_FOREACH(runp->program->targets, l, pt)
411 rp = ed->table_parts[pt->id % ed->table_parts_size];
414 _edje_part_description_apply(ed, rp,
415 runp->program->state,
416 runp->program->value,
419 _edje_part_pos_set(ed, rp,
420 runp->program->tween.mode, ZERO,
421 runp->program->tween.v1,
422 runp->program->tween.v2);
429 // pname = runp->program->name;
430 if (!ed->walking_actions)
433 ed->actions = eina_list_remove(ed->actions, runp);
437 _edje_animators = eina_list_remove(_edje_animators, ed);
440 // _edje_emit(ed, "program,stop", pname);
443 if (free_runp) free(runp);
447 _edje_program_run(Edje *ed, Edje_Program *pr, Eina_Bool force, const char *ssig, const char *ssrc)
451 Edje_Program_Target *pt;
453 Edje_Program_After *pa;
454 /* limit self-feeding loops in programs to 64 levels */
455 static int recursions = 0;
456 static int recursion_limit = 0;
458 if (ed->delete_me) return;
459 if ((pr->in.from > 0.0) && (pr->in.range >= 0.0) && (!force))
461 Edje_Pending_Program *pp;
464 pp = calloc(1, sizeof(Edje_Pending_Program));
466 if (pr->in.range > 0.0) r = ((double)rand() / RAND_MAX);
467 pp->timer = ecore_timer_add(pr->in.from + (pr->in.range * r),
468 _edje_pending_timer_cb, pp);
476 ed->pending_actions = eina_list_append(ed->pending_actions, pp);
479 if ((recursions >= 64) || (recursion_limit))
481 ERR("Programs recursing up to recursion limit of %i in '%s' with '%s', '%s' from '%s', '%s'. Disabled.",
482 64, pr->name, ssig, ssrc, ed->path, ed->group);
492 case EDJE_ACTION_TYPE_STATE_SET:
493 if ((pr->tween.time > ZERO) && (!ed->no_anim))
495 Edje_Running_Program *runp;
497 runp = calloc(1, sizeof(Edje_Running_Program));
498 EINA_LIST_FOREACH(pr->targets, l, pt)
502 rp = ed->table_parts[pt->id % ed->table_parts_size];
505 if ((rp->object) && (pr->tween.mode & EDJE_TWEEN_MODE_OPT_FROM_CURRENT))
507 Edje_Calc_Params *tmp;
509 tmp = calloc(1, sizeof(Edje_Calc_Params));
510 if (!tmp) goto low_mem_current;
511 _edje_part_recalc(ed, rp, FLAG_XY, tmp);
513 if (rp->current) free(rp->current);
519 if (rp->current) free(rp->current);
524 _edje_program_end(ed, rp->program);
525 _edje_part_description_apply(ed, rp,
526 rp->param1.description->state.name,
527 rp->param1.description->state.value,
530 _edje_part_pos_set(ed, rp, pr->tween.mode, ZERO,
537 // _edje_emit(ed, "program,start", pr->name);
538 if (_edje_block_break(ed))
540 ed->actions = eina_list_append(ed->actions, runp);
544 _edje_animators = eina_list_append(_edje_animators, ed);
545 ed->actions = eina_list_append(ed->actions, runp);
546 runp->start_time = ecore_loop_time_get();
550 _edje_timer = ecore_animator_add(_edje_timer_cb, NULL);
555 EINA_LIST_FOREACH(pr->targets, l, pt)
559 rp = ed->table_parts[pt->id % ed->table_parts_size];
563 _edje_program_end(ed, rp->program);
564 _edje_part_description_apply(ed, rp,
569 _edje_part_pos_set(ed, rp, pr->tween.mode, ZERO,
575 // _edje_emit(ed, "program,start", pr->name);
576 if (_edje_block_break(ed)) goto break_prog;
577 // _edje_emit(ed, "program,stop", pr->name);
578 if (_edje_block_break(ed)) goto break_prog;
580 EINA_LIST_FOREACH(pr->after, l, pa)
584 pr2 = ed->table_programs[pa->id % ed->table_programs_size];
585 if (pr2) _edje_program_run(ed, pr2, 0, "", "");
586 if (_edje_block_break(ed)) goto break_prog;
593 case EDJE_ACTION_TYPE_ACTION_STOP:
594 // _edje_emit(ed, "program,start", pr->name);
595 EINA_LIST_FOREACH(pr->targets, l, pt)
598 Edje_Running_Program *runp;
599 Edje_Pending_Program *pp;
601 for (ll = ed->actions; ll; )
605 if (pt->id == runp->program->id)
607 _edje_program_end(ed, runp);
611 for (ll = ed->pending_actions; ll; )
615 if (pt->id == pp->program->id)
617 ed->pending_actions = eina_list_remove(ed->pending_actions, pp);
618 ecore_timer_del(pp->timer);
626 // _edje_emit(ed, "program,stop", pr->name);
627 if (_edje_block_break(ed)) goto break_prog;
630 case EDJE_ACTION_TYPE_SIGNAL_EMIT:
631 // _edje_emit(ed, "program,start", pr->name);
632 if (_edje_block_break(ed)) goto break_prog;
633 _edje_emit(ed, pr->state, pr->state2);
634 if (_edje_block_break(ed)) goto break_prog;
635 // _edje_emit(ed, "program,stop", pr->name);
636 if (_edje_block_break(ed)) goto break_prog;
639 case EDJE_ACTION_TYPE_DRAG_VAL_SET:
640 // _edje_emit(ed, "program,start", pr->name);
641 if (_edje_block_break(ed)) goto break_prog;
642 EINA_LIST_FOREACH(pr->targets, l, pt)
646 rp = ed->table_parts[pt->id % ed->table_parts_size];
647 if ((rp) && (rp->drag) && (rp->drag->down.count == 0))
649 rp->drag->val.x = pr->value;
650 rp->drag->val.y = pr->value2;
651 if (rp->drag->val.x < 0.0) rp->drag->val.x = 0.0;
652 else if (rp->drag->val.x > 1.0)
653 rp->drag->val.x = 1.0;
654 if (rp->drag->val.y < 0.0) rp->drag->val.y = 0.0;
655 else if (rp->drag->val.y > 1.0)
656 rp->drag->val.y = 1.0;
657 _edje_dragable_pos_set(ed, rp, rp->drag->val.x, rp->drag->val.y);
658 _edje_emit(ed, "drag,set", rp->part->name);
659 if (_edje_block_break(ed)) goto break_prog;
663 // _edje_emit(ed, "program,stop", pr->name);
664 if (_edje_block_break(ed)) goto break_prog;
667 case EDJE_ACTION_TYPE_DRAG_VAL_STEP:
668 // _edje_emit(ed, "program,start", pr->name);
669 if (_edje_block_break(ed)) goto break_prog;
670 EINA_LIST_FOREACH(pr->targets, l, pt)
674 rp = ed->table_parts[pt->id % ed->table_parts_size];
675 if ((rp) && (rp->drag) && (rp->drag->down.count == 0))
677 rp->drag->val.x += pr->value * rp->drag->step.x * rp->part->dragable.x;
678 rp->drag->val.y += pr->value2 * rp->drag->step.y * rp->part->dragable.y;
679 if (rp->drag->val.x < 0.0) rp->drag->val.x = 0.0;
680 else if (rp->drag->val.x > 1.0)
681 rp->drag->val.x = 1.0;
682 if (rp->drag->val.y < 0.0) rp->drag->val.y = 0.0;
683 else if (rp->drag->val.y > 1.0)
684 rp->drag->val.y = 1.0;
685 _edje_dragable_pos_set(ed, rp, rp->drag->val.x, rp->drag->val.y);
686 _edje_emit(ed, "drag,step", rp->part->name);
687 if (_edje_block_break(ed)) goto break_prog;
691 // _edje_emit(ed, "program,stop", pr->name);
692 if (_edje_block_break(ed)) goto break_prog;
695 case EDJE_ACTION_TYPE_DRAG_VAL_PAGE:
696 // _edje_emit(ed, "program,start", pr->name);
697 if (_edje_block_break(ed)) goto break_prog;
698 EINA_LIST_FOREACH(pr->targets, l, pt)
702 rp = ed->table_parts[pt->id % ed->table_parts_size];
703 if ((rp) && (rp->drag) && (rp->drag->down.count == 0))
705 rp->drag->val.x += pr->value * rp->drag->page.x * rp->part->dragable.x;
706 rp->drag->val.y += pr->value2 * rp->drag->page.y * rp->part->dragable.y;
707 if (rp->drag->val.x < 0.0) rp->drag->val.x = 0.0;
708 else if (rp->drag->val.x > 1.0)
709 rp->drag->val.x = 1.0;
710 if (rp->drag->val.y < 0.0) rp->drag->val.y = 0.0;
711 else if (rp->drag->val.y > 1.0)
712 rp->drag->val.y = 1.0;
713 _edje_dragable_pos_set(ed, rp, rp->drag->val.x, rp->drag->val.y);
714 _edje_emit(ed, "drag,page", rp->part->name);
715 if (_edje_block_break(ed)) goto break_prog;
719 // _edje_emit(ed, "program,stop", pr->name);
720 if (_edje_block_break(ed)) goto break_prog;
723 case EDJE_ACTION_TYPE_SCRIPT:
727 // _edje_emit(ed, "program,start", pr->name);
728 if (_edje_block_break(ed)) goto break_prog;
729 snprintf(fname, sizeof(fname), "_p%i", pr->id);
730 _edje_embryo_test_run(ed, fname, ssig, ssrc);
731 // _edje_emit(ed, "program,stop", pr->name);
732 if (_edje_block_break(ed)) goto break_prog;
737 case EDJE_ACTION_TYPE_FOCUS_SET:
739 ed->focused_part = NULL;
742 EINA_LIST_FOREACH(pr->targets, l, pt)
746 rp = ed->table_parts[pt->id % ed->table_parts_size];
749 if (ed->focused_part != rp)
751 if (ed->focused_part)
752 _edje_emit(ed, "focus,part,out",
753 ed->focused_part->part->name);
754 ed->focused_part = rp;
755 _edje_emit(ed, "focus,part,in",
756 ed->focused_part->part->name);
764 case EDJE_ACTION_TYPE_FOCUS_OBJECT:
767 Evas_Object *focused;
769 focused = evas_focus_get(evas_object_evas_get(ed->obj));
774 /* Check if the current swallowed object is one of my child. */
775 for (i = 0; i < ed->table_parts_size; ++i)
777 rp = ed->table_parts[i];
778 if (rp && rp->swallowed_object == focused)
780 evas_object_focus_set(focused, EINA_FALSE);
788 EINA_LIST_FOREACH(pr->targets, l, pt)
792 rp = ed->table_parts[pt->id % ed->table_parts_size];
793 if (rp && rp->swallowed_object)
794 evas_object_focus_set(rp->swallowed_object, EINA_TRUE);
800 case EDJE_ACTION_TYPE_SOUND_SAMPLE:
801 if (_edje_block_break(ed))
803 _edje_multisense_internal_sound_sample_play(ed, pr->sample_name, pr->speed);
806 case EDJE_ACTION_TYPE_SOUND_TONE:
807 if (_edje_block_break(ed))
809 _edje_multisense_internal_sound_tone_play(ed, pr->tone_name, pr->duration);
812 case EDJE_ACTION_TYPE_PARAM_COPY:
814 Edje_Real_Part *src_part, *dst_part;
816 // _edje_emit(ed, "program,start", pr->name);
817 if (_edje_block_break(ed)) goto break_prog;
819 src_part = ed->table_parts[pr->param.src % ed->table_parts_size];
820 dst_part = ed->table_parts[pr->param.dst % ed->table_parts_size];
821 _edje_param_copy(src_part, pr->state, dst_part, pr->state2);
823 if (_edje_block_break(ed)) goto break_prog;
824 // _edje_emit(ed, "program,stop", pr->name);
825 if (_edje_block_break(ed)) goto break_prog;
829 case EDJE_ACTION_TYPE_PARAM_SET:
831 Edje_Real_Part *part;
833 // _edje_emit(ed, "program,start", pr->name);
834 if (_edje_block_break(ed)) goto break_prog;
836 part = ed->table_parts[pr->param.dst % ed->table_parts_size];
837 _edje_param_set(part, pr->state, pr->state2);
839 if (_edje_block_break(ed)) goto break_prog;
840 // _edje_emit(ed, "program,stop", pr->name);
841 if (_edje_block_break(ed)) goto break_prog;
846 // _edje_emit(ed, "program,start", pr->name);
847 // _edje_emit(ed, "program,stop", pr->name);
850 if (!((pr->action == EDJE_ACTION_TYPE_STATE_SET)
851 /* hmm this fucks somethgin up. must look into it later */
852 /* && (pr->tween.time > ZERO) && (!ed->no_anim))) */
855 EINA_LIST_FOREACH(pr->after, l, pa)
859 pr2 = ed->table_programs[pa->id % ed->table_programs_size];
860 if (pr2) _edje_program_run(ed, pr2, 0, "", "");
861 if (_edje_block_break(ed)) goto break_prog;
869 if (recursions == 0) recursion_limit = 0;
874 _edje_emit(Edje *ed, const char *sig, const char *src)
876 _edje_emit_full(ed, sig, src, NULL, NULL);
879 /* data should either be NULL or a malloc allocated data */
881 _edje_emit_full(Edje *ed, const char *sig, const char *src, void *data, void (*free_func)(void *))
883 Edje_Message_Signal emsg;
887 if (!ed->collection) return;
888 if (ed->delete_me) return;
889 broadcast = ed->collection->broadcast_signal;
891 sep = strchr(sig, EDJE_PART_PATH_SEPARATOR);
893 /* If we are not sending the signal to a part of the child, the
894 * signal if for ourself
898 Edje_Real_Part *rp = NULL;
905 /* the signal contains a colon, split the signal into "parts:signal" */
906 length = sep - sig + 1;
907 part = alloca(length);
908 memcpy(part, sig, length - 1);
909 part[length - 1] = '\0';
913 /* lookup for alias */
914 if (ed->collection && ed->collection->alias)
918 alias = eina_hash_find(ed->collection->alias, part);
925 alien = strlen(alias);
926 nslen = strlen(newsig);
927 length = alien + nslen + 2;
929 aliased = alloca(length);
930 memcpy(aliased, alias, alien);
931 aliased[alien] = EDJE_PART_PATH_SEPARATOR;
932 memcpy(aliased + alien + 1, newsig, nslen + 1);
934 _edje_emit(ed, aliased, src);
939 /* search for the index if present and remove it from the part */
940 idx = strchr(part, EDJE_PART_PATH_SEPARATOR_INDEXL);
945 end = strchr(idx + 1, EDJE_PART_PATH_SEPARATOR_INDEXR);
946 if (end && end != idx + 1)
950 tmp = alloca(end - idx);
951 memcpy(tmp, idx + 1, end - idx - 1);
952 tmp[end - idx - 1] = '\0';
962 /* search for the right part now */
963 rp = _edje_real_part_get(ed, part);
966 switch (rp->part->type)
968 case EDJE_PART_TYPE_GROUP:
969 if (!rp->swallowed_object) goto end;
970 ed2 = _edje_fetch(rp->swallowed_object);
973 _edje_emit(ed2, newsig, src);
974 broadcast = EINA_FALSE;
977 case EDJE_PART_TYPE_EXTERNAL:
978 if (!rp->swallowed_object) break;
982 _edje_external_signal_emit(rp->swallowed_object, newsig, src);
988 child = _edje_children_get(rp, idx);
989 ed2 = _edje_fetch(child);
991 _edje_emit(ed2, newsig, src);
993 broadcast = EINA_FALSE;
996 case EDJE_PART_TYPE_BOX:
997 case EDJE_PART_TYPE_TABLE:
1002 child = _edje_children_get(rp, idx);
1003 ed2 = _edje_fetch(child);
1005 _edje_emit(ed2, newsig, src);
1006 broadcast = EINA_FALSE;
1011 // ERR("SPANK SPANK SPANK !!!\nYou should never be here !");
1021 emsg.data = calloc(1, sizeof(*(emsg.data)));
1023 emsg.data->data = data;
1024 emsg.data->free_func = free_func;
1030 /* new sends code */
1032 edje_object_message_send(ed->obj, EDJE_MESSAGE_SIGNAL, 0, &emsg);
1034 _edje_message_send(ed, EDJE_QUEUE_SCRIPT, EDJE_MESSAGE_SIGNAL, 0, &emsg);
1035 /* old send code - use api now
1036 _edje_message_send(ed, EDJE_QUEUE_SCRIPT, EDJE_MESSAGE_SIGNAL, 0, &emsg);
1037 EINA_LIST_FOREACH(ed->subobjs, l, obj)
1041 ed2 = _edje_fetch(obj);
1043 if (ed2->delete_me) continue;
1044 _edje_message_send(ed2, EDJE_QUEUE_SCRIPT, EDJE_MESSAGE_SIGNAL, 0, &emsg);
1047 if (emsg.data && (--(emsg.data->ref) == 0))
1049 if (emsg.data->free_func)
1051 emsg.data->free_func(emsg.data->data);
1057 struct _Edje_Program_Data
1065 _edje_glob_callback(Edje_Program *pr, void *dt)
1067 struct _Edje_Program_Data *data = dt;
1068 Edje_Real_Part *rp = NULL;
1069 Eina_Bool exec = EINA_TRUE;
1071 if (pr->filter.state)
1073 rp = _edje_real_part_get(data->ed, pr->filter.part ? pr->filter.part : data->source);
1075 exec = !strcmp(rp->chosen_description->state.name, pr->filter.state);
1080 data->matches = eina_list_append(data->matches, pr);
1086 _edje_callbacks_patterns_clean(Edje *ed)
1088 if (ed->walking_callbacks > 0) return;
1090 _edje_signals_sources_patterns_clean(&ed->patterns.callbacks);
1092 eina_rbtree_delete(ed->patterns.callbacks.exact_match,
1093 EINA_RBTREE_FREE_CB(edje_match_signal_source_free),
1095 ed->patterns.callbacks.exact_match = NULL;
1097 ed->patterns.callbacks.u.callbacks.globing = eina_list_free(ed->patterns.callbacks.u.callbacks.globing);
1101 _edje_callbacks_patterns_init(Edje *ed)
1103 Edje_Signals_Sources_Patterns *ssp = &ed->patterns.callbacks;
1105 if ((ssp->signals_patterns) || (ssp->sources_patterns) ||
1106 (ssp->u.callbacks.globing) || (ssp->exact_match))
1109 ssp->u.callbacks.globing = edje_match_callback_hash_build(ed->callbacks,
1112 ssp->signals_patterns = edje_match_callback_signal_init(ssp->u.callbacks.globing);
1113 ssp->sources_patterns = edje_match_callback_source_init(ssp->u.callbacks.globing);
1116 /* FIXME: what if we delete the evas object??? */
1118 _edje_emit_handle(Edje *ed, const char *sig, const char *src,
1119 Edje_Message_Signal_Data *sdata, Eina_Bool prop)
1121 if (ed->delete_me) return;
1124 // printf("EDJE EMIT: (%p) signal: \"%s\" source: \"%s\"\n", ed, sig, src);
1129 if (ed->collection && ed->L)
1130 _edje_lua2_script_func_signal(ed, sig, src);
1134 #ifdef EDJE_PROGRAM_CACHE
1135 Edje_Part_Collection *ec;
1141 #ifdef EDJE_PROGRAM_CACHE
1142 ec = ed->collection;
1145 tmps = alloca(l1 + l2 + 3); /* \0, \337, \0 */
1148 strcpy(&(tmps[l1 + 1]), src);
1152 #ifdef EDJE_PROGRAM_CACHE
1158 if (eina_hash_find(ec->prog_cache.no_matches, tmps))
1162 else if ((matches = eina_hash_find(ec->prog_cache.matches, tmps)))
1164 EINA_LIST_FOREACH(matches, l, pr)
1166 Eina_Bool exec = EINA_TRUE;
1168 if (pr->filter.state)
1172 rp = _edje_real_part_get(ed, pr->filter.part ? pr->filter.part : src);
1178 exec = (rp->chosen_description->state.name == pr->filter.state);
1185 EINA_LIST_FOREACH(matches, l, pr)
1188 _edje_program_run(ed, pr, 0, sig, src);
1189 if (_edje_block_break(ed))
1201 struct _Edje_Program_Data data;
1205 data.matches = NULL;
1207 if (ed->table_programs_size > 0)
1209 const Eina_List *match;
1213 if (ed->patterns.programs.u.programs.globing)
1214 if (edje_match_programs_exec(ed->patterns.programs.signals_patterns,
1215 ed->patterns.programs.sources_patterns,
1218 ed->patterns.programs.u.programs.globing,
1219 _edje_glob_callback,
1224 match = edje_match_signal_source_hash_get(sig, src,
1225 ed->patterns.programs.exact_match);
1226 EINA_LIST_FOREACH(match, l, pr)
1227 _edje_glob_callback(pr, &data);
1229 #ifdef EDJE_PROGRAM_CACHE
1230 EINA_LIST_FOREACH(data.matches, l, pr)
1232 EINA_LIST_FREE(data.matches, pr)
1236 _edje_program_run(ed, pr, 0, sig, src);
1238 if (_edje_block_break(ed))
1240 eina_list_free(data.matches);
1241 data.matches = NULL;
1247 #ifdef EDJE_PROGRAM_CACHE
1250 if (data.matches == NULL)
1252 if (!ec->prog_cache.no_matches)
1253 ec->prog_cache.no_matches = eina_hash_string_superfast_new(NULL);
1254 eina_hash_add(ec->prog_cache.no_matches, tmps, ed);
1258 if (!ec->prog_cache.matches)
1259 ec->prog_cache.matches = eina_hash_string_superfast_new(NULL);
1260 eina_hash_add(ec->prog_cache.matches, tmps, data.matches);
1265 _edje_emit_cb(ed, sig, src, sdata, prop);
1266 if (_edje_block_break(ed))
1277 /* Extra data for callbacks */
1278 static void *callback_extra_data = NULL;
1281 edje_object_signal_callback_extra_data_get(void)
1283 return callback_extra_data;
1286 /* FIXME: what if we delete the evas object??? */
1288 _edje_emit_cb(Edje *ed, const char *sig, const char *src, Edje_Message_Signal_Data *data, Eina_Bool prop)
1292 if (ed->delete_me) return;
1297 if (ed->just_added_callbacks)
1298 _edje_callbacks_patterns_clean(ed);
1300 ed->walking_callbacks++;
1304 Edje_Signal_Callback *escb;
1305 const Eina_List *match;
1306 const Eina_List *l2;
1308 callback_extra_data = (data) ? data->data : NULL;
1310 _edje_callbacks_patterns_init(ed);
1311 if (ed->patterns.callbacks.u.callbacks.globing)
1312 r = edje_match_callback_exec(ed->patterns.callbacks.signals_patterns,
1313 ed->patterns.callbacks.sources_patterns,
1316 ed->patterns.callbacks.u.callbacks.globing,
1323 match = edje_match_signal_source_hash_get(sig, src,
1324 ed->patterns.callbacks.exact_match);
1325 EINA_LIST_FOREACH(match, l2, escb)
1327 if ((prop) && (escb->propagate)) continue;
1328 if ((!escb->just_added) && (!escb->delete_me))
1330 escb->func(escb->data, ed->obj, sig, src);
1331 if (_edje_block_break(ed))
1338 ed->walking_callbacks--;
1339 if (!ed->walking_callbacks &&
1340 ((ed->delete_callbacks) || (ed->just_added_callbacks)))
1342 ed->delete_callbacks = 0;
1343 ed->just_added_callbacks = 0;
1347 Edje_Signal_Callback *escb = l->data;
1348 Eina_List *next_l = l->next;
1350 if (escb->just_added)
1351 escb->just_added = 0;
1352 if (escb->delete_me)
1354 ed->callbacks = eina_list_remove_list(ed->callbacks, l);
1355 if (escb->signal) eina_stringshare_del(escb->signal);
1356 if (escb->source) eina_stringshare_del(escb->source);
1362 _edje_callbacks_patterns_clean(ed);
1369 static const Edje_External_Param_Info *
1370 _edje_external_param_info_get(const Evas_Object *obj, const char *name)
1372 const Edje_External_Type *type;
1373 const Edje_External_Param_Info *info;
1375 type = evas_object_data_get(obj, "Edje_External_Type");
1376 if (!type) return NULL;
1377 for (info = type->parameters_info; info->name; info++)
1378 if (!strcmp(info->name, name)) return info;
1383 static Edje_External_Param *
1384 _edje_param_external_get(Edje_Real_Part *rp, const char *name, Edje_External_Param *param)
1386 Evas_Object *swallowed_object = rp->swallowed_object;
1387 const Edje_External_Param_Info *info;
1389 info = _edje_external_param_info_get(swallowed_object, name);
1390 if (!info) return NULL;
1392 memset(param, 0, sizeof(*param));
1393 param->name = info->name;
1394 param->type = info->type;
1395 if (!_edje_external_param_get(NULL, rp, param)) return NULL;
1399 /* simulate external properties for native objects */
1400 static Edje_External_Param *
1401 _edje_param_native_get(Edje_Real_Part *rp, const char *name, Edje_External_Param *param, void **free_ptr)
1404 if ((rp->part->type == EDJE_PART_TYPE_TEXT) ||
1405 (rp->part->type == EDJE_PART_TYPE_TEXTBLOCK))
1407 if (!strcmp(name, "text"))
1410 param->type = EDJE_EXTERNAL_PARAM_TYPE_STRING;
1412 _edje_recalc_do(rp->edje);
1413 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1414 param->s = _edje_entry_text_get(rp);
1415 else if (rp->part->type == EDJE_PART_TYPE_TEXT)
1416 param->s = rp->text.text;
1418 param->s = evas_object_textblock_text_markup_get(rp->object);
1421 if (rp->part->type == EDJE_PART_TYPE_TEXTBLOCK)
1423 if (!strcmp(name, "text_unescaped"))
1426 param->type = EDJE_EXTERNAL_PARAM_TYPE_STRING;
1428 _edje_recalc_do(rp->edje);
1429 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1431 const char *tmp = _edje_entry_text_get(rp);
1432 char *unescaped = _edje_text_unescape(tmp);
1433 *free_ptr = unescaped;
1434 param->s = unescaped;
1436 else if (rp->part->type == EDJE_PART_TYPE_TEXT)
1437 param->s = rp->text.text;
1443 tmp = evas_object_textblock_text_markup_get(rp->object);
1444 unescaped = _edje_text_unescape(tmp);
1445 *free_ptr = unescaped;
1446 param->s = unescaped;
1452 if ((rp->entry_data) &&
1453 (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE) &&
1454 (!strcmp(name, "select_allow")))
1457 param->type = EDJE_EXTERNAL_PARAM_TYPE_BOOL;
1458 param->i = _edje_entry_select_allow_get(rp);
1464 if ((rp->drag) && (rp->drag->down.count == 0))
1466 if (!strncmp(name, "drag_", sizeof("drag_") - 1))
1468 const char *sub_name = name + sizeof("drag_") - 1;
1469 if (!strcmp(sub_name, "value_x"))
1473 _edje_recalc_do(rp->edje);
1474 d = TO_DOUBLE(rp->drag->val.x);
1475 if (rp->part->dragable.x < 0) d = 1.0 - d;
1477 param->type = EDJE_EXTERNAL_PARAM_TYPE_DOUBLE;
1481 if (!strcmp(sub_name, "value_y"))
1485 _edje_recalc_do(rp->edje);
1486 d = TO_DOUBLE(rp->drag->val.y);
1487 if (rp->part->dragable.y < 0) d = 1.0 - d;
1489 param->type = EDJE_EXTERNAL_PARAM_TYPE_DOUBLE;
1494 if (!strcmp(sub_name, "size_w"))
1496 _edje_recalc_do(rp->edje);
1498 param->type = EDJE_EXTERNAL_PARAM_TYPE_DOUBLE;
1499 param->d = TO_DOUBLE(rp->drag->size.x);
1502 if (!strcmp(sub_name, "size_h"))
1504 _edje_recalc_do(rp->edje);
1506 param->type = EDJE_EXTERNAL_PARAM_TYPE_DOUBLE;
1507 param->d = TO_DOUBLE(rp->drag->size.y);
1511 if (!strcmp(sub_name, "step_x"))
1513 _edje_recalc_do(rp->edje);
1515 param->type = EDJE_EXTERNAL_PARAM_TYPE_DOUBLE;
1516 param->d = TO_DOUBLE(rp->drag->step.x);
1519 if (!strcmp(sub_name, "step_y"))
1521 _edje_recalc_do(rp->edje);
1523 param->type = EDJE_EXTERNAL_PARAM_TYPE_DOUBLE;
1524 param->d = TO_DOUBLE(rp->drag->step.y);
1528 if (!strcmp(sub_name, "page_x"))
1530 _edje_recalc_do(rp->edje);
1532 param->type = EDJE_EXTERNAL_PARAM_TYPE_DOUBLE;
1533 param->d = TO_DOUBLE(rp->drag->page.x);
1536 if (!strcmp(sub_name, "page_y"))
1538 _edje_recalc_do(rp->edje);
1540 param->type = EDJE_EXTERNAL_PARAM_TYPE_DOUBLE;
1541 param->d = TO_DOUBLE(rp->drag->page.y);
1553 _edje_param_native_set(Edje_Real_Part *rp, const char *name, const Edje_External_Param *param)
1555 if ((rp->part->type == EDJE_PART_TYPE_TEXT) ||
1556 (rp->part->type == EDJE_PART_TYPE_TEXTBLOCK))
1558 if (!strcmp(name, "text"))
1560 if (param->type != EDJE_EXTERNAL_PARAM_TYPE_STRING)
1563 _edje_object_part_text_raw_set
1564 (rp->edje->obj, rp, rp->part->name, param->s);
1567 if (rp->part->type == EDJE_PART_TYPE_TEXTBLOCK)
1569 if (!strcmp(name, "text_unescaped"))
1571 if (param->type != EDJE_EXTERNAL_PARAM_TYPE_STRING)
1574 if (rp->part->type == EDJE_PART_TYPE_TEXT)
1575 _edje_object_part_text_raw_set
1576 (rp->edje->obj, rp, rp->part->name, param->s);
1579 char *escaped = _edje_text_escape(param->s);
1580 _edje_object_part_text_raw_set
1581 (rp->edje->obj, rp, rp->part->name, escaped);
1588 if ((rp->entry_data) &&
1589 (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE) &&
1590 (!strcmp(name, "select_allow")))
1592 if (param->type != EDJE_EXTERNAL_PARAM_TYPE_BOOL)
1594 _edje_entry_select_allow_set(rp, param->i);
1600 if ((rp->drag) && (rp->drag->down.count == 0))
1602 if (!strncmp(name, "drag_", sizeof("drag_") - 1))
1604 const char *sub_name = name + sizeof("drag_") - 1;
1605 if (!strcmp(sub_name, "value_x"))
1608 if (param->type != EDJE_EXTERNAL_PARAM_TYPE_DOUBLE)
1611 if (rp->part->dragable.confine_id != -1)
1612 d = CLAMP(d, 0.0, 1.0);
1613 if (rp->part->dragable.x < 0) d = 1.0 - d;
1614 if (rp->drag->val.x == FROM_DOUBLE(d)) return EINA_TRUE;
1615 rp->drag->val.x = FROM_DOUBLE(d);
1616 #ifdef EDJE_CALC_CACHE
1619 _edje_dragable_pos_set
1620 (rp->edje, rp, rp->drag->val.x, rp->drag->val.y);
1621 _edje_emit(rp->edje, "drag,set", rp->part->name);
1624 if (!strcmp(sub_name, "value_y"))
1627 if (param->type != EDJE_EXTERNAL_PARAM_TYPE_DOUBLE)
1630 if (rp->part->dragable.confine_id != -1)
1631 d = CLAMP(d, 0.0, 1.0);
1632 if (rp->part->dragable.y < 0) d = 1.0 - d;
1633 if (rp->drag->val.y == FROM_DOUBLE(d)) return EINA_TRUE;
1634 rp->drag->val.y = FROM_DOUBLE(d);
1635 #ifdef EDJE_CALC_CACHE
1638 _edje_dragable_pos_set
1639 (rp->edje, rp, rp->drag->val.x, rp->drag->val.y);
1640 _edje_emit(rp->edje, "drag,set", rp->part->name);
1644 if (!strcmp(sub_name, "size_w"))
1646 if (param->type != EDJE_EXTERNAL_PARAM_TYPE_DOUBLE)
1648 rp->drag->size.x = FROM_DOUBLE(CLAMP(param->d, 0.0, 1.0));
1649 rp->edje->recalc_call = 1;
1650 rp->edje->dirty = 1;
1651 #ifdef EDJE_CALC_CACHE
1654 _edje_recalc(rp->edje);
1657 if (!strcmp(sub_name, "size_h"))
1659 if (param->type != EDJE_EXTERNAL_PARAM_TYPE_DOUBLE)
1661 rp->drag->size.y = FROM_DOUBLE(CLAMP(param->d, 0.0, 1.0));
1662 rp->edje->recalc_call = 1;
1663 rp->edje->dirty = 1;
1664 #ifdef EDJE_CALC_CACHE
1667 _edje_recalc(rp->edje);
1671 if (!strcmp(sub_name, "step_x"))
1673 if (param->type != EDJE_EXTERNAL_PARAM_TYPE_DOUBLE)
1675 rp->drag->step.x = FROM_DOUBLE(CLAMP(param->d, 0.0, 1.0));
1676 #ifdef EDJE_CALC_CACHE
1681 if (!strcmp(sub_name, "step_y"))
1683 if (param->type != EDJE_EXTERNAL_PARAM_TYPE_DOUBLE)
1685 rp->drag->step.y = FROM_DOUBLE(CLAMP(param->d, 0.0, 1.0));
1686 #ifdef EDJE_CALC_CACHE
1692 if (!strcmp(sub_name, "page_x"))
1694 if (param->type != EDJE_EXTERNAL_PARAM_TYPE_DOUBLE)
1696 rp->drag->page.x = FROM_DOUBLE(CLAMP(param->d, 0.0, 1.0));
1697 #ifdef EDJE_CALC_CACHE
1702 if (!strcmp(sub_name, "page_y"))
1704 if (param->type != EDJE_EXTERNAL_PARAM_TYPE_DOUBLE)
1706 rp->drag->page.y = FROM_DOUBLE(CLAMP(param->d, 0.0, 1.0));
1707 #ifdef EDJE_CALC_CACHE
1720 static const Edje_External_Param_Info *
1721 _edje_native_param_info_get(const Edje_Real_Part *rp, const char *name)
1723 if ((rp->part->type == EDJE_PART_TYPE_TEXT) ||
1724 (rp->part->type == EDJE_PART_TYPE_TEXTBLOCK))
1726 if (!strcmp(name, "text"))
1728 static const Edje_External_Param_Info pi =
1729 EDJE_EXTERNAL_PARAM_INFO_STRING("text");
1732 if (rp->part->type == EDJE_PART_TYPE_TEXTBLOCK)
1734 if (!strcmp(name, "text_unescaped"))
1736 static const Edje_External_Param_Info pi =
1737 EDJE_EXTERNAL_PARAM_INFO_STRING("text_unescaped");
1740 if (!strcmp(name, "select_allow"))
1742 static const Edje_External_Param_Info pi =
1743 EDJE_EXTERNAL_PARAM_INFO_BOOL("text_unescaped");
1749 if ((rp->drag) && (rp->drag->down.count == 0))
1751 if (!strncmp(name, "drag_", sizeof("drag_") - 1))
1753 name += sizeof("drag_") - 1;
1754 if (!strcmp(name, "value_x"))
1756 static const Edje_External_Param_Info pi =
1757 EDJE_EXTERNAL_PARAM_INFO_DOUBLE("drag_value_x");
1760 if (!strcmp(name, "value_y"))
1762 static const Edje_External_Param_Info pi =
1763 EDJE_EXTERNAL_PARAM_INFO_DOUBLE("drag_value_y");
1766 if (!strcmp(name, "size_w"))
1768 static const Edje_External_Param_Info pi =
1769 EDJE_EXTERNAL_PARAM_INFO_DOUBLE("drag_size_w");
1772 if (!strcmp(name, "size_h"))
1774 static const Edje_External_Param_Info pi =
1775 EDJE_EXTERNAL_PARAM_INFO_DOUBLE("drag_size_h");
1778 if (!strcmp(name, "step_x"))
1780 static const Edje_External_Param_Info pi =
1781 EDJE_EXTERNAL_PARAM_INFO_DOUBLE("drag_step_x");
1784 if (!strcmp(name, "step_y"))
1786 static const Edje_External_Param_Info pi =
1787 EDJE_EXTERNAL_PARAM_INFO_DOUBLE("drag_step_y");
1790 if (!strcmp(name, "page_x"))
1792 static const Edje_External_Param_Info pi =
1793 EDJE_EXTERNAL_PARAM_INFO_DOUBLE("drag_page_x");
1796 if (!strcmp(name, "page_y"))
1798 static const Edje_External_Param_Info pi =
1799 EDJE_EXTERNAL_PARAM_INFO_DOUBLE("drag_page_y");
1810 static Edje_External_Param *
1811 _edje_param_convert(Edje_External_Param *param, const Edje_External_Param_Info *dst_info)
1813 if (param->type == dst_info->type) return param;
1815 switch (dst_info->type)
1817 case EDJE_EXTERNAL_PARAM_TYPE_BOOL:
1818 case EDJE_EXTERNAL_PARAM_TYPE_INT:
1821 switch (param->type)
1823 case EDJE_EXTERNAL_PARAM_TYPE_DOUBLE:
1827 case EDJE_EXTERNAL_PARAM_TYPE_STRING:
1828 case EDJE_EXTERNAL_PARAM_TYPE_CHOICE:
1829 i = (param->s) ? atoi(param->s) : 0;
1832 case EDJE_EXTERNAL_PARAM_TYPE_BOOL:
1833 case EDJE_EXTERNAL_PARAM_TYPE_INT:
1840 if (dst_info->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL)
1842 param->type = dst_info->type;
1847 case EDJE_EXTERNAL_PARAM_TYPE_DOUBLE:
1850 switch (param->type)
1852 case EDJE_EXTERNAL_PARAM_TYPE_INT:
1853 d = (double)param->i;
1856 case EDJE_EXTERNAL_PARAM_TYPE_STRING:
1857 case EDJE_EXTERNAL_PARAM_TYPE_CHOICE:
1858 d = (param->s) ? atof(param->s) : 0.0;
1861 case EDJE_EXTERNAL_PARAM_TYPE_BOOL:
1862 d = (double)param->i;
1868 param->type = dst_info->type;
1873 case EDJE_EXTERNAL_PARAM_TYPE_STRING:
1876 switch (param->type)
1878 case EDJE_EXTERNAL_PARAM_TYPE_BOOL:
1879 case EDJE_EXTERNAL_PARAM_TYPE_INT:
1880 if (!snprintf(s, sizeof(s), "%i", param->i)) return NULL;
1883 case EDJE_EXTERNAL_PARAM_TYPE_DOUBLE:
1884 if (!snprintf(s, sizeof(s), "%f", param->d)) return NULL;
1887 case EDJE_EXTERNAL_PARAM_TYPE_CHOICE:
1888 param->type = dst_info->type;
1894 param->type = dst_info->type;
1899 case EDJE_EXTERNAL_PARAM_TYPE_CHOICE:
1903 switch (param->type)
1905 case EDJE_EXTERNAL_PARAM_TYPE_BOOL:
1906 case EDJE_EXTERNAL_PARAM_TYPE_INT:
1907 if (!snprintf(s, sizeof(s), "%i", param->i)) return NULL;
1911 case EDJE_EXTERNAL_PARAM_TYPE_DOUBLE:
1912 if (!snprintf(s, sizeof(s), "%f", param->d)) return NULL;
1916 case EDJE_EXTERNAL_PARAM_TYPE_STRING:
1924 param->type = dst_info->type;
1925 if (param->s != val) param->s = val;
1929 default: return NULL;
1934 _edje_param_validate(const Edje_External_Param *param, const Edje_External_Param_Info *info)
1938 case EDJE_EXTERNAL_PARAM_TYPE_BOOL:
1939 return (param->i == 0) || (param->i == 1);
1941 case EDJE_EXTERNAL_PARAM_TYPE_INT:
1942 if ((info->info.i.min != EDJE_EXTERNAL_INT_UNSET) &&
1943 (info->info.i.min > param->i))
1946 if ((info->info.i.max != EDJE_EXTERNAL_INT_UNSET) &&
1947 (info->info.i.max < param->i))
1952 case EDJE_EXTERNAL_PARAM_TYPE_DOUBLE:
1953 if ((info->info.d.min != EDJE_EXTERNAL_DOUBLE_UNSET) &&
1954 (info->info.d.min > param->d))
1957 if ((info->info.d.max != EDJE_EXTERNAL_DOUBLE_UNSET) &&
1958 (info->info.d.max < param->d))
1963 case EDJE_EXTERNAL_PARAM_TYPE_STRING:
1964 if (!param->s) return EINA_FALSE;
1965 if (info->info.s.accept_fmt)
1966 INF("string 'accept_fmt' validation not implemented.");
1967 if (info->info.s.deny_fmt)
1968 INF("string 'deny_fmt' validation not implemented.");
1971 case EDJE_EXTERNAL_PARAM_TYPE_CHOICE:
1973 const char **itr = info->info.c.choices;
1974 if (!itr) return EINA_FALSE;
1976 if (!strcmp(*itr, param->s))
1981 default: return EINA_FALSE;
1986 _edje_param_copy(Edje_Real_Part *src_part, const char *src_param, Edje_Real_Part *dst_part, const char *dst_param)
1988 Edje_External_Param val;
1989 const Edje_External_Param_Info *dst_info;
1990 void *free_ptr = NULL;
1992 if ((!src_part) || (!src_param) || (!dst_part) || (!dst_param))
1995 if (dst_part->part->type == EDJE_PART_TYPE_EXTERNAL)
1996 dst_info = _edje_external_param_info_get
1997 (dst_part->swallowed_object, dst_param);
1999 dst_info = _edje_native_param_info_get(dst_part, dst_param);
2003 ERR("cannot copy, invalid destination parameter '%s' of part '%s'",
2004 dst_param, dst_part->part->name);
2008 if (src_part->part->type == EDJE_PART_TYPE_EXTERNAL)
2010 if (!_edje_param_external_get
2011 (src_part, src_param, &val))
2013 ERR("cannot get parameter '%s' of part '%s'",
2014 src_param, src_part->part->name);
2020 if (!_edje_param_native_get(src_part, src_param, &val, &free_ptr))
2022 ERR("cannot get parameter '%s' of part '%s'",
2023 src_param, src_part->part->name);
2028 if (!_edje_param_convert(&val, dst_info))
2030 ERR("cannot convert parameter type %s to requested type %s",
2031 edje_external_param_type_str(val.type),
2032 edje_external_param_type_str(dst_info->type));
2036 if (!_edje_param_validate(&val, dst_info))
2038 ERR("incorrect parameter value failed validation for type %s",
2039 edje_external_param_type_str(dst_info->type));
2043 if (dst_part->part->type == EDJE_PART_TYPE_EXTERNAL)
2045 val.name = dst_param;
2046 if (!_edje_external_param_set(NULL, dst_part, &val))
2048 ERR("failed to set parameter '%s' (%s) of part '%s'",
2049 dst_param, edje_external_param_type_str(dst_info->type),
2050 dst_part->part->name);
2056 if (!_edje_param_native_set(dst_part, dst_param, &val))
2058 ERR("failed to set parameter '%s' (%s) of part '%s'",
2059 dst_param, edje_external_param_type_str(dst_info->type),
2060 dst_part->part->name);
2070 _edje_param_set(Edje_Real_Part *part, const char *param, const char *value)
2072 Edje_External_Param val;
2073 const Edje_External_Param_Info *info;
2075 if ((!part) || (!param) || (!value))
2078 if (part->part->type == EDJE_PART_TYPE_EXTERNAL)
2079 info = _edje_external_param_info_get(part->swallowed_object, param);
2081 info = _edje_native_param_info_get(part, param);
2085 ERR("cannot copy, invalid destination parameter '%s' of part '%s'",
2086 param, part->part->name);
2090 val.name = "(temp)";
2091 val.type = EDJE_EXTERNAL_PARAM_TYPE_STRING;
2094 if (!_edje_param_convert(&val, info))
2096 ERR("cannot convert parameter type STRING to requested type %s",
2097 edje_external_param_type_str(info->type));
2101 if (!_edje_param_validate(&val, info))
2103 ERR("incorrect parameter value failed validation for type %s",
2104 edje_external_param_type_str(info->type));
2108 if (part->part->type == EDJE_PART_TYPE_EXTERNAL)
2111 if (!_edje_external_param_set(NULL, part, &val))
2113 ERR("failed to set parameter '%s' (%s) of part '%s'",
2114 param, edje_external_param_type_str(info->type),
2121 if (!_edje_param_native_set(part, param, &val))
2123 ERR("failed to set parameter '%s' (%s) of part '%s'",
2124 param, edje_external_param_type_str(info->type),