edje: prevent segv when edje_object_signal_emit get nested and edje_object_signal_callback_{add,del} are called.
SVN revision: 70880
This commit is contained in:
parent
22b8a6103b
commit
cc3caf6172
|
@ -427,3 +427,7 @@
|
||||||
2012-05-08 Cedric Bail
|
2012-05-08 Cedric Bail
|
||||||
|
|
||||||
* Add edje_watch tools to automatically rebuild edc.
|
* Add edje_watch tools to automatically rebuild edc.
|
||||||
|
|
||||||
|
2012-05-09 Cedric Bail
|
||||||
|
|
||||||
|
* Fix bug in case of nesting edje_object_signal_emit and edje_object_signal_callback_{add,del}
|
||||||
|
|
|
@ -11,6 +11,7 @@ Improvements:
|
||||||
|
|
||||||
Fixes:
|
Fixes:
|
||||||
* Add missing files in the tarballs.
|
* Add missing files in the tarballs.
|
||||||
|
* Prevent crash when running nested edje_object_signal_emit with edje_object_signal_callback_{add,del}.
|
||||||
|
|
||||||
Edje 1.2.0
|
Edje 1.2.0
|
||||||
|
|
||||||
|
|
|
@ -1148,9 +1148,10 @@ struct _Edje
|
||||||
void *data;
|
void *data;
|
||||||
} item_provider;
|
} item_provider;
|
||||||
|
|
||||||
|
int walking_callbacks;
|
||||||
|
|
||||||
unsigned int dirty : 1;
|
unsigned int dirty : 1;
|
||||||
unsigned int recalc : 1;
|
unsigned int recalc : 1;
|
||||||
unsigned int walking_callbacks : 1;
|
|
||||||
unsigned int delete_callbacks : 1;
|
unsigned int delete_callbacks : 1;
|
||||||
unsigned int just_added_callbacks : 1;
|
unsigned int just_added_callbacks : 1;
|
||||||
unsigned int have_objects : 1;
|
unsigned int have_objects : 1;
|
||||||
|
@ -1807,7 +1808,7 @@ void _edje_textblock_styles_del(Edje *ed);
|
||||||
void _edje_textblock_style_all_update(Edje *ed);
|
void _edje_textblock_style_all_update(Edje *ed);
|
||||||
void _edje_textblock_style_parse_and_fix(Edje_File *edf);
|
void _edje_textblock_style_parse_and_fix(Edje_File *edf);
|
||||||
void _edje_textblock_style_cleanup(Edje_File *edf);
|
void _edje_textblock_style_cleanup(Edje_File *edf);
|
||||||
Edje_File *_edje_cache_file_coll_open(const char *file, const char *coll, int *error_ret, Edje_Part_Collection **edc_ret);
|
Edje_File *_edje_cache_file_coll_open(const char *file, const char *coll, int *error_ret, Edje_Part_Collection **edc_ret, Edje *ed);
|
||||||
void _edje_cache_coll_clean(Edje_File *edf);
|
void _edje_cache_coll_clean(Edje_File *edf);
|
||||||
void _edje_cache_coll_flush(Edje_File *edf);
|
void _edje_cache_coll_flush(Edje_File *edf);
|
||||||
void _edje_cache_coll_unref(Edje_File *edf, Edje_Part_Collection *edc);
|
void _edje_cache_coll_unref(Edje_File *edf, Edje_Part_Collection *edc);
|
||||||
|
|
|
@ -1289,7 +1289,7 @@ _edje_emit_cb(Edje *ed, const char *sig, const char *src, Edje_Message_Signal_Da
|
||||||
if (ed->just_added_callbacks)
|
if (ed->just_added_callbacks)
|
||||||
_edje_callbacks_patterns_clean(ed);
|
_edje_callbacks_patterns_clean(ed);
|
||||||
|
|
||||||
ed->walking_callbacks = 1;
|
ed->walking_callbacks++;
|
||||||
|
|
||||||
if (ed->callbacks)
|
if (ed->callbacks)
|
||||||
{
|
{
|
||||||
|
@ -1321,14 +1321,15 @@ _edje_emit_cb(Edje *ed, const char *sig, const char *src, Edje_Message_Signal_Da
|
||||||
{
|
{
|
||||||
escb->func(escb->data, ed->obj, sig, src);
|
escb->func(escb->data, ed->obj, sig, src);
|
||||||
if (_edje_block_break(ed))
|
if (_edje_block_break(ed))
|
||||||
goto break_prog;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break_prog:
|
break_prog:
|
||||||
|
|
||||||
ed->walking_callbacks = 0;
|
ed->walking_callbacks--;
|
||||||
if ((ed->delete_callbacks) || (ed->just_added_callbacks))
|
if (!ed->walking_callbacks &&
|
||||||
|
((ed->delete_callbacks) || (ed->just_added_callbacks)))
|
||||||
{
|
{
|
||||||
ed->delete_callbacks = 0;
|
ed->delete_callbacks = 0;
|
||||||
ed->just_added_callbacks = 0;
|
ed->just_added_callbacks = 0;
|
||||||
|
|
Loading…
Reference in New Issue