diff --git a/legacy/eobj/lib/eo.c b/legacy/eobj/lib/eo.c index 5aea4b8829..03111ed71e 100644 --- a/legacy/eobj/lib/eo.c +++ b/legacy/eobj/lib/eo.c @@ -45,6 +45,7 @@ struct _Eo { Eo_Kls_Itr mro_itr; + Eina_Bool composite:1; Eina_Bool del:1; Eina_Bool construct_error:1; Eina_Bool manual_free:1; @@ -1074,6 +1075,11 @@ eo_parent_set(Eo *obj, const Eo *parent) _eo_ref(obj); + if (eo_composite_is(obj)) + { + eo_composite_object_detach(obj->parent, obj); + } + if (obj->parent) { obj->parent->children = @@ -1534,7 +1540,8 @@ eo_composite_object_attach(Eo *obj, Eo *emb_obj) EO_MAGIC_RETURN(obj, EO_EINA_MAGIC); EO_MAGIC_RETURN(emb_obj, EO_EINA_MAGIC); - eo_xref(emb_obj, obj); + emb_obj->composite = EINA_TRUE; + eo_parent_set(emb_obj, obj); obj->composite_objects = eina_list_prepend(obj->composite_objects, emb_obj); } @@ -1544,8 +1551,9 @@ eo_composite_object_detach(Eo *obj, Eo *emb_obj) EO_MAGIC_RETURN(obj, EO_EINA_MAGIC); EO_MAGIC_RETURN(emb_obj, EO_EINA_MAGIC); + emb_obj->composite = EINA_FALSE; obj->composite_objects = eina_list_remove(obj->composite_objects, emb_obj); - eo_xunref(emb_obj, obj); + eo_parent_set(emb_obj, NULL); } EAPI Eina_Bool @@ -1557,20 +1565,7 @@ eo_composite_is(const Eo *emb_obj) return EINA_FALSE; } - Eo *obj = eo_parent_get(emb_obj); - Eina_List *itr; - Eo *tmp; - - if (!obj) - return EINA_FALSE; - - EINA_LIST_FOREACH(obj->composite_objects, itr, tmp) - { - if (tmp == emb_obj) - return EINA_TRUE; - } - - return EINA_FALSE; + return emb_obj->composite; } EAPI void diff --git a/legacy/eobj/tests/eo_test_general.c b/legacy/eobj/tests/eo_test_general.c index f9311e0929..e1d5bfafbe 100644 --- a/legacy/eobj/tests/eo_test_general.c +++ b/legacy/eobj/tests/eo_test_general.c @@ -59,6 +59,26 @@ START_TEST(eo_data_fetch) } END_TEST +START_TEST(eo_composite_tests) +{ + eo_init(); + + Eo *obj = eo_add(SIMPLE_CLASS, NULL); + fail_if(!obj); + Eo *obj2 = eo_add(SIMPLE_CLASS, NULL); + fail_if(!obj2); + + eo_composite_object_attach(obj, obj2); + eo_parent_set(obj2, NULL); + fail_if(eo_composite_is(obj2)); + + eo_unref(obj2); + eo_unref(obj); + + eo_shutdown(); +} +END_TEST + START_TEST(eo_static_classes) { eo_init(); @@ -516,4 +536,5 @@ void eo_test_general(TCase *tc) tcase_add_test(tc, eo_data_fetch); tcase_add_test(tc, eo_man_free); tcase_add_test(tc, eo_static_classes); + tcase_add_test(tc, eo_composite_tests); }