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);
50 typedef struct _Sinfo Sinfo;
57 obj_init, obj_shutdown, obj_show, obj_show_immediate,
58 obj_hide, obj_hide_immediate, obj_move, obj_move_immediate,
59 obj_resize, obj_resize_immediate, obj_message;
63 Ecore_Job * show, *hide, *move, *resize;
68 Eina_Hash *hash; // FIXME: hash -> bad. too big. one-way lookup etc.
72 static void _call_fn(Edje * ed, const char *fname, Embryo_Function fn);
74 /* frankly - these make the code shorter to type and read - just sanity for
76 #define IFFN(func) if (si->fn.func != EMBRYO_FUNCTION_NONE)
77 #define IFNO(func) if (si->fn.func == EMBRYO_FUNCTION_NONE)
78 #define CLFN(func) IFFN(func) {_call_fn(ed, #func, si->fn.func);}
79 #define SI Sinfo *si; si = ed->script_only_data; if (!si) return
80 #define SI_RETURN(ret) Sinfo *si; si = ed->script_only_data; if (!si) return (ret)
81 #define PINT(val) embryo_parameter_cell_push(ed->collection->script, (Embryo_Cell)(val))
82 #define PSTR(val) embryo_parameter_string_push(ed->collection->script, val)
83 #define GTFN(func) si->fn.func = embryo_program_function_find(ed->collection->script, #func)
84 #define DELJ(type) if (si->job.type) ecore_job_del(si->job.type);
85 #define ADDJ(type, func) si->job.type = ecore_job_add(func, ed);
86 #define ZERJ(type) si->job.type = NULL;
87 #define IFNJ(type) if (!si->job.type)
88 #define EXPF(func) embryo_program_native_call_add(ed->collection->script, #func, _exp_##func)
90 typedef struct _Oid Oid;
96 Evas_Coord x, y, w, h;
100 /* FIXME: using eina_hash and strings is just nasty! make a custom int hash */
102 _oid_alloc(Edje * ed)
111 _oid_track(Edje * ed, Evas_Object * o)
119 oi = calloc(1, sizeof(Oid));
122 oi->oid = _oid_alloc(ed);
130 evas_object_smart_member_add(oi->obj, oi->ed->obj);
131 evas_object_clip_set(oi->obj, oi->ed->base.clipper);
132 evas_object_geometry_get(oi->obj, &(oi->x), &(oi->y), &(oi->w), &(oi->h));
133 snprintf(buf, sizeof(buf), "%i", oi->oid);
135 si->oid.hash = eina_hash_string_superfast_new(NULL);
136 eina_hash_add(si->oid.hash, buf, oi);
141 _oid_find(Edje * ed, int oid)
147 snprintf(buf, sizeof(buf), "%i", oid);
148 return eina_hash_find(si->oid.hash, buf);
152 _oid_del(Edje * ed, int oid)
158 snprintf(buf, sizeof(buf), "%i", oid);
159 eina_hash_del(si->oid.hash, buf, NULL);
169 _oid_freeall_cb(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata __UNUSED__)
173 evas_object_del(oid->obj);
179 _oid_freeall(Edje * ed)
184 eina_hash_foreach(si->oid.hash, _oid_freeall_cb, ed);
185 eina_hash_free(si->oid.hash);
190 _oid_moveall_cb(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata __UNUSED__)
194 evas_object_move(oid->obj, oid->ed->x + oid->x, oid->ed->y + oid->y);
199 _oid_moveall(Edje * ed)
204 eina_hash_foreach(si->oid.hash, _oid_moveall_cb, ed);
210 _exp_e_obj_del(Embryo_Program * ep, Embryo_Cell * params)
212 Edje *ed = embryo_program_data_get(ep);
219 if (!(oid = _oid_find(ed, params[1])))
221 evas_object_del(oid->obj);
222 _oid_del(ed, oid->oid);
228 _exp_e_obj_rect_add(Embryo_Program * ep, Embryo_Cell * params __UNUSED__)
230 Edje *ed = embryo_program_data_get(ep);
238 o = evas_object_rectangle_add(evas_object_evas_get(ed->obj));
241 oid = _oid_track(ed, o);
248 _exp_e_obj_show(Embryo_Program * ep, Embryo_Cell * params)
250 Edje *ed = embryo_program_data_get(ep);
257 if (!(oid = _oid_find(ed, params[1])))
259 evas_object_show(oid->obj);
264 _exp_e_obj_hide(Embryo_Program * ep, Embryo_Cell * params)
266 Edje *ed = embryo_program_data_get(ep);
273 if (!(oid = _oid_find(ed, params[1])))
275 evas_object_hide(oid->obj);
280 _exp_e_obj_move(Embryo_Program * ep, Embryo_Cell * params)
282 Edje *ed = embryo_program_data_get(ep);
289 if (!(oid = _oid_find(ed, params[1])))
291 if ((oid->x == params[2]) && (oid->y == params[3]))
295 evas_object_move(oid->obj, ed->x + oid->x, ed->y + oid->y);
300 _exp_e_obj_resize(Embryo_Program * ep, Embryo_Cell * params)
302 Edje *ed = embryo_program_data_get(ep);
309 if (!(oid = _oid_find(ed, params[1])))
311 if ((oid->w == params[2]) && (oid->h == params[3]))
315 evas_object_resize(oid->obj, oid->w, oid->h);
320 _exp_e_obj_geometry_set(Embryo_Program * ep, Embryo_Cell * params)
322 Edje *ed = embryo_program_data_get(ep);
329 if (!(oid = _oid_find(ed, params[1])))
331 if ((oid->x == params[2]) && (oid->y == params[3]) &&
332 (oid->w == params[4]) && (oid->h == params[5]))
338 evas_object_move(oid->obj, ed->x + oid->x, ed->y + oid->y);
339 evas_object_resize(oid->obj, oid->w, oid->h);
344 _exp_e_obj_geometry_get(Embryo_Program * ep, Embryo_Cell * params)
346 Edje *ed = embryo_program_data_get(ep);
353 if (!(oid = _oid_find(ed, params[1])))
355 SETINT(oid->x, params[2]);
356 SETINT(oid->y, params[3]);
357 SETINT(oid->w, params[4]);
358 SETINT(oid->h, params[5]);
363 _exp_e_obj_color_set(Embryo_Program * ep, Embryo_Cell * params)
365 Edje *ed = embryo_program_data_get(ep);
372 if (!(oid = _oid_find(ed, params[1])))
374 evas_object_color_set(oid->obj, params[2], params[3], params[4], params[5]);
379 _exp_e_obj_color_get(Embryo_Program * ep, Embryo_Cell * params)
381 Edje *ed = embryo_program_data_get(ep);
390 if (!(oid = _oid_find(ed, params[1])))
392 evas_object_color_get(oid->obj, &r, &g, &b, &a);
393 SETINT(r, params[2]);
394 SETINT(g, params[3]);
395 SETINT(b, params[4]);
396 SETINT(a, params[5]);
401 _exp_e_signal_emit(Embryo_Program * ep, Embryo_Cell * params)
403 Edje *ed = embryo_program_data_get(ep);
405 char *sig = NULL, *src = NULL;
410 GETSTR(sig, params[1]);
411 GETSTR(src, params[2]);
412 if ((!sig) || (!src))
414 _edje_emit(ed, sig, src);
421 _edje_script_only(Edje * ed)
423 if ((ed->collection) && (ed->collection->script) &&
424 (ed->collection->script_only))
430 _edje_script_only_init(Edje * ed)
434 si = calloc(1, sizeof(Sinfo));
437 ed->script_only_data = si;
439 embryo_program_data_set(ed->collection->script, ed);
442 EXPF(e_obj_rect_add);
447 EXPF(e_obj_geometry_set);
448 EXPF(e_obj_geometry_get);
449 EXPF(e_obj_color_set);
450 EXPF(e_obj_color_get);
453 embryo_program_vm_push(ed->collection->script);
454 embryo_program_max_cycle_run_set(ed->collection->script, 5000000);
459 GTFN(obj_show_immediate);
461 GTFN(obj_hide_immediate);
463 GTFN(obj_move_immediate);
465 GTFN(obj_resize_immediate);
469 _edje_script_only_move(ed);
473 _edje_script_only_shutdown(Edje * ed)
486 _show_job(void *data)
496 _edje_script_only_show(Edje * ed)
505 ADDJ(show, _show_job);
512 IFNO(obj_show_immediate) return;
513 CLFN(obj_show_immediate);
517 _hide_job(void *data)
527 _edje_script_only_hide(Edje * ed)
536 ADDJ(hide, _hide_job);
543 IFNO(obj_hide_immediate) return;
544 CLFN(obj_hide_immediate);
548 _move_job(void *data)
556 IFNO(obj_move) return;
562 _edje_script_only_move(Edje * ed)
567 ADDJ(move, _move_job);
568 IFNO(obj_move_immediate) return;
571 CLFN(obj_move_immediate);
575 _resize_job(void *data)
587 _edje_script_only_resize(Edje * ed)
594 ADDJ(resize, _resize_job);
598 CLFN(obj_resize_immediate);
602 _edje_script_only_message(Edje * ed, Edje_Message * em)
606 IFNO(obj_message) return;
607 _edje_message_parameters_push(em);
611 /**************************************************/
614 _call_fn(Edje * ed, const char *fname, Embryo_Function fn)
618 ret = embryo_program_run(ed->collection->script, fn);
619 if (ret == EMBRYO_PROGRAM_FAIL)
621 ERR("ERROR with embryo script. "
622 "OBJECT NAME: '%s', "
623 "OBJECT FILE: '%s', "
624 "ENTRY POINT: '%s', "
626 ed->collection->part,
629 embryo_error_string_get(embryo_program_error_get(ed->collection->script)));
631 else if (ret == EMBRYO_PROGRAM_TOOLONG)
633 ERR("ERROR with embryo script. "
634 "OBJECT NAME: '%s', "
635 "OBJECT FILE: '%s', "
636 "ENTRY POINT: '%s', "
637 "ERROR: 'Script exceeded maximum allowed cycle count of %i'",
638 ed->collection->part,
641 embryo_program_max_cycle_run_get(ed->collection->script));