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 *ed, 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 *ed, Edje_Real_Part *part, const char *param, const char *value);
7
static double _edje_transition_duration_scale = 0;
10
_edje_animator_cb(void *data)
12
const Efl_Event event = { NULL, NULL, NULL };
13
_edje_timer_cb(data, &event);
18
_edje_emit_aliased(Edje *ed, const char *part, const char *sig, const char *src)
20
char *alias, *aliased;
21
int alien, nslen, length;
24
if ((!ed->collection) || (!ed->collection->alias)) return EINA_FALSE;
25
alias = eina_hash_find(ed->collection->alias, part);
26
if (!alias) return EINA_FALSE;
28
alien = strlen(alias);
30
length = alien + nslen + 2;
32
aliased = alloca(length);
33
memcpy(aliased, alias, alien);
34
aliased[alien] = EDJE_PART_PATH_SEPARATOR;
35
memcpy(aliased + alien + 1, sig, nslen + 1);
37
_edje_emit(ed, aliased, src);
42
_edje_emit_child(Edje *ed, Edje_Real_Part *rp, const char *part, const char *sig, const char *src)
48
idx = strchr(part, EDJE_PART_PATH_SEPARATOR_INDEXL);
53
end = strchr(idx + 1, EDJE_PART_PATH_SEPARATOR_INDEXR);
54
if (end && end != idx + 1)
58
tmp = alloca(end - idx);
59
memcpy(tmp, idx + 1, end - idx - 1);
60
tmp[end - idx - 1] = '\0';
72
rp = _edje_real_part_get(ed, part);
73
if (!rp) return ed->collection->broadcast_signal;
75
switch (rp->part->type)
77
case EDJE_PART_TYPE_GROUP:
78
if (((rp->type != EDJE_RP_TYPE_SWALLOW) ||
79
(!rp->typedata.swallow)) ||
80
(!rp->typedata.swallow->swallowed_object))
82
ed2 = _edje_fetch(rp->typedata.swallow->swallowed_object);
85
_edje_emit(ed2, sig, src);
88
case EDJE_PART_TYPE_EXTERNAL:
89
if (((rp->type != EDJE_RP_TYPE_SWALLOW) ||
90
(!rp->typedata.swallow)) ||
91
(!rp->typedata.swallow->swallowed_object))
96
_edje_external_signal_emit(rp->typedata.swallow->swallowed_object, sig, src);
102
child = _edje_children_get(rp, idx);
103
ed2 = _edje_fetch(child);
105
_edje_emit(ed2, sig, src);
109
case EDJE_PART_TYPE_BOX:
110
case EDJE_PART_TYPE_TABLE:
115
child = _edje_children_get(rp, idx);
116
ed2 = _edje_fetch(child);
118
_edje_emit(ed2, sig, src);
127
return ed->collection->broadcast_signal;
130
static Edje_Message_Signal_Data *
131
_edje_signal_data_setup(void *data, Ecore_Cb free_func, void *seat_data, Ecore_Cb seat_free_func)
133
Edje_Message_Signal_Data *out = NULL;
135
if (data || seat_data)
137
out = calloc(1, sizeof(*out));
138
if (!out) return NULL;
142
out->free_func = free_func;
143
out->seat_data = seat_data;
144
out->seat_free_func = seat_free_func;
150
_edje_signal_data_free(Edje_Message_Signal_Data *mdata)
153
if (--(mdata->ref)) return;
155
if (mdata->free_func)
157
mdata->free_func(mdata->data);
159
if (mdata->seat_free_func)
161
mdata->seat_free_func(mdata->seat_data);
167
_edje_signal_data_ref(Edje_Message_Signal_Data *mdata)
169
if (mdata) mdata->ref++;
173
_edje_emit_send(Edje *ed, Eina_Bool broadcast, const char *sig, const char *src, Edje_Message_Signal_Data *mdata)
175
Edje_Message_Signal emsg;
182
edje_object_message_send(ed->obj, EDJE_MESSAGE_SIGNAL, 0, &emsg);
184
_edje_util_message_send(ed, EDJE_QUEUE_SCRIPT, EDJE_MESSAGE_SIGNAL, 0, &emsg);
203
EOLIAN Eina_Stringshare*
204
_efl_canvas_layout_seat_name_get(const Eo *obj EINA_UNUSED, Edje *ed, Efl_Input_Device *device)
206
return _edje_seat_name_get(ed, device);
209
EOLIAN Efl_Input_Device *
210
_efl_canvas_layout_seat_get(const Eo *obj EINA_UNUSED, Edje *ed, Eina_Stringshare *name)
212
return _edje_seat_get(ed, name);
216
edje_frametime_set(double t)
218
ecore_animator_frametime_set(t);
222
edje_frametime_get(void)
224
return ecore_animator_frametime_get();
228
edje_transition_duration_factor_get(void)
230
return _edje_transition_duration_scale;
234
edje_transition_duration_factor_set(double scale)
236
_edje_transition_duration_scale = FROM_DOUBLE(scale);
240
_edje_object_signal_callback_add(Evas_Object *obj, Edje *ed,
241
const char *emission, const char *source,
242
Edje_Signal_Cb func_legacy,
243
Efl_Signal_Cb func_eo, Eina_Free_Cb func_free_cb, void *data)
245
Edje_Signal_Callback_Group *gp;
251
ed->callbacks = _edje_signal_callback_alloc();
252
if (!ed->callbacks) return EINA_FALSE;
254
sig = eina_stringshare_add(emission);
255
src = eina_stringshare_add(source);
258
if (!ed->need_seat && sig && !strncmp(sig, "seat,", 5))
260
ed->need_seat = EINA_TRUE;
262
_edje_devices_add(ed, evas_object_evas_get(obj));
265
gp = (Edje_Signal_Callback_Group *) ed->callbacks;
266
ok = _edje_signal_callback_push(gp, sig, src, func_legacy, func_eo, func_free_cb, data, EINA_TRUE);
268
eina_stringshare_del(sig);
269
eina_stringshare_del(src);
275
edje_object_propagate_callback_add(Evas_Object *obj, Efl_Signal_Cb func, void *data)
279
ed = _edje_fetch(obj);
280
if (!ed || ed->delete_me) return;
281
_edje_object_signal_callback_add(obj, ed, "*", "*", func, NULL, NULL, data);
285
_efl_canvas_layout_efl_layout_signal_signal_callback_add(Eo *obj EINA_UNUSED, Edje *ed, const char *emission, const char *source, void *func_data, EflLayoutSignalCb func, Eina_Free_Cb func_free_cb)
287
return _edje_object_signal_callback_add(obj, ed, emission, source, NULL, func, func_free_cb, func_data);
291
_efl_canvas_layout_efl_layout_signal_signal_callback_del(Eo *obj EINA_UNUSED, Edje *ed, const char *emission, const char *source, void *func_data, EflLayoutSignalCb func, Eina_Free_Cb func_free_cb)
293
Edje_Signal_Callback_Group *gp;
296
if (ed->delete_me) return EINA_FALSE;
297
if ((!emission) || (!source) || (!func)) return EINA_FALSE;
299
gp = (Edje_Signal_Callback_Group *) ed->callbacks;
300
if (!gp) return EINA_FALSE;
302
emission = eina_stringshare_add(emission);
303
source = eina_stringshare_add(source);
305
ok = _edje_signal_callback_disable(gp, emission, source, NULL, func, func_free_cb, func_data);
307
eina_stringshare_del(emission);
308
eina_stringshare_del(source);
314
_efl_canvas_layout_efl_layout_signal_signal_emit(Eo *obj EINA_UNUSED, Edje *ed, const char *emission, const char *source)
316
if (ed->delete_me) return;
317
if ((!emission) || (!source)) return;
318
_edje_emit(ed, emission, source);
323
_efl_canvas_layout_animated_set(Eo *obj, Edje *ed, Eina_Bool on)
329
if (ed->delete_me) return;
332
_edje_util_freeze(ed);
335
Eina_List *newl = NULL;
336
Edje_Running_Program *data;
338
EINA_LIST_FOREACH(ed->actions, l, data)
341
newl = eina_list_append(newl, data);
345
Edje_Running_Program *runp;
347
runp = eina_list_data_get(newl);
348
newl = eina_list_remove(newl, eina_list_data_get(newl));
350
_edje_program_run_iterate(runp, runp->start_time + TO_DOUBLE(runp->program->tween.time));
351
if (_edje_block_break(ed))
353
EINA_LIST_FREE(newl, data)
356
if ((data->delete_me) && (data->ref == 0))
358
_edje_program_run_cleanup(ed, data);
368
_edje_emit(ed, "load", NULL);
369
if (evas_object_visible_get(obj))
371
evas_object_hide(obj);
372
evas_object_show(obj);
377
for (i = 0; i < ed->table_parts_size; i++)
380
rp = ed->table_parts[i];
381
if ((rp->part->type == EDJE_PART_TYPE_GROUP) &&
382
((rp->type == EDJE_RP_TYPE_SWALLOW) &&
383
(rp->typedata.swallow)) &&
384
(rp->typedata.swallow->swallowed_object))
385
edje_object_animation_set(rp->typedata.swallow->swallowed_object, on);
393
_efl_canvas_layout_animated_get(const Eo *obj EINA_UNUSED, Edje *ed)
395
if (!ed) return EINA_FALSE;
396
if (ed->delete_me) return EINA_FALSE;
397
if (ed->no_anim) return EINA_FALSE;
404
_edje_program_run_cleanup(Edje *ed, Edje_Running_Program *runp)
406
ed->actions = eina_list_remove(ed->actions, runp);
409
efl_event_callback_del(ed->obj, EFL_CANVAS_OBJECT_EVENT_ANIMATOR_TICK, _edje_timer_cb, ed);
410
ecore_animator_del(ed->animator);
416
_edje_program_run_iterate(Edje_Running_Program *runp, double tim)
418
FLOAT_T t, total, t_scale = runp->edje->duration_scale;
421
Edje_Program_Target *pt;
425
if (ed->delete_me) return EINA_FALSE;
428
_edje_util_freeze(ed);
430
if (runp->program->tween.use_duration_factor)
431
t_scale = _edje_transition_duration_scale;
432
t = FROM_DOUBLE(tim - runp->start_time);
433
total = runp->program->tween.time * t_scale;
435
if (t > FROM_INT(1)) t = FROM_INT(1);
436
EINA_LIST_FOREACH(runp->program->targets, l, pt)
440
rp = ed->table_parts[pt->id % ed->table_parts_size];
442
_edje_part_pos_set(ed, rp,
443
runp->program->tween.mode, t,
444
runp->program->tween.v1,
445
runp->program->tween.v2,
446
runp->program->tween.v3,
447
runp->program->tween.v4);
450
if (t >= FROM_INT(1))
452
Edje_Program_After *pa;
454
EINA_LIST_FOREACH(runp->program->targets, l, pt)
458
rp = ed->table_parts[pt->id % ed->table_parts_size];
461
_edje_part_description_apply(ed, rp,
462
runp->program->state,
463
runp->program->value,
466
_edje_part_pos_set(ed, rp,
467
runp->program->tween.mode, ZERO,
468
runp->program->tween.v1,
469
runp->program->tween.v2,
470
runp->program->tween.v3,
471
runp->program->tween.v4);
477
runp->delete_me = EINA_TRUE;
478
if (!ed->walking_actions)
479
_edje_program_run_cleanup(ed, runp);
481
if (_edje_block_break(ed))
483
if (!ed->walking_actions)
487
_edje_program_run_cleanup(ed, runp);
493
EINA_LIST_FOREACH(runp->program->after, l, pa)
499
pr = ed->collection->patterns.table_programs[pa->id % ed->collection->patterns.table_programs_size];
500
if (pr) _edje_program_run(ed, pr, 0, "", "", NULL);
501
if (_edje_block_break(ed))
503
if ((!ed->walking_actions) && (runp->ref == 0))
505
_edje_program_run_cleanup(ed, runp);
514
if ((!ed->walking_actions) && (runp->ref == 0))
516
_edje_program_run_cleanup(ed, runp);
531
_edje_program_end(Edje *ed, Edje_Running_Program *runp)
534
Edje_Program_Target *pt;
538
if (ed->delete_me) return;
540
_edje_util_freeze(ed);
541
EINA_LIST_FOREACH(runp->program->targets, l, pt)
547
rp = ed->table_parts[pt->id % ed->table_parts_size];
550
_edje_part_description_apply(ed, rp,
551
runp->program->state,
552
runp->program->value,
555
_edje_part_pos_set(ed, rp,
556
runp->program->tween.mode, ZERO,
557
runp->program->tween.v1,
558
runp->program->tween.v2,
559
runp->program->tween.v3,
560
runp->program->tween.v4);
567
runp->delete_me = EINA_TRUE;
569
if (!ed->walking_actions)
571
_edje_program_run_cleanup(ed, runp);
577
if ((free_runp) && (runp->ref == 0)) free(runp);
582
_edje_physics_action_set(Edje *ed, Edje_Program *pr, void (*func)(EPhysics_Body *body, double x, double y, double z))
584
Edje_Program_Target *pt;
588
if (_edje_block_break(ed)) return EINA_FALSE;
590
EINA_LIST_FOREACH(pr->targets, l, pt)
594
rp = ed->table_parts[pt->id % ed->table_parts_size];
595
if ((rp) && (rp->body))
596
func(rp->body, pr->physics.x, pr->physics.y, pr->physics.z);
606
_edje_seat_name_emit(Edje *ed, const char *name, const char *sig, const char *src)
611
_edje_emit_full(ed, sig, src, NULL, NULL);
615
snprintf(buf, sizeof(buf), "seat,%s,%s", name, sig);
616
_edje_emit_full(ed, buf, src, NULL, NULL);
620
_edje_part_focus_set(Edje *ed, const char *seat_name, Edje_Real_Part *rp)
622
Edje_Real_Part *focused_part;
623
Eina_Stringshare *sname;
624
Efl_Input_Device *seat;
628
sname = eina_stringshare_add(seat_name);
631
e = evas_object_evas_get(ed->obj);
632
seat = evas_default_device_get(e, EVAS_DEVICE_CLASS_SEAT);
633
sname = eina_stringshare_ref(_edje_seat_name_get(ed, seat));
636
focused_part = _edje_focused_part_get(ed, sname);
638
if (focused_part != rp)
640
if (rp && (rp->part->allowed_seats) &&
641
(!_edje_part_allowed_seat_find(rp, sname)))
645
_edje_seat_name_emit(ed, sname, "focus,part,out",
646
focused_part->part->name);
647
_edje_focused_part_set(ed, sname, rp);
649
_edje_seat_name_emit(ed, sname, "focus,part,in", rp->part->name);
653
eina_stringshare_del(sname);
657
_edje_program_run(Edje *ed, Edje_Program *pr, Eina_Bool force, const char *ssig, const char *ssrc, Edje_Message_Signal_Data *mdata)
661
Edje_Program_Target *pt;
663
Edje_Program_After *pa;
665
static int recursions = 0;
666
static int recursion_limit = 0;
668
if (ed->delete_me) return;
669
if ((pr->in.from > 0.0) && (pr->in.range >= 0.0) && (!force))
671
Edje_Pending_Program *pp;
674
pp = calloc(1, sizeof(Edje_Pending_Program));
676
if (pr->in.range > 0.0) r = ((double)rand() / RAND_MAX);
677
pp->timer = ecore_timer_add(pr->in.from + (pr->in.range * r),
678
_edje_pending_timer_cb, pp);
686
ed->pending_actions = eina_list_append(ed->pending_actions, pp);
689
if ((recursions >= 64) || (recursion_limit))
691
ERR("Programs recursing up to recursion limit of %i in '%s' with sig='%s', src='%s' from '%s', '%s'. Disabled.",
692
64, pr->name, ssig, ssrc, ed->path, ed->group);
693
if (pr->action == EDJE_ACTION_TYPE_STATE_SET && (EQ(pr->tween.time, ZERO) || (ed->no_anim)))
694
ERR("Possible solution: try adding transition time to prevent Schrödinger's part state");
701
_edje_util_freeze(ed);
704
case EDJE_ACTION_TYPE_STATE_SET:
705
if ((pr->tween.time > ZERO) && (!ed->no_anim))
707
Edje_Running_Program *runp;
709
runp = calloc(1, sizeof(Edje_Running_Program));
710
EINA_LIST_FOREACH(pr->targets, l, pt)
714
rp = ed->table_parts[pt->id % ed->table_parts_size];
717
if ((rp->object) && (pr->tween.mode & EDJE_TWEEN_MODE_OPT_FROM_CURRENT))
719
Edje_Calc_Params *tmp;
721
tmp = calloc(1, sizeof(Edje_Calc_Params));
722
if (!tmp) goto low_mem_current;
723
_edje_part_recalc(ed, rp, FLAG_XY, tmp);
727
#ifdef EDJE_CALC_CACHE
728
_edje_calc_params_clear(rp->current);
739
#ifdef EDJE_CALC_CACHE
740
_edje_calc_params_clear(rp->current);
748
_edje_program_end(ed, rp->program);
749
_edje_part_description_apply(ed, rp,
750
rp->param1.description->state.name,
751
rp->param1.description->state.value,
754
_edje_part_pos_set(ed, rp, pr->tween.mode, ZERO,
764
if (_edje_block_break(ed))
766
ed->actions = eina_list_append(ed->actions, runp);
772
if (ed->canvas_animator)
773
efl_event_callback_add(ed->obj, EFL_CANVAS_OBJECT_EVENT_ANIMATOR_TICK, _edje_timer_cb, ed);
775
ed->animator = ecore_animator_add(_edje_animator_cb, ed);
777
ed->actions = eina_list_append(ed->actions, runp);
779
runp->start_time = ecore_loop_time_get();
785
EINA_LIST_FOREACH(pr->targets, l, pt)
789
rp = ed->table_parts[pt->id % ed->table_parts_size];
793
_edje_program_end(ed, rp->program);
794
_edje_part_description_apply(ed, rp,
799
_edje_part_pos_set(ed, rp, pr->tween.mode, ZERO,
808
if (_edje_block_break(ed)) goto break_prog;
810
if (_edje_block_break(ed)) goto break_prog;
812
EINA_LIST_FOREACH(pr->after, l, pa)
816
pr2 = ed->collection->patterns.table_programs[pa->id % ed->collection->patterns.table_programs_size];
817
if (pr2) _edje_program_run(ed, pr2, 0, "", "", mdata);
818
if (_edje_block_break(ed)) goto break_prog;
825
case EDJE_ACTION_TYPE_ACTION_STOP:
827
EINA_LIST_FOREACH(pr->targets, l, pt)
830
Edje_Running_Program *runp;
831
Edje_Pending_Program *pp;
833
for (ll = ed->actions; ll; )
837
if (pt->id == runp->program->id)
839
_edje_program_end(ed, runp);
843
for (ll = ed->pending_actions; ll; )
847
if (pt->id == pp->program->id)
849
ed->pending_actions = eina_list_remove(ed->pending_actions, pp);
850
ecore_timer_del(pp->timer);
860
if (_edje_block_break(ed)) goto break_prog;
863
case EDJE_ACTION_TYPE_SIGNAL_EMIT:
865
if (_edje_block_break(ed)) goto break_prog;
868
EINA_LIST_FOREACH(pr->targets, l, pt)
870
if (pt->id < 0) continue;
871
rp = ed->table_parts[pt->id % ed->table_parts_size];
873
if (!_edje_emit_aliased(ed, rp->part->name, pr->state, pr->state2))
877
broadcast = _edje_emit_child(ed, rp, rp->part->name, pr->state, pr->state2);
878
_edje_emit_send(ed, broadcast, pr->state, pr->state2, mdata);
883
_edje_emit_full_data(ed, pr->state, pr->state2, mdata);
884
if (_edje_block_break(ed)) goto break_prog;
886
if (_edje_block_break(ed)) goto break_prog;
889
case EDJE_ACTION_TYPE_DRAG_VAL_SET:
891
if (_edje_block_break(ed)) goto break_prog;
892
EINA_LIST_FOREACH(pr->targets, l, pt)
896
rp = ed->table_parts[pt->id % ed->table_parts_size];
897
if ((rp) && (rp->drag) && (rp->drag->down.count == 0))
899
rp->drag->val.x = pr->value;
900
rp->drag->val.y = pr->value2;
901
if (rp->drag->val.x < 0.0) rp->drag->val.x = 0.0;
902
else if (rp->drag->val.x > 1.0)
903
rp->drag->val.x = 1.0;
904
if (rp->drag->val.y < 0.0) rp->drag->val.y = 0.0;
905
else if (rp->drag->val.y > 1.0)
906
rp->drag->val.y = 1.0;
907
_edje_dragable_pos_set(ed, rp, rp->drag->val.x, rp->drag->val.y);
908
_edje_emit(ed, "drag,set", rp->part->name);
909
if (_edje_block_break(ed)) goto break_prog;
914
if (_edje_block_break(ed)) goto break_prog;
917
case EDJE_ACTION_TYPE_DRAG_VAL_STEP:
919
if (_edje_block_break(ed)) goto break_prog;
920
EINA_LIST_FOREACH(pr->targets, l, pt)
924
rp = ed->table_parts[pt->id % ed->table_parts_size];
925
if ((rp) && (rp->drag) && (rp->drag->down.count == 0))
927
rp->drag->val.x += pr->value * rp->drag->step.x * rp->part->dragable.x;
928
rp->drag->val.y += pr->value2 * rp->drag->step.y * rp->part->dragable.y;
929
if (rp->drag->val.x < 0.0) rp->drag->val.x = 0.0;
930
else if (rp->drag->val.x > 1.0)
931
rp->drag->val.x = 1.0;
932
if (rp->drag->val.y < 0.0) rp->drag->val.y = 0.0;
933
else if (rp->drag->val.y > 1.0)
934
rp->drag->val.y = 1.0;
935
_edje_dragable_pos_set(ed, rp, rp->drag->val.x, rp->drag->val.y);
936
_edje_emit(ed, "drag,step", rp->part->name);
937
if (_edje_block_break(ed)) goto break_prog;
942
if (_edje_block_break(ed)) goto break_prog;
945
case EDJE_ACTION_TYPE_DRAG_VAL_PAGE:
947
if (_edje_block_break(ed)) goto break_prog;
948
EINA_LIST_FOREACH(pr->targets, l, pt)
952
rp = ed->table_parts[pt->id % ed->table_parts_size];
953
if ((rp) && (rp->drag) && (rp->drag->down.count == 0))
955
rp->drag->val.x += pr->value * rp->drag->page.x * rp->part->dragable.x;
956
rp->drag->val.y += pr->value2 * rp->drag->page.y * rp->part->dragable.y;
957
if (rp->drag->val.x < 0.0) rp->drag->val.x = 0.0;
958
else if (rp->drag->val.x > 1.0)
959
rp->drag->val.x = 1.0;
960
if (rp->drag->val.y < 0.0) rp->drag->val.y = 0.0;
961
else if (rp->drag->val.y > 1.0)
962
rp->drag->val.y = 1.0;
963
_edje_dragable_pos_set(ed, rp, rp->drag->val.x, rp->drag->val.y);
964
_edje_emit(ed, "drag,page", rp->part->name);
965
if (_edje_block_break(ed)) goto break_prog;
970
if (_edje_block_break(ed)) goto break_prog;
973
case EDJE_ACTION_TYPE_SCRIPT:
976
if (_edje_block_break(ed)) goto break_prog;
977
_edje_embryo_test_run(ed, pr, ssig, ssrc);
979
if (_edje_block_break(ed)) goto break_prog;
984
case EDJE_ACTION_TYPE_FOCUS_SET:
987
_edje_part_focus_set(ed, pr->seat, NULL);
990
EINA_LIST_FOREACH(pr->targets, l, pt)
994
rp = ed->table_parts[pt->id % ed->table_parts_size];
996
_edje_part_focus_set(ed, pr->seat, rp);
1003
case EDJE_ACTION_TYPE_FOCUS_OBJECT:
1005
Efl_Input_Device *seat = NULL;
1009
Eina_Stringshare *seat_name;
1011
seat_name = eina_stringshare_add(pr->seat);
1012
seat = _edje_seat_get(ed, seat_name);
1013
eina_stringshare_del(seat_name);
1019
e = evas_object_evas_get(ed->obj);
1020
seat = evas_default_device_get(e, EVAS_DEVICE_CLASS_SEAT);
1024
Evas_Object *focused;
1026
focused = evas_seat_focus_get(evas_object_evas_get(ed->obj), seat);
1032
for (i = 0; i < ed->table_parts_size; ++i)
1034
rp = ed->table_parts[i];
1036
((rp->type == EDJE_RP_TYPE_SWALLOW) &&
1037
(rp->typedata.swallow)) &&
1038
(rp->typedata.swallow->swallowed_object == focused))
1040
efl_canvas_object_seat_focus_del(focused, seat);
1048
EINA_LIST_FOREACH(pr->targets, l, pt)
1052
rp = ed->table_parts[pt->id % ed->table_parts_size];
1054
((rp->type == EDJE_RP_TYPE_SWALLOW) &&
1055
(rp->typedata.swallow)) &&
1056
(rp->typedata.swallow->swallowed_object))
1057
efl_canvas_object_seat_focus_add(
1058
rp->typedata.swallow->swallowed_object, seat);
1065
case EDJE_ACTION_TYPE_SOUND_SAMPLE:
1066
if (_edje_block_break(ed))
1068
_edje_multisense_internal_sound_sample_play(ed, pr->sample_name, pr->speed, pr->channel);
1071
case EDJE_ACTION_TYPE_SOUND_TONE:
1072
if (_edje_block_break(ed))
1074
_edje_multisense_internal_sound_tone_play(ed, pr->tone_name, pr->duration, pr->channel);
1077
case EDJE_ACTION_TYPE_VIBRATION_SAMPLE:
1078
if (_edje_block_break(ed))
1080
_edje_multisense_internal_vibration_sample_play(ed, pr->vibration_name, pr->vibration_repeat);
1083
case EDJE_ACTION_TYPE_PARAM_COPY:
1085
Edje_Real_Part *src_part, *dst_part;
1088
if (_edje_block_break(ed)) goto break_prog;
1090
src_part = ed->table_parts[pr->param.src % ed->table_parts_size];
1091
dst_part = ed->table_parts[pr->param.dst % ed->table_parts_size];
1092
_edje_param_copy(ed, src_part, pr->state, dst_part, pr->state2);
1094
if (_edje_block_break(ed)) goto break_prog;
1096
if (_edje_block_break(ed)) goto break_prog;
1100
case EDJE_ACTION_TYPE_PARAM_SET:
1102
Edje_Real_Part *part;
1105
if (_edje_block_break(ed)) goto break_prog;
1107
part = ed->table_parts[pr->param.dst % ed->table_parts_size];
1108
_edje_param_set(ed, part, pr->state, pr->state2);
1110
if (_edje_block_break(ed)) goto break_prog;
1112
if (_edje_block_break(ed)) goto break_prog;
1117
case EDJE_ACTION_TYPE_PHYSICS_IMPULSE:
1120
if (!_edje_physics_action_set(ed, pr, EPH_CALL(ephysics_body_central_impulse_apply)))
1125
case EDJE_ACTION_TYPE_PHYSICS_TORQUE_IMPULSE:
1128
if (!_edje_physics_action_set(ed, pr, EPH_CALL(ephysics_body_torque_impulse_apply)))
1133
case EDJE_ACTION_TYPE_PHYSICS_FORCE:
1136
if (!_edje_physics_action_set(ed, pr, EPH_CALL(ephysics_body_central_force_apply)))
1141
case EDJE_ACTION_TYPE_PHYSICS_TORQUE:
1144
if (!_edje_physics_action_set(ed, pr, EPH_CALL(ephysics_body_torque_apply)))
1149
case EDJE_ACTION_TYPE_PHYSICS_FORCES_CLEAR:
1152
if (_edje_block_break(ed))
1154
EINA_LIST_FOREACH(pr->targets, l, pt)
1158
rp = ed->table_parts[pt->id % ed->table_parts_size];
1159
if ((rp) && (rp->body))
1160
EPH_CALL(ephysics_body_forces_clear)(rp->body);
1166
case EDJE_ACTION_TYPE_PHYSICS_VEL_SET:
1169
if (!_edje_physics_action_set(ed, pr, EPH_CALL(ephysics_body_linear_velocity_set)))
1174
case EDJE_ACTION_TYPE_PHYSICS_ANG_VEL_SET:
1177
if (!_edje_physics_action_set(ed, pr, EPH_CALL(ephysics_body_angular_velocity_set)))
1182
case EDJE_ACTION_TYPE_PHYSICS_STOP:
1185
if (_edje_block_break(ed))
1187
EINA_LIST_FOREACH(pr->targets, l, pt)
1191
rp = ed->table_parts[pt->id % ed->table_parts_size];
1192
if ((rp) && (rp->body))
1193
EPH_CALL(ephysics_body_stop)(rp->body);
1199
case EDJE_ACTION_TYPE_PHYSICS_ROT_SET:
1202
if (_edje_block_break(ed))
1204
EINA_LIST_FOREACH(pr->targets, l, pt)
1208
rp = ed->table_parts[pt->id % ed->table_parts_size];
1209
if ((rp) && (rp->body))
1211
EPhysics_Quaternion quat;
1212
EPH_CALL(ephysics_quaternion_set)(&quat, pr->physics.x,
1213
pr->physics.y, pr->physics.z,
1215
EPH_CALL(ephysics_quaternion_normalize)(&quat);
1216
EPH_CALL(ephysics_body_rotation_set)(rp->body, &quat);
1225
#ifdef BUILD_VG_LOADER_JSON
1226
case EDJE_ACTION_TYPE_VG_ANIM_STOP:
1227
if (_edje_block_break(ed))
1229
EINA_LIST_FOREACH(pr->targets, l, pt)
1233
rp = ed->table_parts[pt->id % ed->table_parts_size];
1235
_edje_part_vector_anim_stop(ed, rp);
1240
case EDJE_ACTION_TYPE_VG_ANIM_PAUSE:
1241
if (_edje_block_break(ed))
1243
EINA_LIST_FOREACH(pr->targets, l, pt)
1247
rp = ed->table_parts[pt->id % ed->table_parts_size];
1249
_edje_part_vector_anim_pause(ed, rp);
1254
case EDJE_ACTION_TYPE_VG_ANIM_RESUME:
1255
if (_edje_block_break(ed))
1257
EINA_LIST_FOREACH(pr->targets, l, pt)
1261
rp = ed->table_parts[pt->id % ed->table_parts_size];
1263
_edje_part_vector_anim_resume(ed, rp);
1268
case EDJE_ACTION_TYPE_VG_ANIM_LOOP:
1269
case EDJE_ACTION_TYPE_VG_ANIM_REWIND:
1270
case EDJE_ACTION_TYPE_VG_ANIM_PLAY:
1271
if (_edje_block_break(ed))
1273
EINA_LIST_FOREACH(pr->targets, l, pt)
1277
rp = ed->table_parts[pt->id % ed->table_parts_size];
1280
Eina_Bool vector_anim_backward = EINA_FALSE;
1281
Eina_Bool vector_anim_loop = EINA_FALSE;
1283
if (pr->action == EDJE_ACTION_TYPE_VG_ANIM_REWIND)
1284
vector_anim_backward = EINA_TRUE;
1286
if (pr->action == EDJE_ACTION_TYPE_VG_ANIM_LOOP)
1287
vector_anim_loop = EINA_TRUE;
1289
_edje_part_vector_anim_play(ed, rp,
1290
vector_anim_backward,
1297
case EDJE_ACTION_TYPE_VG_ANIM_STOP:
1298
case EDJE_ACTION_TYPE_VG_ANIM_PAUSE:
1299
case EDJE_ACTION_TYPE_VG_ANIM_RESUME:
1300
case EDJE_ACTION_TYPE_VG_ANIM_LOOP:
1301
case EDJE_ACTION_TYPE_VG_ANIM_REWIND:
1302
case EDJE_ACTION_TYPE_VG_ANIM_PLAY:
1303
ERR("Evas Vg Json (Lottie) Loader is not supported, Only Static Vector Image(SVG) is available!");
1312
if (!((pr->action == EDJE_ACTION_TYPE_STATE_SET)
1317
EINA_LIST_FOREACH(pr->after, l, pa)
1321
pr2 = ed->collection->patterns.table_programs[pa->id % ed->collection->patterns.table_programs_size];
1322
if (pr2) _edje_program_run(ed, pr2, 0, "", "", mdata);
1323
if (_edje_block_break(ed)) goto break_prog;
1328
_edje_util_thaw(ed);
1331
if (recursions == 0) recursion_limit = 0;
1336
_edje_emit(Edje *ed, const char *sig, const char *src)
1338
_edje_emit_full(ed, sig, src, NULL, NULL);
1342
_edje_seat_emit(Edje *ed, Efl_Input_Device *dev, const char *sig, const char *src)
1344
Edje_Message_Signal_Data *mdata = NULL;
1345
Efl_Input_Device *seat = NULL;
1350
if (dev) seat = efl_input_device_seat_get(dev);
1353
sname = eina_strdup(efl_name_get(seat));
1354
mdata = _edje_signal_data_setup(NULL, NULL, sname, free);
1358
_edje_emit_full_data(ed, sig, src, mdata);
1364
s = _edje_seat_name_get(ed, seat);
1366
snprintf(buf, sizeof(buf), "seat,%s,%s", s, sig);
1367
_edje_emit_full_data(ed, buf, src, mdata);
1368
_edje_signal_data_free(mdata);
1373
_edje_emit_full(Edje *ed, const char *sig, const char *src, void *data, void (*free_func)(void *))
1375
Edje_Message_Signal_Data *mdata;
1377
mdata = _edje_signal_data_setup(data, free_func, NULL, NULL);
1378
_edje_emit_full_data(ed, sig, src, mdata);
1379
_edje_signal_data_free(mdata);
1383
_edje_emit_full_data(Edje *ed, const char *sig, const char *src, Edje_Message_Signal_Data *mdata)
1386
Eina_Bool broadcast;
1388
if (!ed->collection) return;
1389
if (ed->delete_me) return;
1391
_edje_signal_data_ref(mdata);
1393
sep = strchr(sig, EDJE_PART_PATH_SEPARATOR);
1401
unsigned int length;
1404
length = sep - sig + 1;
1405
part = alloca(length);
1406
memcpy(part, sig, length - 1);
1407
part[length - 1] = '\0';
1411
if (_edje_emit_aliased(ed, part, newsig, src)) goto out;
1413
broadcast = _edje_emit_child(ed, NULL, part, newsig, src);
1416
broadcast = ed->collection->broadcast_signal;
1418
_edje_emit_send(ed, broadcast, sig, src, mdata);
1420
_edje_signal_data_free(mdata);
1424
_edje_focused_part_set(Edje *ed, Eina_Stringshare *seat_name, Edje_Real_Part *rp)
1430
if (!seat_name) seat_name = eina_stringshare_add("seat1");
1432
EINA_LIST_FOREACH(ed->seats, l, seat)
1434
if (seat_name == seat->name)
1436
seat->focused_part = rp;
1442
seat = calloc(1, sizeof(Edje_Seat));
1443
EINA_SAFETY_ON_NULL_RETURN(seat);
1445
seat->name = eina_stringshare_ref(seat_name);
1446
seat->focused_part = rp;
1447
ed->seats = eina_list_append(ed->seats, seat);
1453
_edje_focused_part_get(Edje *ed, Eina_Stringshare *seat_name)
1459
if (!seat_name) seat_name = eina_stringshare_add("seat1");
1461
EINA_LIST_FOREACH(ed->seats, l, seat)
1463
if (seat_name == seat->name)
1464
return seat->focused_part;
1471
_edje_seat_name_get(Edje *ed, Efl_Input_Device *device)
1476
EINA_LIST_FOREACH(ed->seats, l, seat)
1478
if (seat->device == device)
1486
_edje_seat_get(Edje *ed, Eina_Stringshare *name)
1491
EINA_LIST_FOREACH(ed->seats, l, seat)
1493
if (seat->name == name)
1494
return seat->device;
1500
struct _Edje_Program_Data
1508
_edje_glob_callback(Edje_Program *pr, void *dt)
1510
struct _Edje_Program_Data *data = dt;
1511
Edje_Real_Part *rp = NULL;
1512
Eina_Bool exec = EINA_TRUE;
1514
if (pr->filter.state)
1516
rp = _edje_real_part_get(data->ed, pr->filter.part ? pr->filter.part : data->source);
1518
exec = !strcmp(rp->chosen_description->state.name, pr->filter.state);
1523
data->matches = eina_list_append(data->matches, pr);
1530
_edje_emit_handle(Edje *ed, const char *sig, const char *src,
1531
Edje_Message_Signal_Data *sdata, Eina_Bool prop)
1533
if (ed->delete_me) return;
1536
DBG("EDJE EMIT: (%p) signal: \"%s\" source: \"%s\"", ed, sig, src);
1539
_edje_util_freeze(ed);
1541
if (ed->collection && ed->L)
1542
_edje_lua2_script_func_signal(ed, sig, src);
1546
#ifdef EDJE_PROGRAM_CACHE
1547
Edje_Part_Collection *ec;
1553
#ifdef EDJE_PROGRAM_CACHE
1554
ec = ed->collection;
1557
tmps = alloca(l1 + l2 + 3);
1560
strcpy(&(tmps[l1 + 1]), src);
1564
#ifdef EDJE_PROGRAM_CACHE
1570
if (eina_hash_find(ec->prog_cache.no_matches, tmps))
1574
else if ((matches = eina_hash_find(ec->prog_cache.matches, tmps)))
1576
EINA_LIST_FOREACH(matches, l, pr)
1578
Eina_Bool exec = EINA_TRUE;
1580
if (pr->filter.state)
1584
rp = _edje_real_part_get(ed, pr->filter.part ? pr->filter.part : src);
1590
exec = (rp->chosen_description->state.name != pr->filter.state) ?
1591
!strcmp(rp->chosen_description->state.name, pr->filter.state) : EINA_TRUE;
1598
EINA_LIST_FOREACH(matches, l, pr)
1601
_edje_program_run(ed, pr, 0, sig, src, sdata);
1602
if (_edje_block_break(ed))
1614
struct _Edje_Program_Data data;
1618
data.matches = NULL;
1620
if (ed->collection->patterns.table_programs_size > 0)
1622
const Eina_Inarray *match;
1623
#ifdef EDJE_PROGRAM_CACHE
1628
if (ed->collection->patterns.programs.u.programs.globing)
1629
if (edje_match_programs_exec(ed->collection->patterns.programs.signals_patterns,
1630
ed->collection->patterns.programs.sources_patterns,
1633
ed->collection->patterns.programs.u.programs.globing,
1634
_edje_glob_callback,
1639
match = edje_match_signal_source_hash_get(sig, src,
1640
ed->collection->patterns.programs.exact_match);
1645
EINA_INARRAY_FOREACH(match, tpr)
1646
_edje_glob_callback(*tpr, &data);
1649
#ifdef EDJE_PROGRAM_CACHE
1650
EINA_LIST_FOREACH(data.matches, l, pr)
1652
EINA_LIST_FREE(data.matches, pr)
1656
_edje_program_run(ed, pr, 0, sig, src, sdata);
1658
if (_edje_block_break(ed))
1660
eina_list_free(data.matches);
1661
data.matches = NULL;
1667
#ifdef EDJE_PROGRAM_CACHE
1670
if (data.matches == NULL)
1672
if (!ec->prog_cache.no_matches)
1673
ec->prog_cache.no_matches = eina_hash_string_superfast_new(NULL);
1674
eina_hash_add(ec->prog_cache.no_matches, tmps, ed);
1678
if (!ec->prog_cache.matches)
1679
ec->prog_cache.matches = eina_hash_string_superfast_new(NULL);
1680
eina_hash_add(ec->prog_cache.matches, tmps, data.matches);
1685
_edje_emit_cb(ed, sig, src, sdata, prop);
1686
if (_edje_block_break(ed))
1692
_edje_util_thaw(ed);
1698
static void *callback_extra_data = NULL;
1699
static void *callback_seat_data = NULL;
1702
edje_object_signal_callback_extra_data_get(void)
1704
return callback_extra_data;
1707
#ifdef EFL_BETA_API_SUPPORT
1709
edje_object_signal_callback_seat_data_get(void)
1711
return callback_seat_data;
1717
_edje_emit_cb(Edje *ed, const char *sig, const char *src, Edje_Message_Signal_Data *data, Eina_Bool prop)
1719
const Edje_Signals_Sources_Patterns *ssp;
1720
Edje_Signal_Callback_Matches *m;
1721
const Eina_Inarray *match;
1724
if (ed->delete_me) return;
1725
if (!ed->callbacks || !ed->callbacks->matches) return;
1728
_edje_util_freeze(ed);
1731
ed->walking_callbacks++;
1733
ssp = _edje_signal_callback_patterns_ref
1734
((Edje_Signal_Callback_Group *)ed->callbacks);
1737
m = (Edje_Signal_Callback_Matches *)ed->callbacks->matches;
1738
EINA_REFCOUNT_REF(m);
1740
callback_extra_data = (data) ? data->data : NULL;
1741
callback_seat_data = (data) ? data->seat_data : NULL;
1743
if (eina_inarray_count(&ssp->u.callbacks.globing))
1744
r = edje_match_callback_exec(ssp,
1751
if (!r) goto break_prog;
1753
match = edje_match_signal_source_hash_get(sig, src,
1757
const Edje_Signal_Callback_Match *cb;
1760
EINA_INARRAY_FOREACH(match, i)
1762
if (ed->callbacks->flags[*i].delete_me) continue;
1763
if ((prop) && (ed->callbacks->flags[*i].propagate)) continue;
1765
cb = &m->matches[*i];
1767
if (ed->callbacks->flags[*i].legacy)
1768
cb->legacy((void *)ed->callbacks->custom_data[*i], ed->obj, sig, src);
1770
cb->eo((void *)ed->callbacks->custom_data[*i], ed->obj, sig, src);
1771
if (_edje_block_break(ed)) break;
1776
_edje_signal_callback_matches_unref(m, ed->callbacks->flags, ed->callbacks->custom_data);
1778
_edje_signal_callback_patterns_unref(ssp);
1781
ed->walking_callbacks--;
1783
if (ed->walking_callbacks == 0)
1784
_edje_signal_callback_reset(ed->callbacks->flags,
1785
ed->callbacks->matches->matches_count);
1788
_edje_util_thaw(ed);
1792
static const Edje_External_Param_Info *
1793
_edje_external_param_info_get(const Evas_Object *obj, const char *name)
1795
const Edje_External_Type *type;
1796
const Edje_External_Param_Info *info;
1798
type = evas_object_data_get(obj, "Edje_External_Type");
1799
if (!type) return NULL;
1800
for (info = type->parameters_info; info->name; info++)
1801
if (!strcmp(info->name, name)) return info;
1806
static Edje_External_Param *
1807
_edje_param_external_get(Edje_Real_Part *rp, const char *name, Edje_External_Param *param)
1809
Evas_Object *swallowed_object;
1810
const Edje_External_Param_Info *info;
1812
if ((rp->type != EDJE_RP_TYPE_SWALLOW) ||
1813
(!rp->typedata.swallow)) return NULL;
1814
swallowed_object = rp->typedata.swallow->swallowed_object;
1816
info = _edje_external_param_info_get(swallowed_object, name);
1817
if (!info) return NULL;
1819
memset(param, 0, sizeof(*param));
1820
param->name = info->name;
1821
param->type = info->type;
1822
if (!_edje_external_param_get(NULL, rp, param)) return NULL;
1827
static Edje_External_Param *
1828
_edje_param_native_get(Edje *ed, Edje_Real_Part *rp, const char *name, Edje_External_Param *param, void **free_ptr)
1831
if ((rp->part->type == EDJE_PART_TYPE_TEXT) ||
1832
(rp->part->type == EDJE_PART_TYPE_TEXTBLOCK))
1834
if (!strcmp(name, "text"))
1837
param->type = EDJE_EXTERNAL_PARAM_TYPE_STRING;
1839
_edje_recalc_do(ed);
1840
if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1841
param->s = _edje_entry_text_get(rp);
1842
else if ((rp->part->type == EDJE_PART_TYPE_TEXT) &&
1843
((rp->type == EDJE_RP_TYPE_TEXT) &&
1844
(rp->typedata.text)))
1845
param->s = rp->typedata.text->text;
1847
param->s = evas_object_textblock_text_markup_get(rp->object);
1850
if (rp->part->type == EDJE_PART_TYPE_TEXTBLOCK)
1852
if (!strcmp(name, "text_unescaped"))
1855
param->type = EDJE_EXTERNAL_PARAM_TYPE_STRING;
1857
_edje_recalc_do(ed);
1858
if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1860
const char *tmp = _edje_entry_text_get(rp);
1861
char *unescaped = _edje_text_unescape(tmp);
1862
*free_ptr = unescaped;
1863
param->s = unescaped;
1865
else if ((rp->part->type == EDJE_PART_TYPE_TEXT) &&
1866
((rp->type == EDJE_RP_TYPE_TEXT) &&
1867
(rp->typedata.text)))
1868
param->s = rp->typedata.text->text;
1874
tmp = evas_object_textblock_text_markup_get(rp->object);
1875
unescaped = _edje_text_unescape(tmp);
1876
*free_ptr = unescaped;
1877
param->s = unescaped;
1883
if (((rp->type == EDJE_RP_TYPE_TEXT) &&
1884
(rp->typedata.text)) &&
1885
((rp->typedata.text->entry_data) &&
1886
(rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE) &&
1887
(!strcmp(name, "select_allow"))))
1890
param->type = EDJE_EXTERNAL_PARAM_TYPE_BOOL;
1891
param->i = _edje_entry_select_allow_get(rp);
1897
if ((rp->drag) && (rp->drag->down.count == 0))
1899
if (!strncmp(name, "drag_", sizeof("drag_") - 1))
1901
const char *sub_name = name + sizeof("drag_") - 1;
1902
if (!strcmp(sub_name, "value_x"))
1906
_edje_recalc_do(ed);
1907
d = TO_DOUBLE(rp->drag->val.x);
1908
if (rp->part->dragable.x < 0) d = 1.0 - d;
1910
param->type = EDJE_EXTERNAL_PARAM_TYPE_DOUBLE;
1914
if (!strcmp(sub_name, "value_y"))
1918
_edje_recalc_do(ed);
1919
d = TO_DOUBLE(rp->drag->val.y);
1920
if (rp->part->dragable.y < 0) d = 1.0 - d;
1922
param->type = EDJE_EXTERNAL_PARAM_TYPE_DOUBLE;
1927
if (!strcmp(sub_name, "size_w"))
1929
_edje_recalc_do(ed);
1931
param->type = EDJE_EXTERNAL_PARAM_TYPE_DOUBLE;
1932
param->d = TO_DOUBLE(rp->drag->size.x);
1935
if (!strcmp(sub_name, "size_h"))
1937
_edje_recalc_do(ed);
1939
param->type = EDJE_EXTERNAL_PARAM_TYPE_DOUBLE;
1940
param->d = TO_DOUBLE(rp->drag->size.y);
1944
if (!strcmp(sub_name, "step_x"))
1946
_edje_recalc_do(ed);
1948
param->type = EDJE_EXTERNAL_PARAM_TYPE_DOUBLE;
1949
param->d = TO_DOUBLE(rp->drag->step.x);
1952
if (!strcmp(sub_name, "step_y"))
1954
_edje_recalc_do(ed);
1956
param->type = EDJE_EXTERNAL_PARAM_TYPE_DOUBLE;
1957
param->d = TO_DOUBLE(rp->drag->step.y);
1961
if (!strcmp(sub_name, "page_x"))
1963
_edje_recalc_do(ed);
1965
param->type = EDJE_EXTERNAL_PARAM_TYPE_DOUBLE;
1966
param->d = TO_DOUBLE(rp->drag->page.x);
1969
if (!strcmp(sub_name, "page_y"))
1971
_edje_recalc_do(ed);
1973
param->type = EDJE_EXTERNAL_PARAM_TYPE_DOUBLE;
1974
param->d = TO_DOUBLE(rp->drag->page.y);
1986
_edje_param_native_set(Edje *ed, Edje_Real_Part *rp, const char *name, const Edje_External_Param *param)
1988
if ((rp->part->type == EDJE_PART_TYPE_TEXT) ||
1989
(rp->part->type == EDJE_PART_TYPE_TEXTBLOCK))
1991
if (!strcmp(name, "text"))
1993
if (param->type != EDJE_EXTERNAL_PARAM_TYPE_STRING)
1996
_edje_object_part_text_raw_set(ed, ed->obj, rp, rp->part->name, param->s);
1999
if (rp->part->type == EDJE_PART_TYPE_TEXTBLOCK)
2001
if (!strcmp(name, "text_unescaped"))
2003
if (param->type != EDJE_EXTERNAL_PARAM_TYPE_STRING)
2006
if (rp->part->type == EDJE_PART_TYPE_TEXT)
2007
_edje_object_part_text_raw_set(ed, ed->obj, rp, rp->part->name, param->s);
2010
char *escaped = _edje_text_escape(param->s);
2011
_edje_object_part_text_raw_set(ed, ed->obj, rp, rp->part->name, escaped);
2018
if (((rp->type == EDJE_RP_TYPE_TEXT) &&
2019
(rp->typedata.text)) &&
2020
((rp->typedata.text->entry_data) &&
2021
(rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE) &&
2022
(!strcmp(name, "select_allow"))))
2024
if (param->type != EDJE_EXTERNAL_PARAM_TYPE_BOOL)
2026
_edje_entry_select_allow_set(rp, param->i);
2032
if ((rp->drag) && (rp->drag->down.count == 0))
2034
if (!strncmp(name, "drag_", sizeof("drag_") - 1))
2036
const char *sub_name = name + sizeof("drag_") - 1;
2037
if (!strcmp(sub_name, "value_x"))
2040
if (param->type != EDJE_EXTERNAL_PARAM_TYPE_DOUBLE)
2043
if (rp->part->dragable.confine_id != -1)
2044
d = CLAMP(d, 0.0, 1.0);
2045
if (rp->part->dragable.x < 0) d = 1.0 - d;
2046
if (EQ(rp->drag->val.x, FROM_DOUBLE(d))) return EINA_TRUE;
2047
rp->drag->val.x = FROM_DOUBLE(d);
2048
#ifdef EDJE_CALC_CACHE
2049
rp->invalidate = EINA_TRUE;
2051
_edje_dragable_pos_set
2052
(ed, rp, rp->drag->val.x, rp->drag->val.y);
2053
_edje_emit(ed, "drag,set", rp->part->name);
2056
if (!strcmp(sub_name, "value_y"))
2059
if (param->type != EDJE_EXTERNAL_PARAM_TYPE_DOUBLE)
2062
if (rp->part->dragable.confine_id != -1)
2063
d = CLAMP(d, 0.0, 1.0);
2064
if (rp->part->dragable.y < 0) d = 1.0 - d;
2065
if (EQ(rp->drag->val.y, FROM_DOUBLE(d))) return EINA_TRUE;
2066
rp->drag->val.y = FROM_DOUBLE(d);
2067
#ifdef EDJE_CALC_CACHE
2068
rp->invalidate = EINA_TRUE;
2070
_edje_dragable_pos_set
2071
(ed, rp, rp->drag->val.x, rp->drag->val.y);
2072
_edje_emit(ed, "drag,set", rp->part->name);
2076
if (!strcmp(sub_name, "size_w"))
2078
if (param->type != EDJE_EXTERNAL_PARAM_TYPE_DOUBLE)
2080
rp->drag->size.x = FROM_DOUBLE(CLAMP(param->d, 0.0, 1.0));
2081
ed->recalc_call = EINA_TRUE;
2082
ed->dirty = EINA_TRUE;
2083
#ifdef EDJE_CALC_CACHE
2084
rp->invalidate = EINA_TRUE;
2089
if (!strcmp(sub_name, "size_h"))
2091
if (param->type != EDJE_EXTERNAL_PARAM_TYPE_DOUBLE)
2093
rp->drag->size.y = FROM_DOUBLE(CLAMP(param->d, 0.0, 1.0));
2094
ed->recalc_call = EINA_TRUE;
2095
ed->dirty = EINA_TRUE;
2096
#ifdef EDJE_CALC_CACHE
2097
rp->invalidate = EINA_TRUE;
2103
if (!strcmp(sub_name, "step_x"))
2105
if (param->type != EDJE_EXTERNAL_PARAM_TYPE_DOUBLE)
2107
rp->drag->step.x = FROM_DOUBLE(CLAMP(param->d, 0.0, 1.0));
2108
#ifdef EDJE_CALC_CACHE
2109
rp->invalidate = EINA_TRUE;
2113
if (!strcmp(sub_name, "step_y"))
2115
if (param->type != EDJE_EXTERNAL_PARAM_TYPE_DOUBLE)
2117
rp->drag->step.y = FROM_DOUBLE(CLAMP(param->d, 0.0, 1.0));
2118
#ifdef EDJE_CALC_CACHE
2119
rp->invalidate = EINA_TRUE;
2124
if (!strcmp(sub_name, "page_x"))
2126
if (param->type != EDJE_EXTERNAL_PARAM_TYPE_DOUBLE)
2128
rp->drag->page.x = FROM_DOUBLE(CLAMP(param->d, 0.0, 1.0));
2129
#ifdef EDJE_CALC_CACHE
2130
rp->invalidate = EINA_TRUE;
2134
if (!strcmp(sub_name, "page_y"))
2136
if (param->type != EDJE_EXTERNAL_PARAM_TYPE_DOUBLE)
2138
rp->drag->page.y = FROM_DOUBLE(CLAMP(param->d, 0.0, 1.0));
2139
#ifdef EDJE_CALC_CACHE
2140
rp->invalidate = EINA_TRUE;
2152
static const Edje_External_Param_Info *
2153
_edje_native_param_info_get(const Edje_Real_Part *rp, const char *name)
2155
if ((rp->part->type == EDJE_PART_TYPE_TEXT) ||
2156
(rp->part->type == EDJE_PART_TYPE_TEXTBLOCK))
2158
if (!strcmp(name, "text"))
2160
static const Edje_External_Param_Info pi =
2161
EDJE_EXTERNAL_PARAM_INFO_STRING("text");
2164
if (rp->part->type == EDJE_PART_TYPE_TEXTBLOCK)
2166
if (!strcmp(name, "text_unescaped"))
2168
static const Edje_External_Param_Info pi =
2169
EDJE_EXTERNAL_PARAM_INFO_STRING("text_unescaped");
2172
if (!strcmp(name, "select_allow"))
2174
static const Edje_External_Param_Info pi =
2175
EDJE_EXTERNAL_PARAM_INFO_BOOL("text_unescaped");
2181
if ((rp->drag) && (rp->drag->down.count == 0))
2183
if (!strncmp(name, "drag_", sizeof("drag_") - 1))
2185
name += sizeof("drag_") - 1;
2186
if (!strcmp(name, "value_x"))
2188
static const Edje_External_Param_Info pi =
2189
EDJE_EXTERNAL_PARAM_INFO_DOUBLE("drag_value_x");
2192
if (!strcmp(name, "value_y"))
2194
static const Edje_External_Param_Info pi =
2195
EDJE_EXTERNAL_PARAM_INFO_DOUBLE("drag_value_y");
2198
if (!strcmp(name, "size_w"))
2200
static const Edje_External_Param_Info pi =
2201
EDJE_EXTERNAL_PARAM_INFO_DOUBLE("drag_size_w");
2204
if (!strcmp(name, "size_h"))
2206
static const Edje_External_Param_Info pi =
2207
EDJE_EXTERNAL_PARAM_INFO_DOUBLE("drag_size_h");
2210
if (!strcmp(name, "step_x"))
2212
static const Edje_External_Param_Info pi =
2213
EDJE_EXTERNAL_PARAM_INFO_DOUBLE("drag_step_x");
2216
if (!strcmp(name, "step_y"))
2218
static const Edje_External_Param_Info pi =
2219
EDJE_EXTERNAL_PARAM_INFO_DOUBLE("drag_step_y");
2222
if (!strcmp(name, "page_x"))
2224
static const Edje_External_Param_Info pi =
2225
EDJE_EXTERNAL_PARAM_INFO_DOUBLE("drag_page_x");
2228
if (!strcmp(name, "page_y"))
2230
static const Edje_External_Param_Info pi =
2231
EDJE_EXTERNAL_PARAM_INFO_DOUBLE("drag_page_y");
2242
static Edje_External_Param *
2243
_edje_param_convert(Edje_External_Param *param, const Edje_External_Param_Info *dst_info)
2245
if (param->type == dst_info->type) return param;
2247
switch (dst_info->type)
2249
case EDJE_EXTERNAL_PARAM_TYPE_BOOL:
2250
case EDJE_EXTERNAL_PARAM_TYPE_INT:
2253
switch (param->type)
2255
case EDJE_EXTERNAL_PARAM_TYPE_DOUBLE:
2259
case EDJE_EXTERNAL_PARAM_TYPE_STRING:
2260
case EDJE_EXTERNAL_PARAM_TYPE_CHOICE:
2261
i = (param->s) ? atoi(param->s) : 0;
2264
case EDJE_EXTERNAL_PARAM_TYPE_BOOL:
2265
case EDJE_EXTERNAL_PARAM_TYPE_INT:
2272
if (dst_info->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL)
2274
param->type = dst_info->type;
2279
case EDJE_EXTERNAL_PARAM_TYPE_DOUBLE:
2282
switch (param->type)
2284
case EDJE_EXTERNAL_PARAM_TYPE_INT:
2285
d = (double)param->i;
2288
case EDJE_EXTERNAL_PARAM_TYPE_STRING:
2289
case EDJE_EXTERNAL_PARAM_TYPE_CHOICE:
2290
d = (param->s) ? atof(param->s) : 0.0;
2293
case EDJE_EXTERNAL_PARAM_TYPE_BOOL:
2294
d = (double)param->i;
2300
param->type = dst_info->type;
2305
case EDJE_EXTERNAL_PARAM_TYPE_STRING:
2308
switch (param->type)
2310
case EDJE_EXTERNAL_PARAM_TYPE_BOOL:
2311
case EDJE_EXTERNAL_PARAM_TYPE_INT:
2312
if (!snprintf(s, sizeof(s), "%i", param->i)) return NULL;
2315
case EDJE_EXTERNAL_PARAM_TYPE_DOUBLE:
2316
if (!snprintf(s, sizeof(s), "%f", param->d)) return NULL;
2319
case EDJE_EXTERNAL_PARAM_TYPE_CHOICE:
2320
param->type = dst_info->type;
2326
param->type = dst_info->type;
2331
case EDJE_EXTERNAL_PARAM_TYPE_CHOICE:
2335
switch (param->type)
2337
case EDJE_EXTERNAL_PARAM_TYPE_BOOL:
2338
case EDJE_EXTERNAL_PARAM_TYPE_INT:
2339
if (!snprintf(s, sizeof(s), "%i", param->i)) return NULL;
2343
case EDJE_EXTERNAL_PARAM_TYPE_DOUBLE:
2344
if (!snprintf(s, sizeof(s), "%f", param->d)) return NULL;
2348
case EDJE_EXTERNAL_PARAM_TYPE_STRING:
2356
param->type = dst_info->type;
2357
if (param->s != val) param->s = val;
2361
default: return NULL;
2366
_edje_param_validate(const Edje_External_Param *param, const Edje_External_Param_Info *info)
2370
case EDJE_EXTERNAL_PARAM_TYPE_BOOL:
2371
return (param->i == 0) || (param->i == 1);
2373
case EDJE_EXTERNAL_PARAM_TYPE_INT:
2374
if ((info->info.i.min != EDJE_EXTERNAL_INT_UNSET) &&
2375
(info->info.i.min > param->i))
2378
if ((info->info.i.max != EDJE_EXTERNAL_INT_UNSET) &&
2379
(info->info.i.max < param->i))
2384
case EDJE_EXTERNAL_PARAM_TYPE_DOUBLE:
2385
if (!EINA_DBL_EQ(info->info.d.min, EDJE_EXTERNAL_DOUBLE_UNSET) &&
2386
(info->info.d.min > param->d))
2389
if (!EINA_DBL_EQ(info->info.d.max, EDJE_EXTERNAL_DOUBLE_UNSET) &&
2390
(info->info.d.max < param->d))
2395
case EDJE_EXTERNAL_PARAM_TYPE_STRING:
2396
if (!param->s) return EINA_FALSE;
2397
if (info->info.s.accept_fmt)
2398
INF("string 'accept_fmt' validation not implemented.");
2399
if (info->info.s.deny_fmt)
2400
INF("string 'deny_fmt' validation not implemented.");
2403
case EDJE_EXTERNAL_PARAM_TYPE_CHOICE:
2405
const char **itr = info->info.c.choices;
2406
if (!itr) return EINA_FALSE;
2408
if (!strcmp(*itr, param->s))
2413
default: return EINA_FALSE;
2418
_edje_param_copy(Edje *ed, Edje_Real_Part *src_part, const char *src_param, Edje_Real_Part *dst_part, const char *dst_param)
2420
Edje_External_Param val;
2421
const Edje_External_Param_Info *dst_info;
2422
void *free_ptr = NULL;
2424
if ((!src_part) || (!src_param) || (!dst_part) || (!dst_param))
2427
if ((dst_part->part->type == EDJE_PART_TYPE_EXTERNAL) &&
2428
(dst_part->type == EDJE_RP_TYPE_SWALLOW) &&
2429
(dst_part->typedata.swallow))
2430
dst_info = _edje_external_param_info_get
2431
(dst_part->typedata.swallow->swallowed_object, dst_param);
2433
dst_info = _edje_native_param_info_get(dst_part, dst_param);
2437
ERR("cannot copy, invalid destination parameter '%s' of part '%s'",
2438
dst_param, dst_part->part->name);
2442
if (src_part->part->type == EDJE_PART_TYPE_EXTERNAL)
2444
if (!_edje_param_external_get
2445
(src_part, src_param, &val))
2447
ERR("cannot get parameter '%s' of part '%s'",
2448
src_param, src_part->part->name);
2454
if (!_edje_param_native_get(ed, src_part, src_param, &val, &free_ptr))
2456
ERR("cannot get parameter '%s' of part '%s'",
2457
src_param, src_part->part->name);
2462
if (!_edje_param_convert(&val, dst_info))
2464
ERR("cannot convert parameter type %s to requested type %s",
2465
edje_external_param_type_str(val.type),
2466
edje_external_param_type_str(dst_info->type));
2470
if (!_edje_param_validate(&val, dst_info))
2472
ERR("incorrect parameter value failed validation for type %s",
2473
edje_external_param_type_str(dst_info->type));
2477
if (dst_part->part->type == EDJE_PART_TYPE_EXTERNAL)
2479
val.name = dst_param;
2480
if (!_edje_external_param_set(NULL, dst_part, &val))
2482
ERR("failed to set parameter '%s' (%s) of part '%s'",
2483
dst_param, edje_external_param_type_str(dst_info->type),
2484
dst_part->part->name);
2490
if (!_edje_param_native_set(ed, dst_part, dst_param, &val))
2492
ERR("failed to set parameter '%s' (%s) of part '%s'",
2493
dst_param, edje_external_param_type_str(dst_info->type),
2494
dst_part->part->name);
2504
_edje_param_set(Edje *ed, Edje_Real_Part *part, const char *param, const char *value)
2506
Edje_External_Param val;
2507
const Edje_External_Param_Info *info;
2509
if ((!part) || (!param) || (!value))
2512
if ((part->part->type == EDJE_PART_TYPE_EXTERNAL) &&
2513
(part->type == EDJE_RP_TYPE_SWALLOW) &&
2514
(part->typedata.swallow))
2515
info = _edje_external_param_info_get(part->typedata.swallow->swallowed_object, param);
2517
info = _edje_native_param_info_get(part, param);
2521
ERR("cannot copy, invalid destination parameter '%s' of part '%s'",
2522
param, part->part->name);
2526
val.name = "(temp)";
2527
val.type = EDJE_EXTERNAL_PARAM_TYPE_STRING;
2530
if (!_edje_param_convert(&val, info))
2532
ERR("cannot convert parameter type STRING to requested type %s",
2533
edje_external_param_type_str(info->type));
2537
if (!_edje_param_validate(&val, info))
2539
ERR("incorrect parameter value failed validation for type %s",
2540
edje_external_param_type_str(info->type));
2544
if (part->part->type == EDJE_PART_TYPE_EXTERNAL)
2547
if (!_edje_external_param_set(NULL, part, &val))
2549
ERR("failed to set parameter '%s' (%s) of part '%s'",
2550
param, edje_external_param_type_str(info->type),
2557
if (!_edje_param_native_set(ed, part, param, &val))
2559
ERR("failed to set parameter '%s' (%s) of part '%s'",
2560
param, edje_external_param_type_str(info->type),