forked from enlightenment/efl
Eo: Made composite objects more robust.
Mark on the object itself if it's composited -> faster. Remove from composite list if reparented. SVN revision: 71794
This commit is contained in:
parent
626a12f1d4
commit
84d2f4c322
|
@ -45,6 +45,7 @@ struct _Eo {
|
||||||
|
|
||||||
Eo_Kls_Itr mro_itr;
|
Eo_Kls_Itr mro_itr;
|
||||||
|
|
||||||
|
Eina_Bool composite:1;
|
||||||
Eina_Bool del:1;
|
Eina_Bool del:1;
|
||||||
Eina_Bool construct_error:1;
|
Eina_Bool construct_error:1;
|
||||||
Eina_Bool manual_free:1;
|
Eina_Bool manual_free:1;
|
||||||
|
@ -1074,6 +1075,11 @@ eo_parent_set(Eo *obj, const Eo *parent)
|
||||||
|
|
||||||
_eo_ref(obj);
|
_eo_ref(obj);
|
||||||
|
|
||||||
|
if (eo_composite_is(obj))
|
||||||
|
{
|
||||||
|
eo_composite_object_detach(obj->parent, obj);
|
||||||
|
}
|
||||||
|
|
||||||
if (obj->parent)
|
if (obj->parent)
|
||||||
{
|
{
|
||||||
obj->parent->children =
|
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(obj, EO_EINA_MAGIC);
|
||||||
EO_MAGIC_RETURN(emb_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);
|
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(obj, EO_EINA_MAGIC);
|
||||||
EO_MAGIC_RETURN(emb_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);
|
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
|
EAPI Eina_Bool
|
||||||
|
@ -1557,20 +1565,7 @@ eo_composite_is(const Eo *emb_obj)
|
||||||
return EINA_FALSE;
|
return EINA_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
Eo *obj = eo_parent_get(emb_obj);
|
return emb_obj->composite;
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
EAPI void
|
EAPI void
|
||||||
|
|
|
@ -59,6 +59,26 @@ START_TEST(eo_data_fetch)
|
||||||
}
|
}
|
||||||
END_TEST
|
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)
|
START_TEST(eo_static_classes)
|
||||||
{
|
{
|
||||||
eo_init();
|
eo_init();
|
||||||
|
@ -516,4 +536,5 @@ void eo_test_general(TCase *tc)
|
||||||
tcase_add_test(tc, eo_data_fetch);
|
tcase_add_test(tc, eo_data_fetch);
|
||||||
tcase_add_test(tc, eo_man_free);
|
tcase_add_test(tc, eo_man_free);
|
||||||
tcase_add_test(tc, eo_static_classes);
|
tcase_add_test(tc, eo_static_classes);
|
||||||
|
tcase_add_test(tc, eo_composite_tests);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue