diff --git a/legacy/edje/src/lib/edje_embryo.c b/legacy/edje/src/lib/edje_embryo.c index 378a1fbfe8..c89a4f4a78 100644 --- a/legacy/edje/src/lib/edje_embryo.c +++ b/legacy/edje/src/lib/edje_embryo.c @@ -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; } diff --git a/legacy/edje/src/lib/edje_entry.c b/legacy/edje/src/lib/edje_entry.c index d5614569a2..7f0eb147b0 100644 --- a/legacy/edje/src/lib/edje_entry.c +++ b/legacy/edje/src/lib/edje_entry.c @@ -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); diff --git a/legacy/edje/src/lib/edje_load.c b/legacy/edje/src/lib/edje_load.c index a67fc01100..a82f73a46d 100644 --- a/legacy/edje/src/lib/edje_load.c +++ b/legacy/edje/src/lib/edje_load.c @@ -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); } } diff --git a/legacy/edje/src/lib/edje_lua2.c b/legacy/edje/src/lib/edje_lua2.c index e5f1eac903..8a081c9eeb 100644 --- a/legacy/edje/src/lib/edje_lua2.c +++ b/legacy/edje/src/lib/edje_lua2.c @@ -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; } diff --git a/legacy/edje/src/lib/edje_message_queue.c b/legacy/edje/src/lib/edje_message_queue.c index e06be09b76..2a761d9130 100644 --- a/legacy/edje/src/lib/edje_message_queue.c +++ b/legacy/edje/src/lib/edje_message_queue.c @@ -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 * diff --git a/legacy/edje/src/lib/edje_private.h b/legacy/edje/src/lib/edje_private.h index 4f626b2fd9..fc4aeab9ac 100644 --- a/legacy/edje/src/lib/edje_private.h +++ b/legacy/edje/src/lib/edje_private.h @@ -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); diff --git a/legacy/edje/src/lib/edje_program.c b/legacy/edje/src/lib/edje_program.c index a0394d35fc..931977c832 100644 --- a/legacy/edje/src/lib/edje_program.c +++ b/legacy/edje/src/lib/edje_program.c @@ -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) diff --git a/legacy/edje/src/lib/edje_util.c b/legacy/edje/src/lib/edje_util.c index 77e7d5aae6..072a404590 100644 --- a/legacy/edje/src/lib/edje_util.c +++ b/legacy/edje/src/lib/edje_util.c @@ -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 :*/