forked from enlightenment/efl
IMMENSELY evil!
akuma no code desu! there are a LOT of paths that lead to calling external callbacks froma pgoram thaty will invalidate the loop or code just after that call- causing... segv's and all sort sof fun goodies. i've blocks/locks off a lot of them... i hope i haven't missed any - but it's likely. tread carefully within callbacks! SVN revision: 7375
This commit is contained in:
parent
33c86b53c0
commit
4c51ac32d8
|
@ -62,6 +62,7 @@ _edje_mouse_down_cb(void *data, Evas * e, Evas_Object * obj, void *event_info)
|
|||
else
|
||||
#endif
|
||||
snprintf(buf, sizeof(buf), "mouse,down,%i", ev->button);
|
||||
_edje_ref(ed);
|
||||
if ((rp->part->dragable.x) || (rp->part->dragable.y))
|
||||
{
|
||||
if (rp->drag.down.count == 0)
|
||||
|
@ -83,6 +84,7 @@ _edje_mouse_down_cb(void *data, Evas * e, Evas_Object * obj, void *event_info)
|
|||
_edje_emit(ed, buf, rp->part->name);
|
||||
_edje_recalc(ed);
|
||||
_edje_thaw(ed);
|
||||
_edje_unref(ed);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -98,6 +100,7 @@ _edje_mouse_up_cb(void *data, Evas * e, Evas_Object * obj, void *event_info)
|
|||
rp = evas_object_data_get(obj, "real_part");
|
||||
if (!rp) return;
|
||||
snprintf(buf, sizeof(buf), "mouse,up,%i", ev->button);
|
||||
_edje_ref(ed);
|
||||
_edje_emit(ed, buf, rp->part->name);
|
||||
if ((rp->part->dragable.x) || (rp->part->dragable.y))
|
||||
{
|
||||
|
@ -122,6 +125,7 @@ _edje_mouse_up_cb(void *data, Evas * e, Evas_Object * obj, void *event_info)
|
|||
}
|
||||
_edje_recalc(ed);
|
||||
_edje_thaw(ed);
|
||||
_edje_unref(ed);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -165,11 +169,11 @@ _edje_mouse_move_cb(void *data, Evas * e, Evas_Object * obj, void *event_info)
|
|||
ed->dirty = 1;
|
||||
}
|
||||
}
|
||||
_edje_ref(ed);
|
||||
_edje_emit(ed, "mouse,move", rp->part->name);
|
||||
ed->calc_only = 1;
|
||||
_edje_recalc(ed);
|
||||
ed->calc_only = 0;
|
||||
_edje_thaw(ed);
|
||||
if ((rp->part->dragable.x) || (rp->part->dragable.y))
|
||||
{
|
||||
if (rp->drag.down.count > 0)
|
||||
|
@ -187,6 +191,8 @@ _edje_mouse_move_cb(void *data, Evas * e, Evas_Object * obj, void *event_info)
|
|||
}
|
||||
}
|
||||
}
|
||||
_edje_unref(ed);
|
||||
_edje_thaw(ed);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -225,9 +231,10 @@ _edje_timer_cb(void *data)
|
|||
Evas_List *newl = NULL;
|
||||
|
||||
ed = animl->data;
|
||||
_edje_block(ed);
|
||||
_edje_freeze(ed);
|
||||
animl = evas_list_remove(animl, animl->data);
|
||||
if (!ed->paused)
|
||||
if ((!ed->paused) && (!ed->delete_me))
|
||||
{
|
||||
ed->walking_actions = 1;
|
||||
for (l = ed->actions; l; l = l->next)
|
||||
|
@ -240,6 +247,12 @@ _edje_timer_cb(void *data)
|
|||
newl = evas_list_remove(newl, newl->data);
|
||||
if (!runp->delete_me)
|
||||
_edje_program_run_iterate(runp, t);
|
||||
if (_edje_block_break(ed))
|
||||
{
|
||||
evas_list_free(newl);
|
||||
newl = NULL;
|
||||
goto break_prog;
|
||||
}
|
||||
}
|
||||
for (l = ed->actions; l; l = l->next)
|
||||
newl = evas_list_append(newl, l->data);
|
||||
|
@ -262,6 +275,8 @@ _edje_timer_cb(void *data)
|
|||
}
|
||||
ed->walking_actions = 0;
|
||||
}
|
||||
break_prog:
|
||||
_edje_unblock(ed);
|
||||
_edje_thaw(ed);
|
||||
_edje_unref(ed);
|
||||
}
|
||||
|
|
|
@ -85,6 +85,7 @@ edje_object_file_set(Evas_Object *obj, const char *file, const char *part)
|
|||
rp->part = ep;
|
||||
ed->parts = evas_list_append(ed->parts, rp);
|
||||
rp->param1.description = ep->default_desc;
|
||||
printf("MEH %s\n", rp->part->name);
|
||||
if (!rp->param1.description)
|
||||
{
|
||||
printf("EDJE ERROR: no default part description!\n");
|
||||
|
@ -133,8 +134,8 @@ edje_object_file_set(Evas_Object *obj, const char *file, const char *part)
|
|||
}
|
||||
else
|
||||
evas_object_pass_events_set(rp->object, 1);
|
||||
evas_object_clip_set(rp->object, ed->clipper);
|
||||
evas_object_show(rp->object);
|
||||
if (rp->part->clip_to_id < 0)
|
||||
evas_object_clip_set(rp->object, ed->clipper);
|
||||
}
|
||||
for (l = ed->parts; l; l = l->next)
|
||||
{
|
||||
|
@ -162,13 +163,25 @@ edje_object_file_set(Evas_Object *obj, const char *file, const char *part)
|
|||
if (rp->part->dragable.confine_id >= 0)
|
||||
rp->confine_to = evas_list_nth(ed->parts, rp->part->dragable.confine_id);
|
||||
}
|
||||
ed->dirty = 1;
|
||||
_edje_ref(ed);
|
||||
_edje_block(ed);
|
||||
_edje_freeze(ed);
|
||||
_edje_recalc(ed);
|
||||
_edje_emit(ed, "load", "");
|
||||
_edje_thaw(ed);
|
||||
for (l = ed->parts; l; l = l->next)
|
||||
{
|
||||
Edje_Real_Part *rp;
|
||||
|
||||
rp = l->data;
|
||||
evas_object_show(rp->object);
|
||||
if (_edje_block_break(ed)) break;
|
||||
}
|
||||
ed->dirty = 1;
|
||||
if ((ed->parts) && (evas_object_visible_get(obj)))
|
||||
evas_object_show(ed->clipper);
|
||||
_edje_recalc(ed);
|
||||
_edje_thaw(ed);
|
||||
_edje_unblock(ed);
|
||||
_edje_unref(ed);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -359,9 +372,9 @@ _edje_file_add(Edje *ed)
|
|||
void
|
||||
_edje_file_del(Edje *ed)
|
||||
{
|
||||
/* segv's sometimes happen after here... */
|
||||
/* avoid segv's... but LEAK */
|
||||
/* return; */
|
||||
_edje_emit(ed, NULL, NULL); /* clear out signal emissions */
|
||||
ed->dont_clear_signals = 1;
|
||||
_edje_block_violate(ed);
|
||||
if (ed->collection)
|
||||
{
|
||||
ed->collection->references--;
|
||||
|
@ -385,7 +398,6 @@ _edje_file_del(Edje *ed)
|
|||
|
||||
rp = ed->parts->data;
|
||||
ed->parts = evas_list_remove(ed->parts, rp);
|
||||
_edje_text_part_on_del(ed, rp);
|
||||
evas_object_event_callback_del(rp->object,
|
||||
EVAS_CALLBACK_MOUSE_IN,
|
||||
_edje_mouse_in_cb);
|
||||
|
@ -404,6 +416,7 @@ _edje_file_del(Edje *ed)
|
|||
evas_object_event_callback_del(rp->object,
|
||||
EVAS_CALLBACK_MOUSE_WHEEL,
|
||||
_edje_mouse_wheel_cb);
|
||||
_edje_text_part_on_del(ed, rp);
|
||||
evas_object_del(rp->object);
|
||||
if (rp->swallowed_object)
|
||||
{
|
||||
|
@ -431,8 +444,8 @@ _edje_file_del(Edje *ed)
|
|||
ed->actions = evas_list_remove(ed->actions, runp);
|
||||
free(runp);
|
||||
}
|
||||
_edje_animators = evas_list_remove(_edje_animators, ed);
|
||||
}
|
||||
_edje_animators = evas_list_remove(_edje_animators, ed);
|
||||
if (ed->pending_actions)
|
||||
{
|
||||
while (ed->pending_actions)
|
||||
|
|
|
@ -17,9 +17,13 @@
|
|||
|
||||
/* FIXME:
|
||||
*
|
||||
* recursions, unsafe callbacks outside edje etc. with freeze, ref/unref and blobk/unblock and break_programs needs to be redesigned & fixed
|
||||
* all unsafe calls that may result in callbacks must be marked and dealt with
|
||||
*
|
||||
* dragable needs to be able to reverse value affect for "other direction" drag
|
||||
* dragable relative value needs to be able to be set or ++/-- by actions
|
||||
* dragable needs to be able to affect rel/abs values of other parts
|
||||
* dragable relative value needs to be able to be applied to other part vals.
|
||||
* dragable relative value needs to be able to be set or ++/-- by actions
|
||||
*
|
||||
* more example edje files
|
||||
*
|
||||
|
@ -370,6 +374,9 @@ struct _Edje
|
|||
unsigned short no_anim : 1;
|
||||
unsigned short calc_only : 1;
|
||||
unsigned short walking_actions : 1;
|
||||
unsigned short block_break : 1;
|
||||
unsigned short delete_me : 1;
|
||||
unsigned short dont_clear_signals : 1;
|
||||
double paused_at;
|
||||
Evas *evas; /* the evas this edje belongs to */
|
||||
Evas_Object *obj; /* the smart object */
|
||||
|
@ -384,7 +391,8 @@ struct _Edje
|
|||
Evas_List *text_classes;
|
||||
int freeze;
|
||||
int references;
|
||||
|
||||
int block;
|
||||
Evas_List *emissions;
|
||||
};
|
||||
|
||||
struct _Edje_Real_Part
|
||||
|
@ -581,6 +589,10 @@ Edje *_edje_fetch(Evas_Object *obj);
|
|||
int _edje_glob_match(char *str, char *glob);
|
||||
int _edje_freeze(Edje *ed);
|
||||
int _edje_thaw(Edje *ed);
|
||||
int _edje_block(Edje *ed);
|
||||
int _edje_unblock(Edje *ed);
|
||||
int _edje_block_break(Edje *ed);
|
||||
void _edje_block_violate(Edje *ed);
|
||||
void _edje_object_part_swallow_free_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
|
||||
|
||||
|
||||
|
|
|
@ -37,6 +37,7 @@ edje_object_signal_callback_add(Evas_Object *obj, const char *emission, const ch
|
|||
if ((!emission) || (!source) || (!func)) return;
|
||||
ed = _edje_fetch(obj);
|
||||
if (!ed) return;
|
||||
if (ed->delete_me) return;
|
||||
escb = calloc(1, sizeof(Edje_Signal_Callback));
|
||||
escb->signal = strdup(emission);
|
||||
escb->source = strdup(source);
|
||||
|
@ -59,6 +60,7 @@ edje_object_signal_callback_del(Evas_Object *obj, const char *emission, const ch
|
|||
if ((!emission) || (!source) || (!func)) return NULL;
|
||||
ed = _edje_fetch(obj);
|
||||
if (!ed) return;
|
||||
if (ed->delete_me) return NULL;
|
||||
for (l = ed->callbacks; l; l = l->next)
|
||||
{
|
||||
Edje_Signal_Callback *escb;
|
||||
|
@ -97,6 +99,7 @@ edje_object_signal_emit(Evas_Object *obj, const char *emission, const char *sour
|
|||
if ((!emission) || (!source)) return;
|
||||
ed = _edje_fetch(obj);
|
||||
if (!ed) return;
|
||||
if (ed->delete_me) return;
|
||||
_edje_emit(ed, (char *)emission, (char *)source);
|
||||
}
|
||||
|
||||
|
@ -109,6 +112,7 @@ edje_object_play_set(Evas_Object *obj, int play)
|
|||
|
||||
ed = _edje_fetch(obj);
|
||||
if (!ed) return;
|
||||
if (ed->delete_me) return;
|
||||
if (play)
|
||||
{
|
||||
if (!ed->paused) return;
|
||||
|
@ -137,6 +141,7 @@ edje_object_play_get(Evas_Object *obj)
|
|||
|
||||
ed = _edje_fetch(obj);
|
||||
if (!ed) return 0;
|
||||
if (ed->delete_me) return 0;
|
||||
if (ed->paused) return 0;
|
||||
return 1;
|
||||
}
|
||||
|
@ -149,6 +154,8 @@ edje_object_animation_set(Evas_Object *obj, int on)
|
|||
|
||||
ed = _edje_fetch(obj);
|
||||
if (!ed) return;
|
||||
if (ed->delete_me) return;
|
||||
_edje_block(ed);
|
||||
ed->no_anim = !on;
|
||||
_edje_freeze(ed);
|
||||
if (!on)
|
||||
|
@ -164,6 +171,11 @@ edje_object_animation_set(Evas_Object *obj, int on)
|
|||
runp = newl->data;
|
||||
newl = evas_list_remove(newl, newl->data);
|
||||
_edje_program_run_iterate(runp, runp->start_time + runp->program->tween.time);
|
||||
if (_edje_block_break(ed))
|
||||
{
|
||||
evas_list_free(newl);
|
||||
goto break_prog;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -175,7 +187,9 @@ edje_object_animation_set(Evas_Object *obj, int on)
|
|||
evas_object_show(obj);
|
||||
}
|
||||
}
|
||||
break_prog:
|
||||
_edje_thaw(ed);
|
||||
_edje_unblock(ed);
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -185,6 +199,7 @@ edje_object_animation_get(Evas_Object *obj)
|
|||
|
||||
ed = _edje_fetch(obj);
|
||||
if (!ed) return 0;
|
||||
if (ed->delete_me) return 0;
|
||||
if (ed->no_anim) return 0;
|
||||
return 1;
|
||||
}
|
||||
|
@ -196,9 +211,13 @@ _edje_program_run_iterate(Edje_Running_Program *runp, double tim)
|
|||
{
|
||||
double t, total;
|
||||
Evas_List *l;
|
||||
Edje *ed;
|
||||
|
||||
_edje_ref(runp->edje);
|
||||
_edje_freeze(runp->edje);
|
||||
ed = runp->edje;
|
||||
if (ed->delete_me) return 0;
|
||||
_edje_block(ed);
|
||||
_edje_ref(ed);
|
||||
_edje_freeze(ed);
|
||||
t = tim - runp->start_time;
|
||||
total = runp->program->tween.time;
|
||||
t /= total;
|
||||
|
@ -209,8 +228,8 @@ _edje_program_run_iterate(Edje_Running_Program *runp, double tim)
|
|||
Edje_Program_Target *pt;
|
||||
|
||||
pt = l->data;
|
||||
rp = evas_list_nth(runp->edje->parts, pt->id);
|
||||
if (rp) _edje_part_pos_set(runp->edje, rp,
|
||||
rp = evas_list_nth(ed->parts, pt->id);
|
||||
if (rp) _edje_part_pos_set(ed, rp,
|
||||
runp->program->tween.mode, t);
|
||||
}
|
||||
if (t >= 1.0)
|
||||
|
@ -221,45 +240,50 @@ _edje_program_run_iterate(Edje_Running_Program *runp, double tim)
|
|||
Edje_Program_Target *pt;
|
||||
|
||||
pt = l->data;
|
||||
rp = evas_list_nth(runp->edje->parts, pt->id);
|
||||
rp = evas_list_nth(ed->parts, pt->id);
|
||||
if (rp)
|
||||
{
|
||||
_edje_part_description_apply(runp->edje, rp,
|
||||
_edje_part_description_apply(ed, rp,
|
||||
runp->program->state,
|
||||
runp->program->value,
|
||||
NULL,
|
||||
0.0);
|
||||
_edje_part_pos_set(runp->edje, rp,
|
||||
_edje_part_pos_set(ed, rp,
|
||||
runp->program->tween.mode, 0.0);
|
||||
rp->program = NULL;
|
||||
}
|
||||
}
|
||||
_edje_recalc(runp->edje);
|
||||
_edje_recalc(ed);
|
||||
runp->delete_me = 1;
|
||||
if (!runp->edje->walking_actions)
|
||||
if (!ed->walking_actions)
|
||||
{
|
||||
_edje_anim_count--;
|
||||
runp->edje->actions = evas_list_remove(runp->edje->actions, runp);
|
||||
if (!runp->edje->actions)
|
||||
_edje_animators = evas_list_remove(_edje_animators, runp->edje);
|
||||
ed->actions = evas_list_remove(ed->actions, runp);
|
||||
if (!ed->actions)
|
||||
_edje_animators = evas_list_remove(_edje_animators, ed);
|
||||
}
|
||||
_edje_emit(runp->edje, "program,stop", runp->program->name);
|
||||
_edje_emit(ed, "program,stop", runp->program->name);
|
||||
if (_edje_block_break(ed)) goto break_prog;
|
||||
if (runp->program->after >= 0)
|
||||
{
|
||||
Edje_Program *pr;
|
||||
|
||||
pr = evas_list_nth(runp->edje->collection->programs,
|
||||
pr = evas_list_nth(ed->collection->programs,
|
||||
runp->program->after);
|
||||
if (pr) _edje_program_run(runp->edje, pr, 0);
|
||||
if (pr) _edje_program_run(ed, pr, 0);
|
||||
if (_edje_block_break(ed)) goto break_prog;
|
||||
}
|
||||
_edje_thaw(runp->edje);
|
||||
_edje_unref(runp->edje);
|
||||
if (!runp->edje->walking_actions) free(runp);
|
||||
_edje_thaw(ed);
|
||||
_edje_unref(ed);
|
||||
if (!ed->walking_actions) free(runp);
|
||||
_edje_unblock(ed);
|
||||
return 0;
|
||||
}
|
||||
_edje_recalc(runp->edje);
|
||||
_edje_thaw(runp->edje);
|
||||
_edje_unref(runp->edje);
|
||||
break_prog:
|
||||
_edje_recalc(ed);
|
||||
_edje_thaw(ed);
|
||||
_edje_unref(ed);
|
||||
_edje_unblock(ed);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -267,41 +291,46 @@ void
|
|||
_edje_program_end(Edje *ed, Edje_Running_Program *runp)
|
||||
{
|
||||
Evas_List *l;
|
||||
char *pname = NULL;
|
||||
|
||||
_edje_ref(runp->edje);
|
||||
_edje_freeze(runp->edje);
|
||||
if (ed->delete_me) return;
|
||||
_edje_ref(ed);
|
||||
_edje_freeze(ed);
|
||||
for (l = runp->program->targets; l; l = l->next)
|
||||
{
|
||||
Edje_Real_Part *rp;
|
||||
Edje_Program_Target *pt;
|
||||
|
||||
pt = l->data;
|
||||
rp = evas_list_nth(runp->edje->parts, pt->id);
|
||||
rp = evas_list_nth(ed->parts, pt->id);
|
||||
if (rp)
|
||||
{
|
||||
_edje_part_description_apply(runp->edje, rp,
|
||||
_edje_part_description_apply(ed, rp,
|
||||
runp->program->state,
|
||||
runp->program->value,
|
||||
NULL,
|
||||
0.0);
|
||||
_edje_part_pos_set(runp->edje, rp,
|
||||
_edje_part_pos_set(ed, rp,
|
||||
runp->program->tween.mode, 0.0);
|
||||
rp->program = NULL;
|
||||
}
|
||||
}
|
||||
_edje_recalc(runp->edje);
|
||||
_edje_recalc(ed);
|
||||
runp->delete_me = 1;
|
||||
if (!runp->edje->walking_actions)
|
||||
pname = runp->program->name;
|
||||
if (!ed->walking_actions)
|
||||
{
|
||||
_edje_anim_count--;
|
||||
runp->edje->actions = evas_list_remove(runp->edje->actions, runp);
|
||||
if (!runp->edje->actions)
|
||||
_edje_animators = evas_list_remove(_edje_animators, runp->edje);
|
||||
ed->actions = evas_list_remove(ed->actions, runp);
|
||||
if (!ed->actions)
|
||||
{
|
||||
_edje_animators = evas_list_remove(_edje_animators, ed);
|
||||
free(runp);
|
||||
}
|
||||
}
|
||||
_edje_emit(runp->edje, "program,stop", runp->program->name);
|
||||
_edje_thaw(runp->edje);
|
||||
_edje_unref(runp->edje);
|
||||
if (!runp->edje->walking_actions) free(runp);
|
||||
_edje_emit(ed, "program,stop", pname);
|
||||
_edje_thaw(ed);
|
||||
_edje_unref(ed);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -312,6 +341,7 @@ _edje_program_run(Edje *ed, Edje_Program *pr, int force)
|
|||
static int recursions = 0;
|
||||
static int recursion_limit = 0;
|
||||
|
||||
if (ed->delete_me) return;
|
||||
if ((pr->in.from > 0.0) && (pr->in.range >= 0.0) && (!force))
|
||||
{
|
||||
Edje_Pending_Program *pp;
|
||||
|
@ -340,8 +370,10 @@ _edje_program_run(Edje *ed, Edje_Program *pr, int force)
|
|||
return;
|
||||
}
|
||||
recursions++;
|
||||
_edje_freeze(ed);
|
||||
_edje_block(ed);
|
||||
_edje_ref(ed);
|
||||
_edje_freeze(ed);
|
||||
printf("run program %s\n", pr->name);
|
||||
if (pr->action == EDJE_ACTION_TYPE_STATE_SET)
|
||||
{
|
||||
if ((pr->tween.time > 0.0) && (!ed->no_anim))
|
||||
|
@ -370,7 +402,7 @@ _edje_program_run(Edje *ed, Edje_Program *pr, int force)
|
|||
}
|
||||
}
|
||||
_edje_emit(ed, "program,start", pr->name);
|
||||
|
||||
if (_edje_block_break(ed)) goto break_prog;
|
||||
if (!ed->actions)
|
||||
_edje_animators = evas_list_append(_edje_animators, ed);
|
||||
ed->actions = evas_list_append(ed->actions, runp);
|
||||
|
@ -403,7 +435,9 @@ _edje_program_run(Edje *ed, Edje_Program *pr, int force)
|
|||
}
|
||||
}
|
||||
_edje_emit(ed, "program,start", pr->name);
|
||||
if (_edje_block_break(ed)) goto break_prog;
|
||||
_edje_emit(ed, "program,stop", pr->name);
|
||||
if (_edje_block_break(ed)) goto break_prog;
|
||||
if (pr->after >= 0)
|
||||
{
|
||||
Edje_Program *pr2;
|
||||
|
@ -411,6 +445,7 @@ _edje_program_run(Edje *ed, Edje_Program *pr, int force)
|
|||
pr2 = evas_list_nth(ed->collection->programs,
|
||||
pr->after);
|
||||
if (pr2) _edje_program_run(ed, pr2, 0);
|
||||
if (_edje_block_break(ed)) goto break_prog;
|
||||
}
|
||||
_edje_recalc(ed);
|
||||
}
|
||||
|
@ -451,12 +486,16 @@ _edje_program_run(Edje *ed, Edje_Program *pr, int force)
|
|||
done:
|
||||
}
|
||||
_edje_emit(ed, "program,stop", pr->name);
|
||||
if (_edje_block_break(ed)) goto break_prog;
|
||||
}
|
||||
else if (pr->action == EDJE_ACTION_TYPE_SIGNAL_EMIT)
|
||||
{
|
||||
_edje_emit(ed, "program,start", pr->name);
|
||||
if (_edje_block_break(ed)) goto break_prog;
|
||||
_edje_emit(ed, pr->state, pr->state2);
|
||||
if (_edje_block_break(ed)) goto break_prog;
|
||||
_edje_emit(ed, "program,stop", pr->name);
|
||||
if (_edje_block_break(ed)) goto break_prog;
|
||||
}
|
||||
if (pr->action != EDJE_ACTION_TYPE_STATE_SET)
|
||||
{
|
||||
|
@ -466,57 +505,79 @@ _edje_program_run(Edje *ed, Edje_Program *pr, int force)
|
|||
|
||||
pr2 = evas_list_nth(ed->collection->programs, pr->after);
|
||||
if (pr2) _edje_program_run(ed, pr2, 0);
|
||||
if (_edje_block_break(ed)) goto break_prog;
|
||||
}
|
||||
}
|
||||
_edje_unref(ed);
|
||||
break_prog:
|
||||
_edje_thaw(ed);
|
||||
_edje_unref(ed);
|
||||
recursions--;
|
||||
if (recursions == 0) recursion_limit = 0;
|
||||
_edje_unblock(ed);
|
||||
}
|
||||
|
||||
void
|
||||
_edje_emit(Edje *ed, char *sig, char *src)
|
||||
{
|
||||
Evas_List *l;
|
||||
static Evas_List *emissions = NULL;
|
||||
Edje_Emission *ee;
|
||||
/* limit self-feeding loops in callbacks to 64 levels */
|
||||
static int recursions = 0;
|
||||
static int recursion_limit = 0;
|
||||
|
||||
if ((!sig) && (!src))
|
||||
{
|
||||
printf("clear signals! %p\n", ed->emissions);
|
||||
while (ed->emissions)
|
||||
{
|
||||
ee = ed->emissions->data;
|
||||
free(ee->signal);
|
||||
free(ee->source);
|
||||
free(ee);
|
||||
ed->emissions = evas_list_remove(ed->emissions, ee);
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (ed->delete_me) return;
|
||||
if ((recursions >= 64) || (recursion_limit))
|
||||
{
|
||||
recursion_limit = 1;
|
||||
return;
|
||||
}
|
||||
recursions++;
|
||||
printf("EDJE EMIT: signal: \"%s\" source: \"%s\"\n", sig, src);
|
||||
if ((sig) && (src))
|
||||
{
|
||||
printf("queue emission\n");
|
||||
ee = calloc(1, sizeof(Edje_Emission));
|
||||
if (!ee)
|
||||
{
|
||||
recursions--;
|
||||
if (recursions == 0) recursion_limit = 0;
|
||||
return;
|
||||
}
|
||||
ee->signal = strdup(sig);
|
||||
ee->source = strdup(src);
|
||||
if ((ed->emissions) || (_edje_block_break(ed)))
|
||||
{
|
||||
printf("append signal & leave\n");
|
||||
ed->emissions = evas_list_append(ed->emissions, ee);
|
||||
recursions--;
|
||||
if (recursions == 0) recursion_limit = 0;
|
||||
return;
|
||||
}
|
||||
else
|
||||
ed->emissions = evas_list_append(ed->emissions, ee);
|
||||
}
|
||||
if (!ed->emissions) return;
|
||||
_edje_block(ed);
|
||||
_edje_ref(ed);
|
||||
_edje_freeze(ed);
|
||||
printf("EDJE EMIT: signal: \"%s\" source: \"%s\"\n", sig, src);
|
||||
ee = calloc(1, sizeof(Edje_Emission));
|
||||
if (!ee)
|
||||
while (ed->emissions)
|
||||
{
|
||||
recursions--;
|
||||
if (recursions == 0) recursion_limit = 0;
|
||||
return;
|
||||
}
|
||||
ee->signal = strdup(sig);
|
||||
ee->source = strdup(src);
|
||||
if (emissions)
|
||||
{
|
||||
emissions = evas_list_append(emissions, ee);
|
||||
_edje_thaw(ed);
|
||||
_edje_unref(ed);
|
||||
recursions--;
|
||||
if (recursions == 0) recursion_limit = 0;
|
||||
return;
|
||||
}
|
||||
else
|
||||
emissions = evas_list_append(emissions, ee);
|
||||
while (emissions)
|
||||
{
|
||||
ee = emissions->data;
|
||||
emissions = evas_list_remove(emissions, ee);
|
||||
ee = ed->emissions->data;
|
||||
ed->emissions = evas_list_remove(ed->emissions, ee);
|
||||
printf("EDJE: handle emission \"%s\" \"%s\"\n", ee->signal, ee->source);
|
||||
if (ed->collection)
|
||||
{
|
||||
Edje_Part_Collection *ec;
|
||||
|
@ -542,7 +603,9 @@ _edje_emit(Edje *ed, char *sig, char *src)
|
|||
Evas_List *matches;
|
||||
|
||||
if (evas_hash_find(ec->prog_cache.no_matches, tmps))
|
||||
done = 1;
|
||||
{
|
||||
done = 1;
|
||||
}
|
||||
else if ((matches = evas_hash_find(ec->prog_cache.matches, tmps)))
|
||||
{
|
||||
for (l = matches; l; l = l->next)
|
||||
|
@ -551,6 +614,13 @@ _edje_emit(Edje *ed, char *sig, char *src)
|
|||
|
||||
pr = l->data;
|
||||
_edje_program_run(ed, pr, 0);
|
||||
if (_edje_block_break(ed))
|
||||
{
|
||||
if (tmps) free(tmps);
|
||||
if (!ed->dont_clear_signals)
|
||||
_edje_emit(ed, NULL, NULL);
|
||||
goto break_prog;
|
||||
}
|
||||
}
|
||||
done = 1;
|
||||
}
|
||||
|
@ -572,6 +642,14 @@ _edje_emit(Edje *ed, char *sig, char *src)
|
|||
{
|
||||
matched++;
|
||||
_edje_program_run(ed, pr, 0);
|
||||
if (_edje_block_break(ed))
|
||||
{
|
||||
if (tmps) free(tmps);
|
||||
evas_list_free(matches);
|
||||
if (!ed->dont_clear_signals)
|
||||
_edje_emit(ed, NULL, NULL);
|
||||
goto break_prog;
|
||||
}
|
||||
matches = evas_list_append(matches, pr);
|
||||
}
|
||||
}
|
||||
|
@ -586,16 +664,26 @@ _edje_emit(Edje *ed, char *sig, char *src)
|
|||
}
|
||||
}
|
||||
_edje_emit_cb(ed, ee->signal, ee->source);
|
||||
if (_edje_block_break(ed))
|
||||
{
|
||||
if (tmps) free(tmps);
|
||||
if (!ed->dont_clear_signals)
|
||||
_edje_emit(ed, NULL, NULL);
|
||||
goto break_prog;
|
||||
}
|
||||
if (tmps) free(tmps);
|
||||
tmps = NULL;
|
||||
}
|
||||
free(ee->signal);
|
||||
free(ee->source);
|
||||
free(ee);
|
||||
}
|
||||
_edje_thaw(ed);
|
||||
_edje_unref(ed);
|
||||
break_prog:
|
||||
recursions--;
|
||||
if (recursions == 0) recursion_limit = 0;
|
||||
_edje_thaw(ed);
|
||||
_edje_unref(ed);
|
||||
_edje_unblock(ed);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -603,6 +691,10 @@ _edje_emit_cb(Edje *ed, char *sig, char *src)
|
|||
{
|
||||
Evas_List *l;
|
||||
|
||||
if (ed->delete_me) return;
|
||||
_edje_ref(ed);
|
||||
_edje_freeze(ed);
|
||||
_edje_block(ed);
|
||||
ed->walking_callbacks = 1;
|
||||
for (l = ed->callbacks; l; l = l->next)
|
||||
{
|
||||
|
@ -614,6 +706,7 @@ _edje_emit_cb(Edje *ed, char *sig, char *src)
|
|||
(_edje_glob_match(sig, escb->signal)) &&
|
||||
(_edje_glob_match(src, escb->source)))
|
||||
escb->func(escb->data, ed->obj, sig, src);
|
||||
if (_edje_block_break(ed)) goto break_prog;
|
||||
}
|
||||
ed->walking_callbacks = 0;
|
||||
if ((ed->delete_callbacks) || (ed->just_added_callbacks))
|
||||
|
@ -639,4 +732,8 @@ _edje_emit_cb(Edje *ed, char *sig, char *src)
|
|||
l = next_l;
|
||||
}
|
||||
}
|
||||
break_prog:
|
||||
_edje_unblock(ed);
|
||||
_edje_thaw(ed);
|
||||
_edje_unref(ed);
|
||||
}
|
||||
|
|
|
@ -67,6 +67,8 @@ _edje_smart_del(Evas_Object * obj)
|
|||
|
||||
ed = evas_object_smart_data_get(obj);
|
||||
if (!ed) return;
|
||||
_edje_block_violate(ed);
|
||||
ed->delete_me = 1;
|
||||
_edje_clean_objects(ed);
|
||||
_edje_unref(ed);
|
||||
_edje_edjes = evas_list_remove(_edje_edjes, obj);
|
||||
|
|
|
@ -764,11 +764,44 @@ _edje_thaw(Edje *ed)
|
|||
{
|
||||
ed->freeze--;
|
||||
if (ed->freeze < 0) ed->freeze = 0;
|
||||
if ((ed->freeze == 0) && (ed->recalc))
|
||||
_edje_recalc(ed);
|
||||
if ((ed->freeze == 0) && (ed->recalc)) _edje_recalc(ed);
|
||||
return ed->freeze;
|
||||
}
|
||||
|
||||
int
|
||||
_edje_block(Edje *ed)
|
||||
{
|
||||
ed->block++;
|
||||
return ed->block;
|
||||
}
|
||||
|
||||
int
|
||||
_edje_unblock(Edje *ed)
|
||||
{
|
||||
ed->block--;
|
||||
if (ed->block == 0)
|
||||
{
|
||||
ed->block_break = 0;
|
||||
printf("unblock!!! ed->emissions = %p\n", ed->emissions);
|
||||
ed->dont_clear_signals = 0;
|
||||
if (ed->emissions) _edje_emit(ed, "", NULL);
|
||||
}
|
||||
return ed->block;
|
||||
}
|
||||
|
||||
int
|
||||
_edje_block_break(Edje *ed)
|
||||
{
|
||||
if (ed->block_break) return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
_edje_block_violate(Edje *ed)
|
||||
{
|
||||
if (ed->block > 0) ed->block_break = 1;
|
||||
}
|
||||
|
||||
void
|
||||
_edje_object_part_swallow_free_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue