forked from enlightenment/efl
parent
020bf40113
commit
143e06b209
|
@ -668,6 +668,14 @@ EAPI Eo *eo_add(const Eo_Class *klass, Eo *parent);
|
||||||
*/
|
*/
|
||||||
EAPI Eo *eo_parent_get(const Eo *obj);
|
EAPI Eo *eo_parent_get(const Eo *obj);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Set the parent of an object
|
||||||
|
* @param obj the object to get the parent of.
|
||||||
|
* @param parent the new parent.
|
||||||
|
* @return @c EINA_TRUE on success, @c EINA_FALSE on failure.
|
||||||
|
*/
|
||||||
|
EAPI Eina_Bool eo_parent_set(Eo *obj, const Eo *parent);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Get a pointer to the data of an object for a specific class.
|
* @brief Get a pointer to the data of an object for a specific class.
|
||||||
* @param obj the object to work on.
|
* @param obj the object to work on.
|
||||||
|
|
|
@ -32,7 +32,9 @@ typedef struct
|
||||||
|
|
||||||
struct _Eo {
|
struct _Eo {
|
||||||
EINA_MAGIC
|
EINA_MAGIC
|
||||||
|
EINA_INLIST;
|
||||||
Eo *parent;
|
Eo *parent;
|
||||||
|
Eina_Inlist *children;
|
||||||
const Eo_Class *klass;
|
const Eo_Class *klass;
|
||||||
int refcount;
|
int refcount;
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
|
@ -1060,6 +1062,35 @@ cleanup:
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EAPI Eina_Bool
|
||||||
|
eo_parent_set(Eo *obj, const Eo *parent)
|
||||||
|
{
|
||||||
|
EO_MAGIC_RETURN_VAL(obj, EO_EINA_MAGIC, EINA_FALSE);
|
||||||
|
if (parent)
|
||||||
|
EO_MAGIC_RETURN_VAL(parent, EO_EINA_MAGIC, EINA_FALSE);
|
||||||
|
|
||||||
|
_eo_ref(obj);
|
||||||
|
|
||||||
|
if (obj->parent)
|
||||||
|
{
|
||||||
|
obj->parent->children =
|
||||||
|
eina_inlist_remove(obj->parent->children, EINA_INLIST_GET(obj));
|
||||||
|
// eo_xunref(obj, obj->parent);
|
||||||
|
}
|
||||||
|
|
||||||
|
obj->parent = (Eo *) parent;
|
||||||
|
if (obj->parent)
|
||||||
|
{
|
||||||
|
obj->parent->children =
|
||||||
|
eina_inlist_append(obj->parent->children, EINA_INLIST_GET(obj));
|
||||||
|
// eo_xref(obj, obj->parent);
|
||||||
|
}
|
||||||
|
|
||||||
|
_eo_unref(obj);
|
||||||
|
|
||||||
|
return EINA_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
EAPI Eo *
|
EAPI Eo *
|
||||||
eo_add(const Eo_Class *klass, Eo *parent)
|
eo_add(const Eo_Class *klass, Eo *parent)
|
||||||
{
|
{
|
||||||
|
@ -1076,17 +1107,17 @@ eo_add(const Eo_Class *klass, Eo *parent)
|
||||||
Eo *obj = calloc(1, EO_ALIGN_SIZE(sizeof(*obj)) +
|
Eo *obj = calloc(1, EO_ALIGN_SIZE(sizeof(*obj)) +
|
||||||
(klass->data_offset + EO_ALIGN_SIZE(klass->desc->data_size)) +
|
(klass->data_offset + EO_ALIGN_SIZE(klass->desc->data_size)) +
|
||||||
klass->extn_data_size);
|
klass->extn_data_size);
|
||||||
obj->klass = klass;
|
EINA_MAGIC_SET(obj, EO_EINA_MAGIC);
|
||||||
obj->parent = parent;
|
|
||||||
|
|
||||||
obj->refcount++;
|
obj->refcount++;
|
||||||
|
obj->klass = klass;
|
||||||
|
|
||||||
|
eo_parent_set(obj, parent);
|
||||||
|
|
||||||
Eo_Kls_Itr prev_state;
|
Eo_Kls_Itr prev_state;
|
||||||
|
|
||||||
_eo_kls_itr_init(klass, &obj->mro_itr, EO_NOOP, &prev_state);
|
_eo_kls_itr_init(klass, &obj->mro_itr, EO_NOOP, &prev_state);
|
||||||
_eo_error_unset(obj);
|
_eo_error_unset(obj);
|
||||||
|
|
||||||
EINA_MAGIC_SET(obj, EO_EINA_MAGIC);
|
|
||||||
_eo_ref(obj);
|
_eo_ref(obj);
|
||||||
_eo_constructor(obj, klass);
|
_eo_constructor(obj, klass);
|
||||||
|
|
||||||
|
@ -1216,11 +1247,19 @@ _eo_del_internal(Eo *obj)
|
||||||
_eo_kls_itr_end(&obj->mro_itr, &prev_state);
|
_eo_kls_itr_end(&obj->mro_itr, &prev_state);
|
||||||
/*FIXME: add eo_class_unref(klass) ? - just to clear the caches. */
|
/*FIXME: add eo_class_unref(klass) ? - just to clear the caches. */
|
||||||
|
|
||||||
Eina_List *itr, *itr_n;
|
|
||||||
Eo *emb_obj;
|
|
||||||
EINA_LIST_FOREACH_SAFE(obj->composite_objects, itr, itr_n, emb_obj)
|
|
||||||
{
|
{
|
||||||
eo_composite_object_detach(obj, emb_obj);
|
Eina_List *itr, *itr_n;
|
||||||
|
Eo *emb_obj;
|
||||||
|
EINA_LIST_FOREACH_SAFE(obj->composite_objects, itr, itr_n, emb_obj)
|
||||||
|
{
|
||||||
|
eo_composite_object_detach(obj, emb_obj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
eo_parent_set(obj, NULL);
|
||||||
|
while (obj->children)
|
||||||
|
{
|
||||||
|
eo_parent_set(EINA_INLIST_CONTAINER_GET(obj->children, Eo), NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
obj->del = EINA_TRUE;
|
obj->del = EINA_TRUE;
|
||||||
|
|
Loading…
Reference in New Issue