1 #include "edje_private.h"
4 * ALREADY EXPORTED BY EMBRYO:
6 * enum Float_Round_Method {
7 * ROUND, FLOOR, CEIL, TOZERO
9 * enum Float_Angle_Mode {
10 * RADIAN, DEGREES, GRADES
14 * getarg(arg, index=0);
15 * setarg(arg, index=0, value);
17 * Float:atof(string[]);
18 * Float:fract(Float:value);
19 * round(Float:value, Float_Round_Method:method=ROUND);
20 * Float:sqrt(Float:value);
21 * Float:pow(Float:value, Float:exponent);
22 * Float:log(Float:value, Float:base=10.0);
23 * Float:sin(Float:value, Float_Angle_Mode:mode=RADIAN);
24 * Float:cos(Float:value, Float_Angle_Mode:mode=RADIAN);
25 * Float:tan(Float:value, Float_Angle_Mode:mode=RADIAN);
26 * Float:abs(Float:value);
28 * fnmatch(glob[], str[]);
29 * strcmp(str1[], str2[]);
30 * strncmp(str1[], str2[]);
31 * strcpy(dst[], src[]);
32 * strncpy(dst[], src[], n);
34 * strcat(dst[], src[]);
35 * strncat(dst[], src[], n);
36 * strprep(dst[], src[]);
37 * strnprep(dst[], src[], n);
38 * strcut(dst[], str[], n, n2);
39 * snprintf(dst[], dstn, fmt[], ...);
40 * strstr(str[], ndl[]);
41 * strchr(str[], ch[]);
42 * strrchr(str[], ch[]);
46 * date(&year, &month, &day, &yearday, &weekday, &hr, &min, &Float:sec);
52 * implemented so far as examples:
55 * MSG_NONE, MSG_STRING, MSG_INT, MSG_FLOAT, MSG_STRING_SET, MSG_INT_SET,
56 * MSG_FLOAT_SET, MSG_STRING_INT, MSG_INT_FLOAT, MSG_STRING_INT_SET,
62 * Float:get_float (id)
63 * set_float(id, Float:v)
65 * get_str(id, dst[], maxlen)
67 * timer(Float:in, fname[], val)
69 * anim(Float:len, fname[], val)
72 * set_state(part_id, state[], Float:state_val)
73 * get_state(part_id, dst[], maxlen, &Float:val)
74 * set_tween_state(part_id, Float:tween, state1[], Float:state1_val, state2[], Float:state2_val)
75 * play_sample(sample_name, speed)
76 * play_tone(tone_name, duration)
77 * run_program(program_id)
78 * Direction:get_drag_dir(part_id)
79 * get_drag(part_id, &Float:dx, &Float:&dy)
80 * set_drag(part_id, Float:dx, Float:dy)
81 * get_drag_size(part_id, &Float:dx, &Float:&dy)
82 * set_drag_size(part_id, Float:dx, Float:dy)
83 * set_text(part_id, str[])
84 * get_text(part_id, dst[], maxlen)
87 * set_color_class(class[], r, g, b, a)
88 * get_color_class(class[], &r, &g, &b, &a)
89 * set_text_class(class[], font[], Float:size)
90 * get_text_class(class[], font[], &Float:size)
91 * get_drag_step(part_id, &Float:dx, &Float:&dy)
92 * set_drag_step(part_id, Float:dx, Float:dy)
93 * get_drag_page(part_id, &Float:dx, &Float:&dy)
94 * set_drag_page(part_id, Float:dx, Float:dy)
95 * get_geometry(part_id, &Float:x, &Float:y, &Float:w, &Float:h)
97 * stop_program(program_id)
98 * stop_programs_on(part_id)
101 * send_message(Msg_Type:type, id, ...)
108 * insert_int(id, n, v)
109 * replace_int(id, n, v)
112 * append_str(id, str[])
113 * prepend_str(id, str[])
114 * insert_str(id, n, str[])
115 * replace_str(id, n, str[])
116 * fetch_str(id, n, dst[], maxlen)
118 * append_float(id, Float:v)
119 * prepend_float(id, Float:v)
120 * insert_float(id, n, Float:v)
121 * replace_float(id, n, Float:v)
122 * Float:fetch_float(id, n)
124 * custom_state(part_id, state[], Float:state_val = 0.0)
125 * set_state_val(part_id, State_Param:param, ...)
126 * get_state_val(part_id, State_Param:param, ...)
128 * Supported parameters:
129 * align[Float:x, Float:y]
133 * aspect[Float:min, Float:max]
139 * rel1[part_id,part_id]
142 * rel2[part_id,part_id]
144 * image[image_id] <- all images have an Id not name in the edje
147 * fill[pos_relx,pos_rely,pos_offx,pos_offy]
148 * fill[sz_relx,sz_rely,sz_offx,sz_offy]
157 * text[align_x,align_y]
162 * map_rot_center[part_id]
171 * ** part_id and program_id need to be able to be "found" from strings
173 * get_drag_count(part_id, &Float:dx, &Float:&dy)
174 * set_drag_count(part_id, Float:dx, Float:dy)
175 * set_drag_confine(part_id, confine_part_id)
177 * resize_request(w, h)
178 * get_mouse_buttons()
179 * //set_type(part_id, Type:type)
180 * //set_effect(part_id, Effect:fx)
181 * set_mouse_events(part_id, ev)
182 * get_mouse_events(part_id)
183 * set_repeat_events(part_id, rep)
184 * get_repeat_events(part_id)
185 * set_clip(part_id, clip_part_id)
188 * part_swallow(part_id, group_name)
190 * external_param_get_int(id, param_name[])
191 * external_param_set_int(id, param_name[], value)
192 * Float:external_param_get_float(id, param_name[])
193 * external_param_set_float(id, param_name[], Float:value)
194 * external_param_get_strlen(id, param_name[])
195 * external_param_get_str(id, param_name[], value[], value_maxlen)
196 * external_param_set_str(id, param_name[], value[])
197 * external_param_get_choice_len(id, param_name[])
198 * external_param_get_choice(id, param_name[], value[], value_maxlen)
199 * external_param_set_choice(id, param_name[], value[])
200 * external_param_get_bool(id, param_name[])
201 * external_param_set_bool(id, param_name[], value)
203 * ADD/DEL CUSTOM OBJECTS UNDER SOLE EMBRYO SCRIPT CONTROL
209 _edje_embryo_fn_get_int(Embryo_Program *ep, Embryo_Cell *params)
214 ed = embryo_program_data_get(ep);
215 return (Embryo_Cell)_edje_var_int_get(ed, (int)params[1]);
220 _edje_embryo_fn_set_int(Embryo_Program *ep, Embryo_Cell *params)
225 ed = embryo_program_data_get(ep);
226 _edje_var_int_set(ed, (int)params[1], (int)params[2]);
232 _edje_embryo_fn_get_float(Embryo_Program *ep, Embryo_Cell *params)
238 ed = embryo_program_data_get(ep);
239 v = (float)_edje_var_float_get(ed, params[1]);
240 return EMBRYO_FLOAT_TO_CELL(v);
243 /* set_float(id, v) */
245 _edje_embryo_fn_set_float(Embryo_Program *ep, Embryo_Cell *params)
251 ed = embryo_program_data_get(ep);
252 v = EMBRYO_CELL_TO_FLOAT(params[2]);
253 _edje_var_float_set(ed, (int)params[1], (double)v);
257 /* get_str(id, dst[], maxlen) */
259 _edje_embryo_fn_get_str(Embryo_Program *ep, Embryo_Cell *params)
265 if (params[3] < 1) return 0;
266 ed = embryo_program_data_get(ep);
267 s = (char *)_edje_var_str_get(ed, (int)params[1]);
270 if ((int) strlen(s) < params[3])
272 SETSTR(s, params[2]);
278 ss = alloca(strlen(s) + 1);
280 ss[params[3] - 1] = 0;
281 SETSTR(ss, params[2]);
286 SETSTR("", params[2]);
293 _edje_embryo_fn_get_strlen(Embryo_Program *ep, Embryo_Cell *params)
299 ed = embryo_program_data_get(ep);
300 s = (char *)_edje_var_str_get(ed, (int)params[1]);
308 /* set_str(id, str[]) */
310 _edje_embryo_fn_set_str(Embryo_Program *ep, Embryo_Cell *params)
316 ed = embryo_program_data_get(ep);
317 GETSTR(s, params[2]);
320 _edje_var_str_set(ed, (int)params[1], s);
327 _edje_embryo_fn_count(Embryo_Program *ep, Embryo_Cell *params)
329 Edje *ed = embryo_program_data_get(ep);
333 return (Embryo_Cell)_edje_var_list_count_get(ed, (int) params[1]);
338 _edje_embryo_fn_remove(Embryo_Program *ep, Embryo_Cell *params)
340 Edje *ed = embryo_program_data_get(ep);
344 _edje_var_list_remove_nth(ed, (int) params[1], (int) params[2]);
349 /* append_int(id, var) */
351 _edje_embryo_fn_append_int(Embryo_Program *ep, Embryo_Cell *params)
353 Edje *ed = embryo_program_data_get(ep);
357 _edje_var_list_int_append(ed, (int) params[1], (int) params[2]);
362 /* prepend_int(id, var) */
364 _edje_embryo_fn_prepend_int(Embryo_Program *ep, Embryo_Cell *params)
366 Edje *ed = embryo_program_data_get(ep);
370 _edje_var_list_int_prepend(ed, (int) params[1], (int) params[2]);
375 /* insert_int(id, pos, var) */
377 _edje_embryo_fn_insert_int(Embryo_Program *ep, Embryo_Cell *params)
379 Edje *ed = embryo_program_data_get(ep);
383 _edje_var_list_int_insert(ed, (int) params[1], (int) params[2],
389 /* replace_int(id, pos, var) */
391 _edje_embryo_fn_replace_int(Embryo_Program *ep, Embryo_Cell *params)
393 Edje *ed = embryo_program_data_get(ep);
397 _edje_var_list_nth_int_set(ed, (int) params[1], (int) params[2],
403 /* fetch_int(id, pos) */
405 _edje_embryo_fn_fetch_int(Embryo_Program *ep, Embryo_Cell *params)
407 Edje *ed = embryo_program_data_get(ep);
411 return _edje_var_list_nth_int_get(ed, (int) params[1],
415 /* append_str(id, str[]) */
417 _edje_embryo_fn_append_str(Embryo_Program *ep, Embryo_Cell *params)
419 Edje *ed = embryo_program_data_get(ep);
424 GETSTR(s, params[2]);
426 _edje_var_list_str_append(ed, (int) params[1], s);
431 /* prepend_str(id, str[]) */
433 _edje_embryo_fn_prepend_str(Embryo_Program *ep, Embryo_Cell *params)
435 Edje *ed = embryo_program_data_get(ep);
440 GETSTR(s, params[2]);
442 _edje_var_list_str_prepend(ed, (int) params[1], s);
447 /* insert_str(id, pos, str[]) */
449 _edje_embryo_fn_insert_str(Embryo_Program *ep, Embryo_Cell *params)
451 Edje *ed = embryo_program_data_get(ep);
456 GETSTR(s, params[3]);
458 _edje_var_list_str_insert(ed, (int) params[1], (int) params[2], s);
463 /* replace_str(id, pos, str[]) */
465 _edje_embryo_fn_replace_str(Embryo_Program *ep, Embryo_Cell *params)
467 Edje *ed = embryo_program_data_get(ep);
472 GETSTR(s, params[3]);
474 _edje_var_list_nth_str_set(ed, (int) params[1], (int) params[2], s);
480 /* fetch_str(id, pos, dst[], maxlen) */
482 _edje_embryo_fn_fetch_str(Embryo_Program *ep, Embryo_Cell *params)
484 Edje *ed = embryo_program_data_get(ep);
489 s = (char *) _edje_var_list_nth_str_get(ed, (int) params[1],
493 if ((int) strlen(s) < params[4])
495 SETSTR(s, params[3]);
501 ss = alloca(strlen(s) + 1);
503 ss[params[4] - 1] = 0;
504 SETSTR(ss, params[3]);
509 SETSTR("", params[3]);
515 /* append_float(id, Float:f) */
517 _edje_embryo_fn_append_float(Embryo_Program *ep, Embryo_Cell *params)
519 Edje *ed = embryo_program_data_get(ep);
524 f = EMBRYO_CELL_TO_FLOAT(params[2]);
525 _edje_var_list_float_append(ed, (int) params[1], f);
530 /* prepend_float(id, Float:f) */
532 _edje_embryo_fn_prepend_float(Embryo_Program *ep, Embryo_Cell *params)
534 Edje *ed = embryo_program_data_get(ep);
539 f = EMBRYO_CELL_TO_FLOAT(params[2]);
540 _edje_var_list_float_prepend(ed, (int) params[1], f);
545 /* insert_float(id, pos, Float:f) */
547 _edje_embryo_fn_insert_float(Embryo_Program *ep, Embryo_Cell *params)
549 Edje *ed = embryo_program_data_get(ep);
554 f = EMBRYO_CELL_TO_FLOAT(params[3]);
555 _edje_var_list_float_insert(ed, (int) params[1], (int) params[2], f);
560 /* replace_float(id, pos, Float:f) */
562 _edje_embryo_fn_replace_float(Embryo_Program *ep, Embryo_Cell *params)
564 Edje *ed = embryo_program_data_get(ep);
568 _edje_var_list_nth_float_set(ed, (int) params[1], (int) params[2],
569 EMBRYO_CELL_TO_FLOAT(params[3]));
574 /* Float:fetch_float(id, pos) */
576 _edje_embryo_fn_fetch_float(Embryo_Program *ep, Embryo_Cell *params)
578 Edje *ed = embryo_program_data_get(ep);
583 f = _edje_var_list_nth_float_get(ed, (int) params[1], (int) params[2]);
585 return EMBRYO_FLOAT_TO_CELL(f);
588 /* timer(Float:in, fname[], val) */
590 _edje_embryo_fn_timer(Embryo_Program *ep, Embryo_Cell *params)
599 ed = embryo_program_data_get(ep);
600 GETSTR(fname, params[2]);
601 if ((!fname)) return 0;
602 f = EMBRYO_CELL_TO_FLOAT(params[1]);
605 return _edje_var_timer_add(ed, in, fname, val);
608 /* cancel_timer(id) */
610 _edje_embryo_fn_cancel_timer(Embryo_Program *ep, Embryo_Cell *params)
616 ed = embryo_program_data_get(ep);
618 if (id <= 0) return 0;
619 _edje_var_timer_del(ed, id);
623 /* anim(Float:len, fname[], val) */
625 _edje_embryo_fn_anim(Embryo_Program *ep, Embryo_Cell *params)
634 ed = embryo_program_data_get(ep);
635 GETSTR(fname, params[2]);
636 if ((!fname)) return 0;
637 f = EMBRYO_CELL_TO_FLOAT(params[1]);
640 return _edje_var_anim_add(ed, len, fname, val);
643 /* cancel_anim(id) */
645 _edje_embryo_fn_cancel_anim(Embryo_Program *ep, Embryo_Cell *params)
651 ed = embryo_program_data_get(ep);
653 if (id <= 0) return 0;
654 _edje_var_anim_del(ed, id);
658 /* set_min_size(Float:w, Float:h) */
660 _edje_embryo_fn_set_min_size(Embryo_Program *ep, Embryo_Cell *params)
664 double w = 0.0, h = 0.0;
667 ed = embryo_program_data_get(ep);
668 f = EMBRYO_CELL_TO_FLOAT(params[1]);
670 f = EMBRYO_CELL_TO_FLOAT(params[2]);
673 if (w < 0.0) w = 0.0;
674 if (h < 0.0) h = 0.0;
675 ed->collection->prop.min.w = w;
676 ed->collection->prop.min.h = h;
679 #ifdef EDJE_CALC_CACHE
680 ed->all_part_change = 1;
686 /* set_max_size(Float:w, Float:h) */
688 _edje_embryo_fn_set_max_size(Embryo_Program *ep, Embryo_Cell *params)
692 double w = 0.0, h = 0.0;
695 ed = embryo_program_data_get(ep);
696 f = EMBRYO_CELL_TO_FLOAT(params[1]);
698 f = EMBRYO_CELL_TO_FLOAT(params[2]);
701 if (w < 0.0) w = 0.0;
702 if (h < 0.0) h = 0.0;
703 ed->collection->prop.max.w = w;
704 ed->collection->prop.max.h = h;
707 #ifdef EDJE_CALC_CACHE
708 ed->all_part_change = 1;
715 /* stop_program(program_id) */
717 _edje_embryo_fn_stop_program(Embryo_Program *ep, Embryo_Cell *params)
721 Edje_Running_Program *runp;
725 ed = embryo_program_data_get(ep);
726 program_id = params[1];
727 if (program_id < 0) return 0;
729 ed->walking_actions = 1;
731 EINA_LIST_FOREACH(ed->actions, l, runp)
732 if (program_id == runp->program->id)
733 _edje_program_end(ed, runp);
735 ed->walking_actions = 0;
740 /* stop_programs_on(part_id) */
742 _edje_embryo_fn_stop_programs_on(Embryo_Program *ep, Embryo_Cell *params)
750 ed = embryo_program_data_get(ep);
752 if (part_id < 0) return 0;
753 rp = ed->table_parts[part_id % ed->table_parts_size];
756 /* there is only ever 1 program acting on a part at any time */
757 if (rp->program) _edje_program_end(ed, rp->program);
762 /* get_mouse(&x, &y) */
764 _edje_embryo_fn_get_mouse(Embryo_Program *ep, Embryo_Cell *params)
767 Evas_Coord x = 0, y = 0;
770 ed = embryo_program_data_get(ep);
771 evas_pointer_canvas_xy_get(ed->base.evas, &x, &y);
774 SETINT((int)x, params[1]);
775 SETINT((int)y, params[2]);
779 /* get_mouse_buttons() */
781 _edje_embryo_fn_get_mouse_buttons(Embryo_Program *ep, Embryo_Cell *params)
786 ed = embryo_program_data_get(ep);
787 return evas_pointer_button_down_mask_get(ed->base.evas);
790 /* emit(sig[], src[]) */
792 _edje_embryo_fn_emit(Embryo_Program *ep, Embryo_Cell *params)
795 char *sig = NULL, *src = NULL;
798 ed = embryo_program_data_get(ep);
799 GETSTR(sig, params[1]);
800 GETSTR(src, params[2]);
801 if ((!sig) || (!src)) return 0;
802 _edje_emit(ed, sig, src);
806 /* get_part_id(part[]) */
808 _edje_embryo_fn_get_part_id(Embryo_Program *ep, Embryo_Cell *params)
811 Edje_Part_Collection *col;
817 ed = embryo_program_data_get(ep);
818 GETSTR(p, params[1]);
820 col = ed->collection;
823 for (i = 0; i < col->parts_count; i++, part++)
825 if (!(*part)->name) continue;
826 if (!strcmp((*part)->name, p)) return (*part)->id;
831 /* get_program_id(program[]) */
833 _edje_embryo_fn_get_program_id(Embryo_Program *ep, Embryo_Cell *params)
841 ed = embryo_program_data_get(ep);
842 GETSTR(p, params[1]);
844 prog = ed->table_programs;
845 if (!prog) return -1;
846 for (i = 0; i < ed->table_programs_size; i++, prog++)
848 if (!(*prog)->name) continue;
849 if (!strcmp((*prog)->name, p)) return (*prog)->id;
855 _edje_embryo_fn_play_sample(Embryo_Program *ep, Embryo_Cell *params)
858 char *sample_name = NULL;
862 ed = embryo_program_data_get(ep);
863 GETSTR(sample_name, params[1]);
864 if ((!sample_name)) return 0;
865 speed = EMBRYO_CELL_TO_FLOAT(params[2]);
866 _edje_multisense_internal_sound_sample_play(ed, sample_name, (double)speed);
871 _edje_embryo_fn_play_tone(Embryo_Program *ep, Embryo_Cell *params)
874 char *tone_name = NULL;
875 float duration = 0.1;
878 ed = embryo_program_data_get(ep);
879 GETSTR(tone_name, params[1]);
880 if ((!tone_name)) return 0;
881 duration = EMBRYO_CELL_TO_FLOAT(params[2]);
882 _edje_multisense_internal_sound_tone_play(ed, tone_name, (double) duration);
886 /* set_state(part_id, state[], Float:state_val) */
888 _edje_embryo_fn_set_state(Embryo_Program *ep, Embryo_Cell *params)
897 if (!(HASNPARAMS(2) || HASNPARAMS(3))) return -1;
899 ed = embryo_program_data_get(ep);
900 GETSTR(state, params[2]);
901 if ((!state)) return 0;
903 if (part_id < 0) return 0;
906 f = EMBRYO_CELL_TO_FLOAT(params[3]);
911 rp = ed->table_parts[part_id % ed->table_parts_size];
914 if (rp->program) _edje_program_end(ed, rp->program);
915 _edje_part_description_apply(ed, rp, state, value, NULL, 0.0);
916 _edje_part_pos_set(ed, rp, EDJE_TWEEN_MODE_LINEAR, ZERO, ZERO, ZERO);
922 /* get_state(part_id, dst[], maxlen, &Float:val) */
924 _edje_embryo_fn_get_state(Embryo_Program *ep, Embryo_Cell *params)
932 ed = embryo_program_data_get(ep);
934 if (part_id < 0) return 0;
935 rp = ed->table_parts[part_id % ed->table_parts_size];
936 if (rp->chosen_description)
938 SETFLOAT(rp->chosen_description->state.value, params[4]);
939 s = rp->chosen_description->state.name;
942 if ((int) strlen(s) < params[3])
944 SETSTR(s, params[2]);
950 ss = alloca(strlen(s) + 1);
952 ss[params[3] - 1] = 0;
953 SETSTR(ss, params[2]);
958 SETSTR("", params[2]);
963 SETFLOAT(0.0, params[4]);
964 SETSTR("", params[2]);
969 /* set_tween_state(part_id, Float:tween, state1[], Float:state1_val, state2[], Float:state2_val) */
971 _edje_embryo_fn_set_tween_state(Embryo_Program *ep, Embryo_Cell *params)
974 char *state1 = NULL, *state2 = NULL;
977 double tween = 0.0, value1 = 0.0, value2 = 0.0;
981 ed = embryo_program_data_get(ep);
982 GETSTR(state1, params[3]);
983 GETSTR(state2, params[5]);
984 if ((!state1) || (!state2)) return 0;
986 if (part_id < 0) return 0;
987 f = EMBRYO_CELL_TO_FLOAT(params[2]);
989 f = EMBRYO_CELL_TO_FLOAT(params[4]);
991 f = EMBRYO_CELL_TO_FLOAT(params[6]);
993 rp = ed->table_parts[part_id % ed->table_parts_size];
996 if (rp->program) _edje_program_end(ed, rp->program);
997 _edje_part_description_apply(ed, rp, state1, value1, state2, value2);
998 _edje_part_pos_set(ed, rp, EDJE_TWEEN_MODE_LINEAR, FROM_DOUBLE(tween), ZERO, ZERO);
1004 /* run_program(program_id) */
1006 _edje_embryo_fn_run_program(Embryo_Program *ep, Embryo_Cell *params)
1013 ed = embryo_program_data_get(ep);
1014 program_id = params[1];
1015 if (program_id < 0) return 0;
1016 pr = ed->table_programs[program_id % ed->table_programs_size];
1019 _edje_program_run(ed, pr, 0, "", "");
1024 /* get_drag_dir(part_id) */
1026 _edje_embryo_fn_get_drag_dir(Embryo_Program *ep, Embryo_Cell *params)
1033 ed = embryo_program_data_get(ep);
1034 part_id = params[1];
1035 if (part_id < 0) return 0;
1036 rp = ed->table_parts[part_id % ed->table_parts_size];
1037 return edje_object_part_drag_dir_get(ed->obj, rp->part->name);
1040 /* get_drag(part_id, &Float:dx, &Float:dy) */
1042 _edje_embryo_fn_get_drag(Embryo_Program *ep, Embryo_Cell *params)
1047 double dx = 0.0, dy = 0.0;
1050 ed = embryo_program_data_get(ep);
1051 part_id = params[1];
1052 if (part_id < 0) return 0;
1053 rp = ed->table_parts[part_id % ed->table_parts_size];
1054 edje_object_part_drag_value_get(ed->obj, rp->part->name, &dx, &dy);
1055 SETFLOAT(dx, params[2]);
1056 SETFLOAT(dy, params[3]);
1061 /* set_drag(part_id, Float:dx, Float:dy) */
1063 _edje_embryo_fn_set_drag(Embryo_Program *ep, Embryo_Cell *params)
1070 ed = embryo_program_data_get(ep);
1071 part_id = params[1];
1072 if (part_id < 0) return 0;
1073 rp = ed->table_parts[part_id % ed->table_parts_size];
1074 edje_object_part_drag_value_set(ed->obj, rp->part->name,
1075 (double)EMBRYO_CELL_TO_FLOAT(params[2]),
1076 (double)EMBRYO_CELL_TO_FLOAT(params[3]));
1080 /* get_drag_size(part_id, &Float:dx, &Float:dy) */
1082 _edje_embryo_fn_get_drag_size(Embryo_Program *ep, Embryo_Cell *params)
1087 double dx = 0.0, dy = 0.0;
1090 ed = embryo_program_data_get(ep);
1091 part_id = params[1];
1092 if (part_id < 0) return 0;
1093 rp = ed->table_parts[part_id % ed->table_parts_size];
1094 edje_object_part_drag_size_get(ed->obj, rp->part->name, &dx, &dy);
1095 SETFLOAT(dx, params[2]);
1096 SETFLOAT(dy, params[3]);
1101 /* set_drag_size(part_id, Float:dx, Float:dy) */
1103 _edje_embryo_fn_set_drag_size(Embryo_Program *ep, Embryo_Cell *params)
1110 ed = embryo_program_data_get(ep);
1111 part_id = params[1];
1112 if (part_id < 0) return 0;
1113 rp = ed->table_parts[part_id % ed->table_parts_size];
1114 edje_object_part_drag_size_set(ed->obj, rp->part->name,
1115 (double)EMBRYO_CELL_TO_FLOAT(params[2]),
1116 (double)EMBRYO_CELL_TO_FLOAT(params[3]));
1120 /* set_text(part_id, str[]) */
1122 _edje_embryo_fn_set_text(Embryo_Program *ep, Embryo_Cell *params)
1130 ed = embryo_program_data_get(ep);
1131 part_id = params[1];
1132 if (part_id < 0) return 0;
1133 rp = ed->table_parts[part_id % ed->table_parts_size];
1134 GETSTR(s, params[2]);
1136 edje_object_part_text_set(ed->obj, rp->part->name, s);
1141 /* get_text(part_id, dst[], maxlen) */
1143 _edje_embryo_fn_get_text(Embryo_Program *ep, Embryo_Cell *params)
1151 ed = embryo_program_data_get(ep);
1152 part_id = params[1];
1153 if (part_id < 0) return 0;
1154 rp = ed->table_parts[part_id % ed->table_parts_size];
1155 s = (char *)edje_object_part_text_get(ed->obj, rp->part->name);
1158 if ((int) strlen(s) < params[3])
1160 SETSTR(s, params[2]);
1166 ss = alloca(strlen(s) + 1);
1168 ss[params[3] - 1] = 0;
1169 SETSTR(ss, params[2]);
1174 SETSTR("", params[2]);
1179 /* get_min_size(&w, &h) */
1181 _edje_embryo_fn_get_min_size(Embryo_Program *ep, Embryo_Cell *params)
1184 Evas_Coord w = 0, h = 0;
1187 ed = embryo_program_data_get(ep);
1188 edje_object_size_min_get(ed->obj, &w, &h);
1189 SETINT(w, params[1]);
1190 SETINT(h, params[2]);
1194 /* get_max_size(&w, &h) */
1196 _edje_embryo_fn_get_max_size(Embryo_Program *ep, Embryo_Cell *params)
1199 Evas_Coord w = 0, h = 0;
1202 ed = embryo_program_data_get(ep);
1203 edje_object_size_max_get(ed->obj, &w, &h);
1204 SETINT(w, params[1]);
1205 SETINT(h, params[2]);
1210 /* get_color_class(class[], &r, &g, &b, &a) */
1212 _edje_embryo_fn_get_color_class(Embryo_Program *ep, Embryo_Cell *params)
1215 Edje_Color_Class *c_class;
1219 ed = embryo_program_data_get(ep);
1220 GETSTR(class, params[1]);
1221 if (!class) return 0;
1222 c_class = _edje_color_class_find(ed, class);
1223 if (!c_class) return 0;
1224 SETINT(c_class->r, params[2]);
1225 SETINT(c_class->g, params[3]);
1226 SETINT(c_class->b, params[4]);
1227 SETINT(c_class->a, params[5]);
1231 /* set_color_class(class[], r, g, b, a) */
1233 _edje_embryo_fn_set_color_class(Embryo_Program *ep, Embryo_Cell *params)
1239 ed = embryo_program_data_get(ep);
1240 GETSTR(class, params[1]);
1241 if (!class) return 0;
1242 edje_object_color_class_set(ed->obj, class, params[2], params[3], params[4], params[5],
1243 params[2], params[3], params[4], params[5],
1244 params[2], params[3], params[4], params[5]);
1248 /* set_text_class(class[], font[], Float:size) */
1250 _edje_embryo_fn_set_text_class(Embryo_Program *ep, Embryo_Cell *params)
1254 Evas_Font_Size fsize;
1257 ed = embryo_program_data_get(ep);
1258 GETSTR(class, params[1]);
1259 GETSTR(font, params[2]);
1260 if( !class || !font ) return 0;
1261 fsize = (Evas_Font_Size) EMBRYO_CELL_TO_FLOAT(params[3]);
1262 edje_object_text_class_set(ed->obj, class, font, fsize);
1266 /* get_text_class(class[], font[], &Float:size) */
1268 _edje_embryo_fn_get_text_class(Embryo_Program *ep, Embryo_Cell *params)
1272 Edje_Text_Class *t_class;
1275 ed = embryo_program_data_get(ep);
1276 GETSTR(class, params[1]);
1277 if (!class) return 0;
1278 t_class = _edje_text_class_find(ed, class);
1279 if (!t_class) return 0;
1280 SETSTR((char *)t_class->font, params[2]);
1281 SETFLOAT(t_class->size, params[3]);
1285 /* get_drag_step(part_id, &Float:dx, &Float:&dy) */
1287 _edje_embryo_fn_get_drag_step(Embryo_Program *ep, Embryo_Cell *params)
1292 double dx = 0.0, dy = 0.0;
1295 ed = embryo_program_data_get(ep);
1296 part_id = params[1];
1297 if (part_id < 0) return 0;
1298 rp = ed->table_parts[part_id % ed->table_parts_size];
1299 edje_object_part_drag_step_get(ed->obj, rp->part->name, &dx, &dy);
1300 SETFLOAT(dx, params[2]);
1301 SETFLOAT(dy, params[3]);
1306 /* set_drag_step(part_id, Float:dx, Float:dy) */
1308 _edje_embryo_fn_set_drag_step(Embryo_Program *ep, Embryo_Cell *params)
1315 ed = embryo_program_data_get(ep);
1316 part_id = params[1];
1317 if (part_id < 0) return 0;
1318 rp = ed->table_parts[part_id % ed->table_parts_size];
1319 edje_object_part_drag_step_set(ed->obj, rp->part->name,
1320 (double)EMBRYO_CELL_TO_FLOAT(params[2]),
1321 (double)EMBRYO_CELL_TO_FLOAT(params[3]));
1325 /* get_drag_page(part_id, &Float:dx, &Float:&dy) */
1327 _edje_embryo_fn_get_drag_page(Embryo_Program *ep, Embryo_Cell *params)
1332 double dx = 0.0, dy = 0.0;
1335 ed = embryo_program_data_get(ep);
1336 part_id = params[1];
1337 if (part_id < 0) return 0;
1338 rp = ed->table_parts[part_id % ed->table_parts_size];
1339 edje_object_part_drag_page_get(ed->obj, rp->part->name, &dx, &dy);
1340 SETFLOAT(dx, params[2]);
1341 SETFLOAT(dy, params[3]);
1346 /* get_geometry(pard_id, &x, &y, &w, &h) */
1348 _edje_embryo_fn_get_geometry(Embryo_Program *ep, Embryo_Cell *params)
1353 Evas_Coord x = 0.0, y = 0.0, w = 0.0, h = 0.0;
1356 ed = embryo_program_data_get(ep);
1357 part_id = params[1];
1358 if (part_id < 0) return 0;
1359 rp = ed->table_parts[part_id % ed->table_parts_size];
1360 edje_object_part_geometry_get(ed->obj, rp->part->name, &x, &y, &w, &h);
1361 SETINT(x, params[2]);
1362 SETINT(y, params[3]);
1363 SETINT(w, params[4]);
1364 SETINT(h, params[5]);
1369 /* set_drag_page(part_id, Float:dx, Float:dy) */
1371 _edje_embryo_fn_set_drag_page(Embryo_Program *ep, Embryo_Cell *params)
1378 ed = embryo_program_data_get(ep);
1379 part_id = params[1];
1380 if (part_id < 0) return 0;
1381 rp = ed->table_parts[part_id % ed->table_parts_size];
1382 edje_object_part_drag_page_set(ed->obj, rp->part->name,
1383 (double)EMBRYO_CELL_TO_FLOAT(params[2]),
1384 (double)EMBRYO_CELL_TO_FLOAT(params[3]));
1388 /* send_message(Msg_Type:type, id,...); */
1390 _edje_embryo_fn_send_message(Embryo_Program *ep, Embryo_Cell *params)
1393 Edje_Message_Type type;
1397 if (params[0] < (int) (sizeof(Embryo_Cell) * (2))) return 0;
1398 ed = embryo_program_data_get(ep);
1403 case EDJE_MESSAGE_NONE:
1404 _edje_message_send(ed, EDJE_QUEUE_APP, type, id, NULL);
1406 case EDJE_MESSAGE_SIGNAL:
1408 case EDJE_MESSAGE_STRING:
1412 cptr = embryo_data_address_get(ep, params[3]);
1415 Edje_Message_String *emsg;
1419 l = embryo_data_string_length_get(ep, cptr);
1422 embryo_data_string_get(ep, cptr, s);
1423 emsg = alloca(sizeof(Edje_Message_String));
1425 _edje_message_send(ed, EDJE_QUEUE_APP, type, id, emsg);
1429 case EDJE_MESSAGE_INT:
1431 Edje_Message_Int *emsg;
1433 emsg = alloca(sizeof(Edje_Message_Int));
1434 ptr = embryo_data_address_get(ep, params[3]);
1435 if (ptr) emsg->val = (int)*ptr;
1437 _edje_message_send(ed, EDJE_QUEUE_APP, type, id, emsg);
1440 case EDJE_MESSAGE_FLOAT:
1442 Edje_Message_Float *emsg;
1445 emsg = alloca(sizeof(Edje_Message_Float));
1446 ptr = embryo_data_address_get(ep, params[3]);
1449 f = EMBRYO_CELL_TO_FLOAT(*ptr);
1450 emsg->val = (double)f;
1454 _edje_message_send(ed, EDJE_QUEUE_APP, type, id, emsg);
1457 case EDJE_MESSAGE_STRING_SET:
1459 Edje_Message_String_Set *emsg;
1461 n = (params[0] / sizeof(Embryo_Cell)) + 1;
1462 emsg = alloca(sizeof(Edje_Message_String_Set) + ((n - 3 - 1) * sizeof(char *)));
1463 emsg->count = n - 3;
1464 for (i = 3; i < n; i++)
1468 cptr = embryo_data_address_get(ep, params[i]);
1474 l = embryo_data_string_length_get(ep, cptr);
1477 embryo_data_string_get(ep, cptr, s);
1478 emsg->str[i - 3] = s;
1481 _edje_message_send(ed, EDJE_QUEUE_APP, type, id, emsg);
1484 case EDJE_MESSAGE_INT_SET:
1486 Edje_Message_Int_Set *emsg;
1488 n = (params[0] / sizeof(Embryo_Cell)) + 1;
1489 emsg = alloca(sizeof(Edje_Message_Int_Set) + ((n - 3 - 1) * sizeof(int)));
1490 emsg->count = n - 3;
1491 for (i = 3; i < n; i++)
1493 ptr = embryo_data_address_get(ep, params[i]);
1494 if (ptr) emsg->val[i - 3] = (int)*ptr;
1495 else emsg->val[i - 3] = 0;
1497 _edje_message_send(ed, EDJE_QUEUE_APP, type, id, emsg);
1500 case EDJE_MESSAGE_FLOAT_SET:
1502 Edje_Message_Float_Set *emsg;
1504 n = (params[0] / sizeof(Embryo_Cell)) + 1;
1505 emsg = alloca(sizeof(Edje_Message_Float_Set) + ((n - 3 - 1) * sizeof(double)));
1506 emsg->count = n - 3;
1507 for (i = 3; i < n; i++)
1511 ptr = embryo_data_address_get(ep, params[i]);
1514 f = EMBRYO_CELL_TO_FLOAT(*ptr);
1515 emsg->val[i - 3] = (double)f;
1518 emsg->val[i - 3] = 0.0;
1520 _edje_message_send(ed, EDJE_QUEUE_APP, type, id, emsg);
1523 case EDJE_MESSAGE_STRING_INT:
1525 Edje_Message_String_Int *emsg;
1528 cptr = embryo_data_address_get(ep, params[3]);
1534 l = embryo_data_string_length_get(ep, cptr);
1537 embryo_data_string_get(ep, cptr, s);
1538 emsg = alloca(sizeof(Edje_Message_String_Int));
1540 ptr = embryo_data_address_get(ep, params[4]);
1541 if (ptr) emsg->val = (int)*ptr;
1543 _edje_message_send(ed, EDJE_QUEUE_APP, type, id, emsg);
1547 case EDJE_MESSAGE_STRING_FLOAT:
1549 Edje_Message_String_Float *emsg;
1552 cptr = embryo_data_address_get(ep, params[3]);
1559 l = embryo_data_string_length_get(ep, cptr);
1562 embryo_data_string_get(ep, cptr, s);
1563 emsg = alloca(sizeof(Edje_Message_String_Float));
1565 ptr = embryo_data_address_get(ep, params[4]);
1568 f = EMBRYO_CELL_TO_FLOAT(*ptr);
1569 emsg->val = (double)f;
1573 _edje_message_send(ed, EDJE_QUEUE_APP, type, id, emsg);
1577 case EDJE_MESSAGE_STRING_INT_SET:
1579 Edje_Message_String_Int_Set *emsg;
1582 cptr = embryo_data_address_get(ep, params[3]);
1588 l = embryo_data_string_length_get(ep, cptr);
1591 embryo_data_string_get(ep, cptr, s);
1592 n = (params[0] / sizeof(Embryo_Cell)) + 1;
1593 emsg = alloca(sizeof(Edje_Message_String_Int_Set) + ((n - 4 - 1) * sizeof(int)));
1595 emsg->count = n - 4;
1596 for (i = 4; i < n; i++)
1598 ptr = embryo_data_address_get(ep, params[i]);
1599 if (ptr) emsg->val[i - 4] = (int)*ptr;
1600 else emsg->val[i - 4] = 0;
1602 _edje_message_send(ed, EDJE_QUEUE_APP, type, id, emsg);
1606 case EDJE_MESSAGE_STRING_FLOAT_SET:
1608 Edje_Message_String_Float_Set *emsg;
1611 cptr = embryo_data_address_get(ep, params[3]);
1617 l = embryo_data_string_length_get(ep, cptr);
1620 embryo_data_string_get(ep, cptr, s);
1621 n = (params[0] / sizeof(Embryo_Cell)) + 1;
1622 emsg = alloca(sizeof(Edje_Message_String_Float_Set) + ((n - 4 - 1) * sizeof(double)));
1624 emsg->count = n - 4;
1625 for (i = 4; i < n; i++)
1629 ptr = embryo_data_address_get(ep, params[i]);
1632 f = EMBRYO_CELL_TO_FLOAT(*ptr);
1633 emsg->val[i - 4] = (double)f;
1636 emsg->val[i - 4] = 0.0;
1638 _edje_message_send(ed, EDJE_QUEUE_APP, type, id, emsg);
1648 /* custom_state(part_id, state[], Float:state_val = 0.0) */
1650 _edje_embryo_fn_custom_state(Embryo_Program *ep, Embryo_Cell *params)
1652 Edje *ed = embryo_program_data_get(ep);
1654 Edje_Part_Description_Common *parent, *d = NULL;
1663 if (!(rp = ed->table_parts[params[1] % ed->table_parts_size]))
1666 /* check whether this part already has a "custom" state */
1670 GETSTR(name, params[2]);
1674 val = EMBRYO_CELL_TO_FLOAT(params[3]);
1676 if (!(parent = _edje_part_description_find(ed, rp, name, val)))
1679 /* now create the custom state */
1680 switch (rp->part->type)
1682 #define ALLOC_DESC(Short, Type, To) \
1683 case EDJE_PART_TYPE_##Short: To = calloc(1, sizeof (Edje_Part_Description_##Type)); break;
1685 #define ALLOC_COPY_DESC(Short, Type, To, Spec) \
1686 case EDJE_PART_TYPE_##Short: \
1688 Edje_Part_Description_##Type *tmp; \
1689 Edje_Part_Description_##Type *new; \
1691 tmp = (Edje_Part_Description_##Type *) parent; \
1693 new = calloc(1, sizeof (Edje_Part_Description_##Type)); \
1694 new->Spec = tmp->Spec; \
1699 ALLOC_DESC(RECTANGLE, Common, d);
1700 ALLOC_DESC(SPACER, Common, d);
1701 ALLOC_DESC(SWALLOW, Common, d);
1702 ALLOC_DESC(GROUP, Common, d);
1704 ALLOC_COPY_DESC(IMAGE, Image, d, image);
1705 ALLOC_COPY_DESC(PROXY, Proxy, d, proxy);
1706 ALLOC_COPY_DESC(TEXT, Text, d, text);
1707 ALLOC_COPY_DESC(TEXTBLOCK, Text, d, text);
1708 ALLOC_COPY_DESC(BOX, Box, d, box);
1709 ALLOC_COPY_DESC(TABLE, Table, d, table);
1710 ALLOC_COPY_DESC(EXTERNAL, External, d, external_params);
1715 rp->custom = eina_mempool_malloc(_edje_real_part_state_mp, sizeof (Edje_Real_Part_State));
1722 memset(rp->custom, 0, sizeof (Edje_Real_Part_State));
1726 d->state.name = (char *)eina_stringshare_add("custom");
1727 d->state.value = 0.0;
1729 /* make sure all the allocated memory is getting copied,
1730 * not just referenced
1732 if (rp->part->type == EDJE_PART_TYPE_IMAGE)
1734 Edje_Part_Description_Image *img_desc;
1735 Edje_Part_Description_Image *parent_img_desc;
1737 img_desc = (Edje_Part_Description_Image*) d;
1738 parent_img_desc = (Edje_Part_Description_Image*) parent;
1740 img_desc->image.tweens_count = parent_img_desc->image.tweens_count;
1741 img_desc->image.tweens = calloc(img_desc->image.tweens_count,
1742 sizeof(Edje_Part_Image_Id*));
1743 if (img_desc->image.tweens)
1747 for (i = 0; i < parent_img_desc->image.tweens_count; ++i)
1749 Edje_Part_Image_Id *iid_new;
1751 iid_new = calloc(1, sizeof(Edje_Part_Image_Id));
1752 if (!iid_new) continue;
1754 *iid_new = *parent_img_desc->image.tweens[i];
1756 img_desc->image.tweens[i] = iid_new;
1761 #define DUP(x) x ? (char *)eina_stringshare_add(x) : NULL
1762 d->color_class = DUP(d->color_class);
1764 if (rp->part->type == EDJE_PART_TYPE_TEXT
1765 || rp->part->type == EDJE_PART_TYPE_TEXTBLOCK)
1767 Edje_Part_Description_Text *text_desc;
1769 text_desc = (Edje_Part_Description_Text*) d;
1771 text_desc->text.text_class = DUP(text_desc->text.text_class);
1772 text_desc->text.text.str = DUP(edje_string_get(&text_desc->text.text));
1773 text_desc->text.text.id = 0;
1774 text_desc->text.font.str = DUP(edje_string_get(&text_desc->text.font));
1775 text_desc->text.font.id = 0;
1776 text_desc->text.style.str = DUP(edje_string_get(&text_desc->text.style));
1777 text_desc->text.style.id = 0;
1781 rp->custom->description = d;
1786 /* set_state_val(part_id, State_Param:p, ...) */
1788 _edje_embryo_fn_set_state_val(Embryo_Program *ep, Embryo_Cell *params)
1790 Edje *ed = embryo_program_data_get(ep);
1794 /* we need at least 3 arguments */
1795 if (params[0] < (int) (sizeof(Embryo_Cell) * 3))
1801 if (!(rp = ed->table_parts[params[1] % ed->table_parts_size]))
1804 /* check whether this part has a "custom" state */
1810 case EDJE_STATE_PARAM_ALIGNMENT:
1813 GETFLOAT_T(rp->custom->description->align.x, params[3]);
1814 GETFLOAT_T(rp->custom->description->align.y, params[4]);
1817 case EDJE_STATE_PARAM_MIN:
1820 GETINT(rp->custom->description->min.w, params[3]);
1821 GETINT(rp->custom->description->min.h, params[4]);
1824 case EDJE_STATE_PARAM_MAX:
1827 GETINT(rp->custom->description->max.w, params[3]);
1828 GETINT(rp->custom->description->max.h, params[4]);
1831 case EDJE_STATE_PARAM_STEP:
1834 GETINT(rp->custom->description->step.x, params[3]);
1835 GETINT(rp->custom->description->step.y, params[4]);
1838 case EDJE_STATE_PARAM_ASPECT:
1841 GETFLOAT_T(rp->custom->description->aspect.min, params[3]);
1842 GETFLOAT_T(rp->custom->description->aspect.max, params[4]);
1845 case EDJE_STATE_PARAM_ASPECT_PREF:
1848 GETINT(rp->custom->description->aspect.prefer, params[3]);
1851 case EDJE_STATE_PARAM_COLOR:
1854 GETINT(rp->custom->description->color.r, params[3]);
1855 GETINT(rp->custom->description->color.g, params[4]);
1856 GETINT(rp->custom->description->color.b, params[5]);
1857 GETINT(rp->custom->description->color.a, params[6]);
1860 case EDJE_STATE_PARAM_COLOR2:
1863 GETINT(rp->custom->description->color2.r, params[3]);
1864 GETINT(rp->custom->description->color2.g, params[4]);
1865 GETINT(rp->custom->description->color2.b, params[5]);
1866 GETINT(rp->custom->description->color2.a, params[6]);
1869 case EDJE_STATE_PARAM_COLOR3:
1871 Edje_Part_Description_Text *text;
1873 if ( (rp->part->type != EDJE_PART_TYPE_TEXT) &&
1874 (rp->part->type != EDJE_PART_TYPE_TEXTBLOCK))
1879 text = (Edje_Part_Description_Text*) rp->custom->description;
1881 GETINT(text->text.color3.r, params[3]);
1882 GETINT(text->text.color3.g, params[4]);
1883 GETINT(text->text.color3.b, params[5]);
1884 GETINT(text->text.color3.a, params[6]);
1887 case EDJE_STATE_PARAM_COLOR_CLASS:
1890 GETSTR(s, params[3]);
1891 GETSTREVAS(s, rp->custom->description->color_class);
1894 case EDJE_STATE_PARAM_REL1:
1897 GETFLOAT_T(rp->custom->description->rel1.relative_x, params[3]);
1898 GETFLOAT_T(rp->custom->description->rel1.relative_y, params[4]);
1901 case EDJE_STATE_PARAM_REL1_TO:
1904 GETINT(rp->custom->description->rel1.id_x, params[3]);
1905 GETINT(rp->custom->description->rel1.id_y, params[4]);
1907 if (rp->param1.description->rel1.id_x >= 0)
1908 rp->param1.rel1_to_x = ed->table_parts[rp->param1.description->rel1.id_x % ed->table_parts_size];
1909 if (rp->param1.description->rel1.id_y >= 0)
1910 rp->param1.rel1_to_y = ed->table_parts[rp->param1.description->rel1.id_y % ed->table_parts_size];
1913 case EDJE_STATE_PARAM_REL1_OFFSET:
1916 GETINT(rp->custom->description->rel1.offset_x, params[3]);
1917 GETINT(rp->custom->description->rel1.offset_y, params[4]);
1920 case EDJE_STATE_PARAM_REL2:
1923 GETFLOAT_T(rp->custom->description->rel2.relative_x, params[3]);
1924 GETFLOAT_T(rp->custom->description->rel2.relative_y, params[4]);
1927 case EDJE_STATE_PARAM_REL2_TO:
1930 GETINT(rp->custom->description->rel2.id_x, params[3]);
1931 GETINT(rp->custom->description->rel2.id_y, params[4]);
1933 if (rp->param1.description->rel2.id_x >= 0)
1934 rp->param1.rel2_to_x = ed->table_parts[rp->param1.description->rel2.id_x % ed->table_parts_size];
1935 if (rp->param1.description->rel2.id_y >= 0)
1936 rp->param1.rel2_to_y = ed->table_parts[rp->param1.description->rel2.id_y % ed->table_parts_size];
1939 case EDJE_STATE_PARAM_REL2_OFFSET:
1942 GETINT(rp->custom->description->rel2.offset_x, params[3]);
1943 GETINT(rp->custom->description->rel2.offset_y, params[4]);
1946 case EDJE_STATE_PARAM_IMAGE:
1948 Edje_Part_Description_Image *img;
1950 if ( (rp->part->type != EDJE_PART_TYPE_IMAGE) ) return 0;
1953 img = (Edje_Part_Description_Image*) rp->custom->description;
1954 GETINT(img->image.id, params[3]);
1958 case EDJE_STATE_PARAM_BORDER:
1960 Edje_Part_Description_Image *img;
1962 if ( (rp->part->type != EDJE_PART_TYPE_IMAGE) ) return 0;
1965 img = (Edje_Part_Description_Image*) rp->custom->description;
1967 GETINT(img->image.border.l, params[3]);
1968 GETINT(img->image.border.r, params[4]);
1969 GETINT(img->image.border.t, params[5]);
1970 GETINT(img->image.border.b, params[6]);
1974 case EDJE_STATE_PARAM_FILL_SMOOTH:
1976 Edje_Part_Description_Image *img;
1978 if ( (rp->part->type != EDJE_PART_TYPE_IMAGE) ) return 0;
1981 img = (Edje_Part_Description_Image*) rp->custom->description;
1983 GETINT(img->image.fill.smooth, params[3]);
1987 case EDJE_STATE_PARAM_FILL_POS:
1989 Edje_Part_Description_Image *img;
1991 if ( (rp->part->type != EDJE_PART_TYPE_IMAGE) ) return 0;
1994 img = (Edje_Part_Description_Image*) rp->custom->description;
1996 GETFLOAT_T(img->image.fill.pos_rel_x, params[3]);
1997 GETFLOAT_T(img->image.fill.pos_rel_y, params[4]);
1998 GETINT(img->image.fill.pos_abs_x, params[5]);
1999 GETINT(img->image.fill.pos_abs_y, params[6]);
2003 case EDJE_STATE_PARAM_FILL_SIZE:
2005 Edje_Part_Description_Image *img;
2007 if ( (rp->part->type != EDJE_PART_TYPE_IMAGE) ) return 0;
2010 img = (Edje_Part_Description_Image*) rp->custom->description;
2012 GETFLOAT_T(img->image.fill.rel_x, params[3]);
2013 GETFLOAT_T(img->image.fill.rel_y, params[4]);
2014 GETINT(img->image.fill.abs_x, params[5]);
2015 GETINT(img->image.fill.abs_y, params[6]);
2019 case EDJE_STATE_PARAM_TEXT:
2021 Edje_Part_Description_Text *text;
2023 if ( (rp->part->type != EDJE_PART_TYPE_TEXT) &&
2024 (rp->part->type != EDJE_PART_TYPE_TEXTBLOCK))
2028 GETSTR(s, params[3]);
2030 text = (Edje_Part_Description_Text*) rp->custom->description;
2031 GETSTREVAS(s, text->text.text.str);
2035 case EDJE_STATE_PARAM_TEXT_CLASS:
2037 Edje_Part_Description_Text *text;
2039 if ( (rp->part->type != EDJE_PART_TYPE_TEXT) &&
2040 (rp->part->type != EDJE_PART_TYPE_TEXTBLOCK))
2044 GETSTR(s, params[3]);
2046 text = (Edje_Part_Description_Text*) rp->custom->description;
2047 GETSTREVAS(s, text->text.text_class);
2051 case EDJE_STATE_PARAM_TEXT_FONT:
2053 Edje_Part_Description_Text *text;
2055 if ((rp->part->type != EDJE_PART_TYPE_TEXT)) return 0;
2058 GETSTR(s, params[3]);
2060 text = (Edje_Part_Description_Text*) rp->custom->description;
2061 GETSTREVAS(s, text->text.font.str);
2065 case EDJE_STATE_PARAM_TEXT_STYLE:
2067 Edje_Part_Description_Text *text;
2069 if ((rp->part->type != EDJE_PART_TYPE_TEXTBLOCK)) return 0;
2072 GETSTR(s, params[3]);
2074 text = (Edje_Part_Description_Text*) rp->custom->description;
2075 GETSTREVAS(s, text->text.style.str);
2079 case EDJE_STATE_PARAM_TEXT_SIZE:
2081 Edje_Part_Description_Text *text;
2083 if ((rp->part->type != EDJE_PART_TYPE_TEXT)) return 0;
2086 text = (Edje_Part_Description_Text*) rp->custom->description;
2087 GETINT(text->text.size, params[3]);
2091 case EDJE_STATE_PARAM_TEXT_FIT:
2093 Edje_Part_Description_Text *text;
2095 if ((rp->part->type != EDJE_PART_TYPE_TEXT)) return 0;
2098 text = (Edje_Part_Description_Text*) rp->custom->description;
2100 GETINT(text->text.fit_x, params[3]);
2101 GETINT(text->text.fit_y, params[4]);
2105 case EDJE_STATE_PARAM_TEXT_MIN:
2107 Edje_Part_Description_Text *text;
2109 if ( (rp->part->type != EDJE_PART_TYPE_TEXT) &&
2110 (rp->part->type != EDJE_PART_TYPE_TEXTBLOCK))
2114 text = (Edje_Part_Description_Text*) rp->custom->description;
2116 GETINT(text->text.min_x, params[3]);
2117 GETINT(text->text.min_y, params[4]);
2121 case EDJE_STATE_PARAM_TEXT_MAX:
2123 Edje_Part_Description_Text *text;
2125 if ( (rp->part->type != EDJE_PART_TYPE_TEXT) &&
2126 (rp->part->type != EDJE_PART_TYPE_TEXTBLOCK))
2130 text = (Edje_Part_Description_Text*) rp->custom->description;
2132 GETINT(text->text.max_x, params[3]);
2133 GETINT(text->text.max_y, params[4]);
2137 case EDJE_STATE_PARAM_TEXT_ALIGN:
2139 Edje_Part_Description_Text *text;
2141 if ((rp->part->type != EDJE_PART_TYPE_TEXT)) return 0;
2144 text = (Edje_Part_Description_Text*) rp->custom->description;
2146 GETFLOAT_T(text->text.align.x, params[3]);
2147 GETFLOAT_T(text->text.align.y, params[4]);
2151 case EDJE_STATE_PARAM_VISIBLE:
2154 GETINT(rp->custom->description->visible, params[3]);
2157 case EDJE_STATE_PARAM_MAP_OM:
2160 GETINT(rp->custom->description->map.on, params[3]);
2163 case EDJE_STATE_PARAM_MAP_PERSP:
2166 GETINT(rp->custom->description->map.id_persp, params[3]);
2169 case EDJE_STATE_PARAM_MAP_LIGNT:
2172 GETINT(rp->custom->description->map.id_light, params[3]);
2175 case EDJE_STATE_PARAM_MAP_ROT_CENTER:
2178 GETINT(rp->custom->description->map.rot.id_center, params[3]);
2181 case EDJE_STATE_PARAM_MAP_ROT_X:
2184 GETFLOAT_T(rp->custom->description->map.rot.x, params[3]);
2187 case EDJE_STATE_PARAM_MAP_ROT_Y:
2190 GETFLOAT_T(rp->custom->description->map.rot.y, params[3]);
2193 case EDJE_STATE_PARAM_MAP_ROT_Z:
2196 GETFLOAT_T(rp->custom->description->map.rot.z, params[3]);
2199 case EDJE_STATE_PARAM_MAP_BACK_CULL:
2202 GETINT(rp->custom->description->map.backcull, params[3]);
2205 case EDJE_STATE_PARAM_MAP_PERSP_ON:
2208 GETINT(rp->custom->description->map.persp_on, params[3]);
2211 case EDJE_STATE_PARAM_PERSP_ZPLANE:
2214 GETINT(rp->custom->description->persp.zplane, params[3]);
2217 case EDJE_STATE_PARAM_PERSP_FOCAL:
2220 GETINT(rp->custom->description->persp.focal, params[3]);
2227 #ifdef EDJE_CALC_CACHE
2234 /* get_state_val(part_id, State_Param:p, ...) */
2236 _edje_embryo_fn_get_state_val(Embryo_Program *ep, Embryo_Cell *params)
2238 Edje *ed = embryo_program_data_get(ep);
2242 /* we need at least 3 arguments */
2243 if (params[0] < (int) (sizeof(Embryo_Cell) * 3))
2249 if (!(rp = ed->table_parts[params[1] % ed->table_parts_size]))
2252 /* check whether this part has a "custom" state */
2258 case EDJE_STATE_PARAM_ALIGNMENT:
2261 SETFLOAT_T(rp->custom->description->align.x, params[3]);
2262 SETFLOAT_T(rp->custom->description->align.y, params[4]);
2265 case EDJE_STATE_PARAM_MIN:
2268 SETINT(rp->custom->description->min.w, params[3]);
2269 SETINT(rp->custom->description->min.h, params[4]);
2272 case EDJE_STATE_PARAM_MAX:
2275 SETINT(rp->custom->description->max.w, params[3]);
2276 SETINT(rp->custom->description->max.h, params[4]);
2279 case EDJE_STATE_PARAM_STEP:
2282 SETINT(rp->custom->description->step.x, params[3]);
2283 SETINT(rp->custom->description->step.y, params[4]);
2286 case EDJE_STATE_PARAM_ASPECT:
2289 SETFLOAT_T(rp->custom->description->aspect.min, params[3]);
2290 SETFLOAT_T(rp->custom->description->aspect.max, params[4]);
2293 case EDJE_STATE_PARAM_ASPECT_PREF:
2296 SETINT(rp->custom->description->aspect.prefer, params[3]);
2299 case EDJE_STATE_PARAM_COLOR:
2302 SETINT(rp->custom->description->color.r, params[3]);
2303 SETINT(rp->custom->description->color.g, params[4]);
2304 SETINT(rp->custom->description->color.b, params[5]);
2305 SETINT(rp->custom->description->color.a, params[6]);
2308 case EDJE_STATE_PARAM_COLOR2:
2311 SETINT(rp->custom->description->color2.r, params[3]);
2312 SETINT(rp->custom->description->color2.g, params[4]);
2313 SETINT(rp->custom->description->color2.b, params[5]);
2314 SETINT(rp->custom->description->color2.a, params[6]);
2317 case EDJE_STATE_PARAM_COLOR3:
2319 Edje_Part_Description_Text *text;
2321 if (rp->part->type == EDJE_PART_TYPE_TEXT
2322 || rp->part->type == EDJE_PART_TYPE_TEXTBLOCK)
2327 text = (Edje_Part_Description_Text*) rp->custom->description;
2329 SETINT(text->text.color3.r, params[3]);
2330 SETINT(text->text.color3.g, params[4]);
2331 SETINT(text->text.color3.b, params[5]);
2332 SETINT(text->text.color3.a, params[6]);
2336 case EDJE_STATE_PARAM_COLOR_CLASS:
2339 s = rp->custom->description->color_class;
2343 case EDJE_STATE_PARAM_REL1:
2346 SETFLOAT_T(rp->custom->description->rel1.relative_x, params[3]);
2347 SETFLOAT_T(rp->custom->description->rel1.relative_y, params[4]);
2350 case EDJE_STATE_PARAM_REL1_TO:
2353 SETINT(rp->custom->description->rel1.id_x, params[3]);
2354 SETINT(rp->custom->description->rel1.id_y, params[4]);
2357 case EDJE_STATE_PARAM_REL1_OFFSET:
2360 SETINT(rp->custom->description->rel1.offset_x, params[3]);
2361 SETINT(rp->custom->description->rel1.offset_y, params[4]);
2364 case EDJE_STATE_PARAM_REL2:
2367 SETFLOAT_T(rp->custom->description->rel2.relative_x, params[3]);
2368 SETFLOAT_T(rp->custom->description->rel2.relative_y, params[4]);
2371 case EDJE_STATE_PARAM_REL2_TO:
2374 SETINT(rp->custom->description->rel2.id_x, params[3]);
2375 SETINT(rp->custom->description->rel2.id_y, params[4]);
2378 case EDJE_STATE_PARAM_REL2_OFFSET:
2381 SETINT(rp->custom->description->rel2.offset_x, params[3]);
2382 SETINT(rp->custom->description->rel2.offset_y, params[4]);
2385 case EDJE_STATE_PARAM_IMAGE:
2387 Edje_Part_Description_Image *img;
2389 if ( (rp->part->type != EDJE_PART_TYPE_IMAGE) ) return 0;
2392 img = (Edje_Part_Description_Image*) rp->custom->description;
2394 SETINT(img->image.id, params[3]);
2398 case EDJE_STATE_PARAM_BORDER:
2400 Edje_Part_Description_Image *img;
2402 if ( (rp->part->type != EDJE_PART_TYPE_IMAGE) ) return 0;
2405 img = (Edje_Part_Description_Image*) rp->custom->description;
2407 SETINT(img->image.border.l, params[3]);
2408 SETINT(img->image.border.r, params[4]);
2409 SETINT(img->image.border.t, params[5]);
2410 SETINT(img->image.border.b, params[6]);
2414 case EDJE_STATE_PARAM_FILL_SMOOTH:
2416 Edje_Part_Description_Image *img;
2418 if ( (rp->part->type != EDJE_PART_TYPE_IMAGE) ) return 0;
2421 img = (Edje_Part_Description_Image*) rp->custom->description;
2423 SETINT(img->image.fill.smooth, params[3]);
2427 case EDJE_STATE_PARAM_FILL_POS:
2429 Edje_Part_Description_Image *img;
2431 if ( (rp->part->type != EDJE_PART_TYPE_IMAGE) ) return 0;
2434 img = (Edje_Part_Description_Image*) rp->custom->description;
2436 SETFLOAT_T(img->image.fill.pos_rel_x, params[3]);
2437 SETFLOAT_T(img->image.fill.pos_rel_y, params[4]);
2438 SETINT(img->image.fill.pos_abs_x, params[5]);
2439 SETINT(img->image.fill.pos_abs_y, params[6]);
2443 case EDJE_STATE_PARAM_FILL_SIZE:
2445 Edje_Part_Description_Image *img;
2447 if ( (rp->part->type != EDJE_PART_TYPE_IMAGE) ) return 0;
2450 img = (Edje_Part_Description_Image*) rp->custom->description;
2452 SETFLOAT_T(img->image.fill.rel_x, params[3]);
2453 SETFLOAT_T(img->image.fill.rel_y, params[4]);
2454 SETINT(img->image.fill.abs_x, params[5]);
2455 SETINT(img->image.fill.abs_y, params[6]);
2459 case EDJE_STATE_PARAM_TEXT:
2461 Edje_Part_Description_Text *text;
2463 if (rp->part->type == EDJE_PART_TYPE_TEXT
2464 || rp->part->type == EDJE_PART_TYPE_TEXTBLOCK)
2469 text = (Edje_Part_Description_Text*) rp->custom->description;
2471 s = (char *)text->text.text.str;
2476 case EDJE_STATE_PARAM_TEXT_CLASS:
2478 Edje_Part_Description_Text *text;
2480 if ( (rp->part->type != EDJE_PART_TYPE_TEXT) &&
2481 (rp->part->type != EDJE_PART_TYPE_TEXTBLOCK))
2486 text = (Edje_Part_Description_Text*) rp->custom->description;
2488 s = text->text.text_class;
2493 case EDJE_STATE_PARAM_TEXT_FONT:
2495 Edje_Part_Description_Text *text;
2497 if ((rp->part->type != EDJE_PART_TYPE_TEXT)) return 0;
2501 text = (Edje_Part_Description_Text*) rp->custom->description;
2503 s = (char *)text->text.font.str;
2508 case EDJE_STATE_PARAM_TEXT_STYLE:
2510 Edje_Part_Description_Text *text;
2512 if ((rp->part->type != EDJE_PART_TYPE_TEXTBLOCK)) return 0;
2516 text = (Edje_Part_Description_Text*) rp->custom->description;
2518 s = (char *)text->text.style.str;
2523 case EDJE_STATE_PARAM_TEXT_SIZE:
2525 Edje_Part_Description_Text *text;
2527 if ((rp->part->type != EDJE_PART_TYPE_TEXT)) return 0;
2531 text = (Edje_Part_Description_Text*) rp->custom->description;
2533 SETINT(text->text.size, params[3]);
2537 case EDJE_STATE_PARAM_TEXT_FIT:
2539 Edje_Part_Description_Text *text;
2541 if ((rp->part->type != EDJE_PART_TYPE_TEXT)) return 0;
2544 text = (Edje_Part_Description_Text*) rp->custom->description;
2546 SETINT(text->text.fit_x, params[3]);
2547 SETINT(text->text.fit_y, params[4]);
2551 case EDJE_STATE_PARAM_TEXT_MIN:
2553 Edje_Part_Description_Text *text;
2555 if ( (rp->part->type != EDJE_PART_TYPE_TEXT) &&
2556 (rp->part->type != EDJE_PART_TYPE_TEXTBLOCK))
2561 text = (Edje_Part_Description_Text*) rp->custom->description;
2563 SETINT(text->text.min_x, params[3]);
2564 SETINT(text->text.min_y, params[4]);
2568 case EDJE_STATE_PARAM_TEXT_MAX:
2570 Edje_Part_Description_Text *text;
2572 if ( (rp->part->type != EDJE_PART_TYPE_TEXT) &&
2573 (rp->part->type != EDJE_PART_TYPE_TEXTBLOCK))
2578 text = (Edje_Part_Description_Text*) rp->custom->description;
2580 SETINT(text->text.max_x, params[3]);
2581 SETINT(text->text.max_y, params[4]);
2585 case EDJE_STATE_PARAM_TEXT_ALIGN:
2587 Edje_Part_Description_Text *text;
2589 if ((rp->part->type != EDJE_PART_TYPE_TEXT)) return 0;
2593 text = (Edje_Part_Description_Text*) rp->custom->description;
2595 SETFLOAT_T(text->text.align.x, params[3]);
2596 SETFLOAT_T(text->text.align.y, params[4]);
2600 case EDJE_STATE_PARAM_VISIBLE:
2603 SETINT(rp->custom->description->visible, params[3]);
2613 /* part_swallow(part_id, group_name) */
2615 _edje_embryo_fn_part_swallow(Embryo_Program *ep, Embryo_Cell *params)
2618 char* group_name = 0;
2621 Evas_Object *new_obj;
2625 part_id = params[1];
2626 if (part_id < 0) return 0;
2628 GETSTR(group_name, params[2]);
2629 if (!group_name) return 0;
2631 ed = embryo_program_data_get(ep);
2633 rp = ed->table_parts[part_id % ed->table_parts_size];
2636 new_obj = edje_object_add(ed->base.evas);
2637 if (!new_obj) return 0;
2639 if (!edje_object_file_set(new_obj, ed->file->path, group_name))
2641 evas_object_del(new_obj);
2644 edje_object_part_swallow(ed->obj, rp->part->name, new_obj);
2645 _edje_subobj_register(ed, new_obj);
2650 /* external_param_get_int(id, param_name[]) */
2652 _edje_embryo_fn_external_param_get_int(Embryo_Program *ep, Embryo_Cell *params)
2657 Edje_External_Param eep;
2661 ed = embryo_program_data_get(ep);
2663 part_id = params[1];
2664 if (part_id < 0) return 0;
2665 rp = ed->table_parts[part_id % ed->table_parts_size];
2667 GETSTR(param_name, params[2]);
2668 if (!param_name) return 0;
2669 eep.name = param_name;
2670 eep.type = EDJE_EXTERNAL_PARAM_TYPE_INT;
2672 _edje_external_param_get(NULL, rp, &eep);
2676 /* external_param_set_int(id, param_name[], val) */
2678 _edje_embryo_fn_external_param_set_int(Embryo_Program *ep, Embryo_Cell *params)
2683 Edje_External_Param eep;
2687 ed = embryo_program_data_get(ep);
2689 part_id = params[1];
2690 if (part_id < 0) return 0;
2691 rp = ed->table_parts[part_id % ed->table_parts_size];
2693 GETSTR(param_name, params[2]);
2694 if (!param_name) return 0;
2695 eep.name = param_name;
2696 eep.type = EDJE_EXTERNAL_PARAM_TYPE_INT;
2698 return _edje_external_param_set(NULL, rp, &eep);
2701 /* Float:external_param_get_float(id, param_name[]) */
2703 _edje_embryo_fn_external_param_get_float(Embryo_Program *ep, Embryo_Cell *params)
2708 Edje_External_Param eep;
2713 ed = embryo_program_data_get(ep);
2715 part_id = params[1];
2716 if (part_id < 0) return 0;
2717 rp = ed->table_parts[part_id % ed->table_parts_size];
2719 GETSTR(param_name, params[2]);
2720 if (!param_name) return 0;
2721 eep.name = param_name;
2722 eep.type = EDJE_EXTERNAL_PARAM_TYPE_DOUBLE;
2724 _edje_external_param_get(NULL, rp, &eep);
2726 return EMBRYO_FLOAT_TO_CELL(v);
2729 /* external_param_set_float(id, param_name[], Float:val) */
2731 _edje_embryo_fn_external_param_set_float(Embryo_Program *ep, Embryo_Cell *params)
2736 Edje_External_Param eep;
2740 ed = embryo_program_data_get(ep);
2742 part_id = params[1];
2743 if (part_id < 0) return 0;
2744 rp = ed->table_parts[part_id % ed->table_parts_size];
2746 GETSTR(param_name, params[2]);
2747 if (!param_name) return 0;
2748 eep.name = param_name;
2749 eep.type = EDJE_EXTERNAL_PARAM_TYPE_DOUBLE;
2750 eep.d = EMBRYO_CELL_TO_FLOAT(params[3]);
2751 return _edje_external_param_set(NULL, rp, &eep);
2754 /* external_param_get_strlen(id, param_name[]) */
2756 _edje_embryo_fn_external_param_get_strlen(Embryo_Program *ep, Embryo_Cell *params)
2761 Edje_External_Param eep;
2765 ed = embryo_program_data_get(ep);
2767 part_id = params[1];
2768 if (part_id < 0) return 0;
2769 rp = ed->table_parts[part_id % ed->table_parts_size];
2771 GETSTR(param_name, params[2]);
2772 if (!param_name) return 0;
2773 eep.name = param_name;
2774 eep.type = EDJE_EXTERNAL_PARAM_TYPE_STRING;
2776 _edje_external_param_get(NULL, rp, &eep);
2777 if (!eep.s) return 0;
2778 return strlen(eep.s);
2781 /* external_param_get_str(id, param_name[], val[], val_maxlen) */
2783 _edje_embryo_fn_external_param_get_str(Embryo_Program *ep, Embryo_Cell *params)
2788 Edje_External_Param eep;
2790 size_t src_len, dst_len;
2793 dst_len = params[4];
2794 if (dst_len < 1) goto error;
2796 ed = embryo_program_data_get(ep);
2798 part_id = params[1];
2799 if (part_id < 0) goto error;
2800 rp = ed->table_parts[part_id % ed->table_parts_size];
2802 GETSTR(param_name, params[2]);
2803 if (!param_name) return 0;
2804 eep.name = param_name;
2805 eep.type = EDJE_EXTERNAL_PARAM_TYPE_STRING;
2807 _edje_external_param_get(NULL, rp, &eep);
2808 if (!eep.s) goto error;
2809 src_len = strlen(eep.s);
2810 if (src_len < dst_len)
2812 SETSTR(eep.s, params[3]);
2816 char *tmp = alloca(dst_len);
2817 memcpy(tmp, eep.s, dst_len - 1);
2818 tmp[dst_len-1] = '\0';
2819 SETSTR(tmp, params[3]);
2824 SETSTR("", params[3]);
2828 /* external_param_set_str(id, param_name[], val[]) */
2830 _edje_embryo_fn_external_param_set_str(Embryo_Program *ep, Embryo_Cell *params)
2835 Edje_External_Param eep;
2836 char *param_name, *val;
2839 ed = embryo_program_data_get(ep);
2841 part_id = params[1];
2842 if (part_id < 0) return 0;
2843 rp = ed->table_parts[part_id % ed->table_parts_size];
2845 GETSTR(param_name, params[2]);
2846 if (!param_name) return 0;
2847 eep.name = param_name;
2848 eep.type = EDJE_EXTERNAL_PARAM_TYPE_STRING;
2849 GETSTR(val, params[3]);
2852 return _edje_external_param_set(NULL, rp, &eep);
2855 /* external_param_get_choice_len(id, param_name[]) */
2857 _edje_embryo_fn_external_param_get_choice_len(Embryo_Program *ep, Embryo_Cell *params)
2862 Edje_External_Param eep;
2866 ed = embryo_program_data_get(ep);
2868 part_id = params[1];
2869 if (part_id < 0) return 0;
2870 rp = ed->table_parts[part_id % ed->table_parts_size];
2872 GETSTR(param_name, params[2]);
2873 if (!param_name) return 0;
2874 eep.name = param_name;
2875 eep.type = EDJE_EXTERNAL_PARAM_TYPE_CHOICE;
2877 _edje_external_param_get(NULL, rp, &eep);
2878 if (!eep.s) return 0;
2879 return strlen(eep.s);
2882 /* external_param_get_choice(id, param_name[], val[], val_maxlen) */
2884 _edje_embryo_fn_external_param_get_choice(Embryo_Program *ep, Embryo_Cell *params)
2889 Edje_External_Param eep;
2891 size_t src_len, dst_len;
2894 dst_len = params[4];
2895 if (dst_len < 1) goto error;
2897 ed = embryo_program_data_get(ep);
2899 part_id = params[1];
2900 if (part_id < 0) goto error;
2901 rp = ed->table_parts[part_id % ed->table_parts_size];
2903 GETSTR(param_name, params[2]);
2904 if (!param_name) return 0;
2905 eep.name = param_name;
2906 eep.type = EDJE_EXTERNAL_PARAM_TYPE_CHOICE;
2908 _edje_external_param_get(NULL, rp, &eep);
2909 if (!eep.s) goto error;
2910 src_len = strlen(eep.s);
2911 if (src_len < dst_len)
2913 SETSTR(eep.s, params[3]);
2917 char *tmp = alloca(dst_len);
2918 memcpy(tmp, eep.s, dst_len - 1);
2919 tmp[dst_len-1] = '\0';
2920 SETSTR(tmp, params[3]);
2925 SETSTR("", params[3]);
2929 /* external_param_set_choice(id, param_name[], val[]) */
2931 _edje_embryo_fn_external_param_set_choice(Embryo_Program *ep, Embryo_Cell *params)
2936 Edje_External_Param eep;
2937 char *param_name, *val;
2940 ed = embryo_program_data_get(ep);
2942 part_id = params[1];
2943 if (part_id < 0) return 0;
2944 rp = ed->table_parts[part_id % ed->table_parts_size];
2946 GETSTR(param_name, params[2]);
2947 if (!param_name) return 0;
2948 eep.name = param_name;
2949 eep.type = EDJE_EXTERNAL_PARAM_TYPE_CHOICE;
2950 GETSTR(val, params[3]);
2953 return _edje_external_param_set(NULL, rp, &eep);
2956 /* external_param_get_bool(id, param_name[]) */
2958 _edje_embryo_fn_external_param_get_bool(Embryo_Program *ep, Embryo_Cell *params)
2963 Edje_External_Param eep;
2967 ed = embryo_program_data_get(ep);
2969 part_id = params[1];
2970 if (part_id < 0) return 0;
2971 rp = ed->table_parts[part_id % ed->table_parts_size];
2973 GETSTR(param_name, params[2]);
2974 if (!param_name) return 0;
2975 eep.name = param_name;
2976 eep.type = EDJE_EXTERNAL_PARAM_TYPE_BOOL;
2978 _edje_external_param_get(NULL, rp, &eep);
2982 /* external_param_set_bool(id, param_name[], val) */
2984 _edje_embryo_fn_external_param_set_bool(Embryo_Program *ep, Embryo_Cell *params)
2989 Edje_External_Param eep;
2993 ed = embryo_program_data_get(ep);
2995 part_id = params[1];
2996 if (part_id < 0) return 0;
2997 rp = ed->table_parts[part_id % ed->table_parts_size];
2999 GETSTR(param_name, params[2]);
3000 if (!param_name) return 0;
3001 eep.name = param_name;
3002 eep.type = EDJE_EXTERNAL_PARAM_TYPE_BOOL;
3004 return _edje_external_param_set(NULL, rp, &eep);
3008 _edje_embryo_script_init(Edje_Part_Collection *edc)
3013 if (!edc->script) return;
3016 /* first advertise all the edje "script" calls */
3017 embryo_program_native_call_add(ep, "get_int", _edje_embryo_fn_get_int);
3018 embryo_program_native_call_add(ep, "set_int", _edje_embryo_fn_set_int);
3019 embryo_program_native_call_add(ep, "get_float", _edje_embryo_fn_get_float);
3020 embryo_program_native_call_add(ep, "set_float", _edje_embryo_fn_set_float);
3021 embryo_program_native_call_add(ep, "get_str", _edje_embryo_fn_get_str);
3022 embryo_program_native_call_add(ep, "get_strlen", _edje_embryo_fn_get_strlen);
3023 embryo_program_native_call_add(ep, "set_str", _edje_embryo_fn_set_str);
3024 embryo_program_native_call_add(ep, "count", _edje_embryo_fn_count);
3025 embryo_program_native_call_add(ep, "remove", _edje_embryo_fn_remove);
3026 embryo_program_native_call_add(ep, "append_int", _edje_embryo_fn_append_int);
3027 embryo_program_native_call_add(ep, "prepend_int", _edje_embryo_fn_prepend_int);
3028 embryo_program_native_call_add(ep, "insert_int", _edje_embryo_fn_insert_int);
3029 embryo_program_native_call_add(ep, "replace_int", _edje_embryo_fn_replace_int);
3030 embryo_program_native_call_add(ep, "fetch_int", _edje_embryo_fn_fetch_int);
3031 embryo_program_native_call_add(ep, "append_str", _edje_embryo_fn_append_str);
3032 embryo_program_native_call_add(ep, "prepend_str", _edje_embryo_fn_prepend_str);
3033 embryo_program_native_call_add(ep, "insert_str", _edje_embryo_fn_insert_str);
3034 embryo_program_native_call_add(ep, "replace_str", _edje_embryo_fn_replace_str);
3035 embryo_program_native_call_add(ep, "fetch_str", _edje_embryo_fn_fetch_str);
3036 embryo_program_native_call_add(ep, "append_float", _edje_embryo_fn_append_float);
3037 embryo_program_native_call_add(ep, "prepend_float", _edje_embryo_fn_prepend_float);
3038 embryo_program_native_call_add(ep, "insert_float", _edje_embryo_fn_insert_float);
3039 embryo_program_native_call_add(ep, "replace_float", _edje_embryo_fn_replace_float);
3040 embryo_program_native_call_add(ep, "fetch_float", _edje_embryo_fn_fetch_float);
3042 embryo_program_native_call_add(ep, "timer", _edje_embryo_fn_timer);
3043 embryo_program_native_call_add(ep, "cancel_timer", _edje_embryo_fn_cancel_timer);
3045 embryo_program_native_call_add(ep, "anim", _edje_embryo_fn_anim);
3046 embryo_program_native_call_add(ep, "cancel_anim", _edje_embryo_fn_cancel_anim);
3048 embryo_program_native_call_add(ep, "emit", _edje_embryo_fn_emit);
3049 embryo_program_native_call_add(ep, "get_part_id", _edje_embryo_fn_get_part_id);
3050 embryo_program_native_call_add(ep, "get_program_id", _edje_embryo_fn_get_program_id);
3051 embryo_program_native_call_add(ep, "set_state", _edje_embryo_fn_set_state);
3052 embryo_program_native_call_add(ep, "get_state", _edje_embryo_fn_get_state);
3053 embryo_program_native_call_add(ep, "set_tween_state", _edje_embryo_fn_set_tween_state);
3054 embryo_program_native_call_add(ep, "run_program", _edje_embryo_fn_run_program);
3055 embryo_program_native_call_add(ep, "get_drag_dir", _edje_embryo_fn_get_drag_dir);
3056 embryo_program_native_call_add(ep, "get_drag", _edje_embryo_fn_get_drag);
3057 embryo_program_native_call_add(ep, "set_drag", _edje_embryo_fn_set_drag);
3058 embryo_program_native_call_add(ep, "get_drag_size", _edje_embryo_fn_get_drag_size);
3059 embryo_program_native_call_add(ep, "set_drag_size", _edje_embryo_fn_set_drag_size);
3060 embryo_program_native_call_add(ep, "set_text", _edje_embryo_fn_set_text);
3061 embryo_program_native_call_add(ep, "get_text", _edje_embryo_fn_get_text);
3062 embryo_program_native_call_add(ep, "get_min_size", _edje_embryo_fn_get_min_size);
3063 embryo_program_native_call_add(ep, "get_max_size", _edje_embryo_fn_get_max_size);
3064 embryo_program_native_call_add(ep, "get_color_class", _edje_embryo_fn_get_color_class);
3065 embryo_program_native_call_add(ep, "set_color_class", _edje_embryo_fn_set_color_class);
3066 embryo_program_native_call_add(ep, "set_text_class", _edje_embryo_fn_set_text_class);
3067 embryo_program_native_call_add(ep, "get_text_class", _edje_embryo_fn_get_text_class);
3068 embryo_program_native_call_add(ep, "get_drag_step", _edje_embryo_fn_get_drag_step);
3069 embryo_program_native_call_add(ep, "set_drag_step", _edje_embryo_fn_set_drag_step);
3070 embryo_program_native_call_add(ep, "get_drag_page", _edje_embryo_fn_get_drag_page);
3071 embryo_program_native_call_add(ep, "set_drag_page", _edje_embryo_fn_set_drag_page);
3072 embryo_program_native_call_add(ep, "get_mouse", _edje_embryo_fn_get_mouse);
3073 embryo_program_native_call_add(ep, "get_mouse_buttons", _edje_embryo_fn_get_mouse_buttons);
3074 embryo_program_native_call_add(ep, "stop_program", _edje_embryo_fn_stop_program);
3075 embryo_program_native_call_add(ep, "stop_programs_on", _edje_embryo_fn_stop_programs_on);
3076 embryo_program_native_call_add(ep, "set_min_size", _edje_embryo_fn_set_min_size);
3077 embryo_program_native_call_add(ep, "set_max_size", _edje_embryo_fn_set_max_size);
3078 embryo_program_native_call_add(ep, "play_sample", _edje_embryo_fn_play_sample);
3079 embryo_program_native_call_add(ep, "play_tone", _edje_embryo_fn_play_tone);
3080 embryo_program_native_call_add(ep, "send_message", _edje_embryo_fn_send_message);
3081 embryo_program_native_call_add(ep, "get_geometry", _edje_embryo_fn_get_geometry);
3082 embryo_program_native_call_add(ep, "custom_state", _edje_embryo_fn_custom_state);
3083 embryo_program_native_call_add(ep, "set_state_val", _edje_embryo_fn_set_state_val);
3084 embryo_program_native_call_add(ep, "get_state_val", _edje_embryo_fn_get_state_val);
3086 embryo_program_native_call_add(ep, "part_swallow", _edje_embryo_fn_part_swallow);
3088 embryo_program_native_call_add(ep, "external_param_get_int", _edje_embryo_fn_external_param_get_int);
3089 embryo_program_native_call_add(ep, "external_param_set_int", _edje_embryo_fn_external_param_set_int);
3090 embryo_program_native_call_add(ep, "external_param_get_float", _edje_embryo_fn_external_param_get_float);
3091 embryo_program_native_call_add(ep, "external_param_set_float", _edje_embryo_fn_external_param_set_float);
3092 embryo_program_native_call_add(ep, "external_param_get_strlen", _edje_embryo_fn_external_param_get_strlen);
3093 embryo_program_native_call_add(ep, "external_param_get_str", _edje_embryo_fn_external_param_get_str);
3094 embryo_program_native_call_add(ep, "external_param_set_str", _edje_embryo_fn_external_param_set_str);
3095 embryo_program_native_call_add(ep, "external_param_get_choice_len", _edje_embryo_fn_external_param_get_choice_len);
3096 embryo_program_native_call_add(ep, "external_param_get_choice", _edje_embryo_fn_external_param_get_choice);
3097 embryo_program_native_call_add(ep, "external_param_set_choice", _edje_embryo_fn_external_param_set_choice);
3098 embryo_program_native_call_add(ep, "external_param_get_bool", _edje_embryo_fn_external_param_get_bool);
3099 embryo_program_native_call_add(ep, "external_param_set_bool", _edje_embryo_fn_external_param_set_bool);
3103 _edje_embryo_script_shutdown(Edje_Part_Collection *edc)
3106 if (!edc->script) return;
3107 if (embryo_program_recursion_get(edc->script) > 0) return;
3108 embryo_program_free(edc->script);
3113 _edje_embryo_script_reset(Edje *ed)
3116 if (!ed->collection) return;
3117 if (!ed->collection->script) return;
3118 if (embryo_program_recursion_get(ed->collection->script) > 0) return;
3119 embryo_program_vm_reset(ed->collection->script);
3120 _edje_embryo_globals_init(ed);
3123 /* this may change in future - thus "test_run" is its name */
3125 _edje_embryo_test_run(Edje *ed, const char *fname, const char *sig, const char *src)
3130 if (!ed->collection) return;
3131 if (!ed->collection->script) return;
3132 embryo_program_vm_push(ed->collection->script);
3133 _edje_embryo_globals_init(ed);
3135 // _edje_embryo_script_reset(ed);
3136 fn = embryo_program_function_find(ed->collection->script, (char *)fname);
3137 if (fn != EMBRYO_FUNCTION_NONE)
3142 embryo_parameter_string_push(ed->collection->script, (char *)sig);
3143 embryo_parameter_string_push(ed->collection->script, (char *)src);
3144 pdata = embryo_program_data_get(ed->collection->script);
3145 embryo_program_data_set(ed->collection->script, ed);
3146 /* 5 million instructions is an arbitrary number. on my p4-2.6 here */
3147 /* IF embryo is ONLY running embryo stuff and NO native calls thats */
3148 /* about 0.016 seconds, and longer on slower cpu's. if a simple */
3149 /* embryo script snippet hasn't managed to do its work in 5 MILLION */
3150 /* embryo virtual machine instructions - something is wrong, or */
3151 /* embryo is simply being mis-used. Embryo is meant to be minimal */
3152 /* logic enhancment - not entire applications. this cycle count */
3153 /* does NOT include time spent in native function calls, that the */
3154 /* script may call to do the REAL work, so in terms of time this */
3155 /* will likely end up being much longer than 0.016 seconds - more */
3156 /* like 0.03 - 0.05 seconds or even more */
3157 embryo_program_max_cycle_run_set(ed->collection->script, 5000000);
3158 ret = embryo_program_run(ed->collection->script, fn);
3159 if (ret == EMBRYO_PROGRAM_FAIL)
3161 ERR("ERROR with embryo script. "
3162 "OBJECT NAME: '%s', "
3163 "OBJECT FILE: '%s', "
3164 "ENTRY POINT: '%s', "
3168 ed->collection->part,
3172 embryo_error_string_get(embryo_program_error_get(ed->collection->script)));
3174 else if (ret == EMBRYO_PROGRAM_TOOLONG)
3176 ERR("ERROR with embryo script. "
3177 "OBJECT NAME: '%s', "
3178 "OBJECT FILE: '%s', "
3179 "ENTRY POINT: '%s', "
3182 "ERROR: 'Script exceeded maximum allowed cycle count of %i'",
3183 ed->collection->part,
3187 embryo_program_max_cycle_run_get(ed->collection->script));
3189 embryo_program_data_set(ed->collection->script, pdata);
3191 embryo_program_vm_pop(ed->collection->script);
3195 _edje_embryo_globals_init(Edje *ed)
3200 ep = ed->collection->script;
3201 n = embryo_program_variable_count_get(ep);
3202 for (i = 0; i < n; i++)
3204 Embryo_Cell cell, *cptr;
3206 cell = embryo_program_variable_get(ep, i);
3207 if (cell != EMBRYO_CELL_NONE)
3209 cptr = embryo_data_address_get(ep, cell);
3210 if (cptr) *cptr = EDJE_VAR_MAGIC_BASE + i;