fix inconsistency with propagating signals and messages. now messages

AND signals should propagate to children the SAME WAY - that means
children you added explicitly in the edje file and not form c code get
propagated to.



SVN revision: 65384
This commit is contained in:
Carsten Haitzler 2011-11-18 10:35:38 +00:00
parent bd8e46c9b3
commit 4e97f85876
8 changed files with 56 additions and 28 deletions

View File

@ -2609,6 +2609,7 @@ _edje_embryo_fn_part_swallow(Embryo_Program *ep, Embryo_Cell *params)
return 0;
}
edje_object_part_swallow(ed->obj, rp->part->name, new_obj);
_edje_subobj_register(ed, new_obj);
return 0;
}

View File

@ -464,8 +464,6 @@ _sel_clear(Evas_Textblock_Cursor *c __UNUSED__, Evas_Object *o __UNUSED__, Entry
Sel *sel;
sel = en->sel->data;
en->rp->edje->subobjs = eina_list_remove(en->rp->edje->subobjs, sel->obj_bg);
en->rp->edje->subobjs = eina_list_remove(en->rp->edje->subobjs, sel->obj_fg);
if (sel->obj_bg) evas_object_del(sel->obj_bg);
if (sel->obj_fg) evas_object_del(sel->obj_fg);
free(sel);
@ -497,8 +495,6 @@ _sel_update(Evas_Textblock_Cursor *c __UNUSED__, Evas_Object *o, Entry *en)
while (en->sel)
{
sel = en->sel->data;
en->rp->edje->subobjs = eina_list_remove(en->rp->edje->subobjs, sel->obj_bg);
en->rp->edje->subobjs = eina_list_remove(en->rp->edje->subobjs, sel->obj_fg);
if (sel->obj_bg) evas_object_del(sel->obj_bg);
if (sel->obj_fg) evas_object_del(sel->obj_fg);
free(sel);
@ -520,7 +516,7 @@ _sel_update(Evas_Textblock_Cursor *c __UNUSED__, Evas_Object *o, Entry *en)
evas_object_pass_events_set(ob, EINA_TRUE);
evas_object_show(ob);
sel->obj_bg = ob;
en->rp->edje->subobjs = eina_list_append(en->rp->edje->subobjs, sel->obj_bg);
_edje_subobj_register(en->rp->edje, sel->obj_bg);
ob = edje_object_add(en->rp->edje->base.evas);
edje_object_file_set(ob, en->rp->edje->path, en->rp->part->source2);
@ -530,7 +526,7 @@ _sel_update(Evas_Textblock_Cursor *c __UNUSED__, Evas_Object *o, Entry *en)
evas_object_pass_events_set(ob, EINA_TRUE);
evas_object_show(ob);
sel->obj_fg = ob;
en->rp->edje->subobjs = eina_list_append(en->rp->edje->subobjs, sel->obj_fg);
_edje_subobj_register(en->rp->edje, sel->obj_fg);
}
}
}
@ -728,10 +724,6 @@ _anchors_update(Evas_Textblock_Cursor *c __UNUSED__, Evas_Object *o, Entry *en)
while (an->sel)
{
sel = an->sel->data;
en->rp->edje->subobjs =
eina_list_remove(en->rp->edje->subobjs, sel->obj_bg);
en->rp->edje->subobjs =
eina_list_remove(en->rp->edje->subobjs, sel->obj_fg);
if (sel->obj_bg) evas_object_del(sel->obj_bg);
if (sel->obj_fg) evas_object_del(sel->obj_fg);
if (sel->obj) evas_object_del(sel->obj);
@ -766,8 +758,6 @@ _anchors_update(Evas_Textblock_Cursor *c __UNUSED__, Evas_Object *o, Entry *en)
while (an->sel)
{
sel = an->sel->data;
en->rp->edje->subobjs = eina_list_remove(en->rp->edje->subobjs, sel->obj_bg);
en->rp->edje->subobjs = eina_list_remove(en->rp->edje->subobjs, sel->obj_fg);
if (sel->obj_bg) evas_object_del(sel->obj_bg);
if (sel->obj_fg) evas_object_del(sel->obj_fg);
if (sel->obj) evas_object_del(sel->obj);
@ -788,7 +778,7 @@ _anchors_update(Evas_Textblock_Cursor *c __UNUSED__, Evas_Object *o, Entry *en)
evas_object_pass_events_set(ob, EINA_TRUE);
evas_object_show(ob);
sel->obj_bg = ob;
en->rp->edje->subobjs = eina_list_append(en->rp->edje->subobjs, sel->obj_bg);
_edje_subobj_register(en->rp->edje, sel->obj_bg);
ob = edje_object_add(en->rp->edje->base.evas);
edje_object_file_set(ob, en->rp->edje->path, en->rp->part->source6);
@ -798,7 +788,7 @@ _anchors_update(Evas_Textblock_Cursor *c __UNUSED__, Evas_Object *o, Entry *en)
evas_object_pass_events_set(ob, EINA_TRUE);
evas_object_show(ob);
sel->obj_fg = ob;
en->rp->edje->subobjs = eina_list_append(en->rp->edje->subobjs, sel->obj_fg);
_edje_subobj_register(en->rp->edje, sel->obj_fg);
ob = evas_object_rectangle_add(en->rp->edje->base.evas);
evas_object_color_set(ob, 0, 0, 0, 0);
@ -878,8 +868,6 @@ _anchors_clear(Evas_Textblock_Cursor *c __UNUSED__, Evas_Object *o __UNUSED__, E
while (an->sel)
{
Sel *sel = an->sel->data;
en->rp->edje->subobjs = eina_list_remove(en->rp->edje->subobjs, sel->obj_bg);
en->rp->edje->subobjs = eina_list_remove(en->rp->edje->subobjs, sel->obj_fg);
if (sel->obj_bg) evas_object_del(sel->obj_bg);
if (sel->obj_fg) evas_object_del(sel->obj_fg);
if (sel->obj) evas_object_del(sel->obj);
@ -2012,7 +2000,7 @@ _edje_entry_real_part_init(Edje_Real_Part *rp)
evas_object_stack_below(en->cursor_bg, rp->object);
evas_object_clip_set(en->cursor_bg, evas_object_clip_get(rp->object));
evas_object_pass_events_set(en->cursor_bg, EINA_TRUE);
rp->edje->subobjs = eina_list_append(rp->edje->subobjs, en->cursor_bg);
_edje_subobj_register(en->rp->edje, en->cursor_bg);
en->cursor_fg = edje_object_add(rp->edje->base.evas);
edje_object_file_set(en->cursor_fg, rp->edje->path, rp->part->source4);
@ -2020,7 +2008,7 @@ _edje_entry_real_part_init(Edje_Real_Part *rp)
evas_object_stack_above(en->cursor_fg, rp->object);
evas_object_clip_set(en->cursor_fg, evas_object_clip_get(rp->object));
evas_object_pass_events_set(en->cursor_fg, EINA_TRUE);
rp->edje->subobjs = eina_list_append(rp->edje->subobjs, en->cursor_fg);
_edje_subobj_register(en->rp->edje, en->cursor_fg);
if (rp->part->entry_mode >= EDJE_ENTRY_EDIT_MODE_EDITABLE)
{
@ -2086,8 +2074,6 @@ _edje_entry_real_part_shutdown(Edje_Real_Part *rp)
#ifdef HAVE_ECORE_IMF
_preedit_clear(en);
#endif
rp->edje->subobjs = eina_list_remove(rp->edje->subobjs, en->cursor_bg);
rp->edje->subobjs = eina_list_remove(rp->edje->subobjs, en->cursor_fg);
evas_object_del(en->cursor_bg);
evas_object_del(en->cursor_fg);

View File

@ -771,6 +771,8 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g
pack_it = NULL;
}
}
if (source)
_edje_subobj_register(ed, child_obj);
}
}

View File

@ -1410,6 +1410,7 @@ _elua_edje(lua_State *L) // Stack usage [-?, +?, ?]
{
_ELUA_PLANT_EVAS_OBJECT(Edje_Lua_Evas_Object, _elua_evas_edje_meta, _elua_evas_obj_free)
elo->evas_obj = edje_object_add(evas_object_evas_get(ed->obj));
_edje_subobj_register(ed, elo->evas_obj);
_elua_polish_evas_object(ed, elo);
return 1;
}

View File

@ -17,12 +17,19 @@ EAPI void
edje_object_message_send(Evas_Object *obj, Edje_Message_Type type, int id, void *msg)
{
Edje *ed;
unsigned int i;
Eina_List *l;
Evas_Object *o;
ed = _edje_fetch(obj);
if (!ed) return;
_edje_message_send(ed, EDJE_QUEUE_SCRIPT, type, id, msg);
EINA_LIST_FOREACH(ed->subobjs, l, o)
{
edje_object_message_send(o, type, id, msg);
}
/* old manual part walking code to send messages to children - should all
* be in subobjs if we care
unsigned int i;
for (i = 0; i < ed->table_parts_size; i++)
{
@ -47,6 +54,7 @@ edje_object_message_send(Evas_Object *obj, Edje_Message_Type type, int id, void
}
}
}
*/
}
@ -208,10 +216,21 @@ _edje_message_shutdown(void)
void
_edje_message_cb_set(Edje *ed, void (*func) (void *data, Evas_Object *obj, Edje_Message_Type type, int id, void *msg), void *data)
{
unsigned int i;
Eina_List *l;
Evas_Object *o;
ed->message.func = func;
ed->message.data = data;
EINA_LIST_FOREACH(ed->subobjs, l, o)
{
Edje *edj2 = _edje_fetch(o);
if (!edj2) continue;
_edje_message_cb_set(edj2, func, data);
}
/* old manual part walking code to send messages to children - should all
* be in subobjs if we care
unsigned int i;
for (i = 0; i < ed->table_parts_size; i++)
{
Edje_Real_Part *rp = ed->table_parts[i];
@ -234,6 +253,7 @@ _edje_message_cb_set(Edje *ed, void (*func) (void *data, Evas_Object *obj, Edje_
}
}
}
*/
}
Edje_Message *

View File

@ -1964,6 +1964,8 @@ void _edje_object_orientation_inform(Evas_Object *obj);
void _edje_lib_ref(void);
void _edje_lib_unref(void);
void _edje_subobj_register(Edje *ed, Evas_Object *ob);
void _edje_multisense_init(void);
void _edje_multisense_shutdown(void);
Eina_Bool _edje_multisense_internal_sound_sample_play(Edje *ed, const char *sample_name, const double speed);

View File

@ -846,12 +846,9 @@ _edje_emit(Edje *ed, const char *sig, const char *src)
/* data should either be NULL or a malloc allocated data */
void
_edje_emit_full(Edje *ed, const char *sig, const char *src, void *data,
void (*free_func)(void *))
_edje_emit_full(Edje *ed, const char *sig, const char *src, void *data, void (*free_func)(void *))
{
Edje_Message_Signal emsg;
Eina_List *l;
Evas_Object *obj;
const char *sep;
if (ed->delete_me) return;
@ -991,6 +988,9 @@ _edje_emit_full(Edje *ed, const char *sig, const char *src, void *data,
{
emsg.data = NULL;
}
/* new sends code */
edje_object_message_send(ed->obj, EDJE_MESSAGE_SIGNAL, 0, &emsg);
/* old send code - use api now
_edje_message_send(ed, EDJE_QUEUE_SCRIPT, EDJE_MESSAGE_SIGNAL, 0, &emsg);
EINA_LIST_FOREACH(ed->subobjs, l, obj)
{
@ -1001,7 +1001,7 @@ _edje_emit_full(Edje *ed, const char *sig, const char *src, void *data,
if (ed2->delete_me) continue;
_edje_message_send(ed2, EDJE_QUEUE_SCRIPT, EDJE_MESSAGE_SIGNAL, 0, &emsg);
}
*/
if (emsg.data && (--(emsg.data->ref) == 0))
{
if (emsg.data->free_func)

View File

@ -4297,5 +4297,21 @@ edje_string_id_get(const Edje_String *es)
return es->str;
}
static void
_cb_subobj_del(void *data, __UNUSED__ Evas *e, Evas_Object *obj, __UNUSED__ void *event_info)
{
Edje *ed = data;
ed->subobjs = eina_list_remove(ed->subobjs, obj);
evas_object_event_callback_del_full(obj, EVAS_CALLBACK_DEL,
_cb_subobj_del, ed);
}
void
_edje_subobj_register(Edje *ed, Evas_Object *ob)
{
ed->subobjs = eina_list_append(ed->subobjs, ob);
evas_object_event_callback_add(ob, EVAS_CALLBACK_DEL,
_cb_subobj_del, ed);
}
/* vim:set ts=8 sw=3 sts=3 expandtab cino=>5n-2f0^-2{2(0W1st0 :*/