evas: Remove group_del override from smart clipped

This commit is contained in:
Jean-Philippe Andre 2017-09-01 15:21:22 +09:00
parent 230b234891
commit e380dae4bc
4 changed files with 41 additions and 30 deletions

View File

@ -148,7 +148,6 @@ _edje_object_efl_canvas_group_group_del(Eo *obj, Edje *ed)
_edje_block_violate(ed); _edje_block_violate(ed);
ed->delete_me = 1; ed->delete_me = 1;
_edje_edjes = eina_inlist_remove(_edje_edjes, EINA_INLIST_GET(ed)); _edje_edjes = eina_inlist_remove(_edje_edjes, EINA_INLIST_GET(ed));
evas_object_smart_data_set(obj, NULL);
if (_edje_lua_script_only(ed)) _edje_lua_script_only_shutdown(ed); if (_edje_lua_script_only(ed)) _edje_lua_script_only_shutdown(ed);
#ifdef HAVE_EPHYSICS #ifdef HAVE_EPHYSICS
/* clear physics world / shutdown ephysics */ /* clear physics world / shutdown ephysics */

View File

@ -408,7 +408,6 @@ _evas_box_efl_canvas_group_group_add(Eo *eo_obj, Evas_Object_Box_Data *priv)
cso = evas_object_smart_data_get(eo_obj); cso = evas_object_smart_data_get(eo_obj);
priv->base = *cso; priv->base = *cso;
evas_object_smart_data_set(eo_obj, priv); evas_object_smart_data_set(eo_obj, priv);
free(cso);
} }
EOLIAN static void EOLIAN static void

View File

@ -49,6 +49,7 @@ struct _Evas_Smart_Data
Eina_Bool update_boundingbox_needed : 1; Eina_Bool update_boundingbox_needed : 1;
Eina_Bool group_del_called : 1; Eina_Bool group_del_called : 1;
Eina_Bool unclipped : 1; /* If true, NOT a smart_clipped object */ Eina_Bool unclipped : 1; /* If true, NOT a smart_clipped object */
Eina_Bool data_nofree : 1; /* If true, do NOT free the data */
}; };
typedef struct typedef struct
@ -130,7 +131,13 @@ EAPI void
evas_object_smart_data_set(Evas_Object *eo_obj, void *data) evas_object_smart_data_set(Evas_Object *eo_obj, void *data)
{ {
EVAS_OBJECT_SMART_GET_OR_RETURN(eo_obj); EVAS_OBJECT_SMART_GET_OR_RETURN(eo_obj);
o->data = data; if (o->data != data)
{
if (o->data && !o->data_nofree)
free(o->data);
o->data = data;
o->data_nofree = EINA_TRUE;
}
} }
EAPI void * EAPI void *
@ -517,17 +524,21 @@ evas_object_smart_members_get_direct(const Evas_Object *eo_obj)
return o->contained; return o->contained;
} }
static void
_efl_canvas_group_group_members_all_del_internal(Evas_Smart_Data *o)
{;
Evas_Object_Protected_Data *memobj;
Eina_Inlist *itrn;
EINA_INLIST_FOREACH_SAFE(o->contained, itrn, memobj)
efl_del(memobj->object);
o->group_del_called = EINA_TRUE;
}
void void
_efl_canvas_group_group_members_all_del(Evas_Object *eo_obj) _efl_canvas_group_group_members_all_del(Evas_Object *eo_obj)
{ {
Evas_Smart_Data *o = efl_data_scope_get(eo_obj, MY_CLASS); Evas_Smart_Data *o = efl_data_scope_get(eo_obj, MY_CLASS);
Evas_Object_Protected_Data *memobj; _efl_canvas_group_group_members_all_del_internal(o);
Eina_Inlist *itrn;
EINA_INLIST_FOREACH_SAFE(o->contained, itrn, memobj)
{
evas_object_del((Evas_Object *)((Evas_Object_Protected_Data *)memobj->object));
}
o->group_del_called = EINA_TRUE;
} }
static void static void
@ -630,6 +641,8 @@ EOLIAN static void
_efl_canvas_group_efl_object_destructor(Eo *eo_obj, Evas_Smart_Data *o) _efl_canvas_group_efl_object_destructor(Eo *eo_obj, Evas_Smart_Data *o)
{ {
efl_destructor(efl_super(eo_obj, MY_CLASS)); efl_destructor(efl_super(eo_obj, MY_CLASS));
if (o->data && !o->data_nofree)
free(o->data);
if (!o->group_del_called) if (!o->group_del_called)
{ {
ERR("efl_canvas_group_del() was not called on this object: %p (%s)", ERR("efl_canvas_group_del() was not called on this object: %p (%s)",
@ -709,8 +722,21 @@ _efl_canvas_group_group_add(Eo *eo_obj, Evas_Smart_Data *o EINA_UNUSED)
} }
EOLIAN static void EOLIAN static void
_efl_canvas_group_group_del(Eo *eo_obj EINA_UNUSED, Evas_Smart_Data *o EINA_UNUSED) _efl_canvas_group_group_del(Eo *eo_obj EINA_UNUSED, Evas_Smart_Data *o)
{ {
if (!o->unclipped)
{
Evas_Object_Smart_Clipped_Data *cso = o->data;
Eo *clipper;
if (cso && cso->clipper)
{
clipper = cso->clipper;
cso->clipper = NULL;
efl_del(clipper);
}
_efl_canvas_group_group_members_all_del_internal(o);
}
o->group_del_called = EINA_TRUE; o->group_del_called = EINA_TRUE;
} }

View File

@ -22,7 +22,7 @@ evas_object_smart_clipped_clipper_get(const Evas_Object *eo_obj)
} }
static void static void
evas_object_smart_clipped_smart_add(Evas_Object *eo_obj, Evas_Object_Smart_Clipped_Data *cso) evas_object_smart_clipped_init(Evas_Object *eo_obj, Evas_Object_Smart_Clipped_Data *cso)
{ {
Evas_Object *clipper; Evas_Object *clipper;
@ -48,7 +48,7 @@ evas_object_smart_clipped_smart_add_legacy(Evas_Object *eo_obj)
Evas_Object_Smart_Clipped_Data *cso; Evas_Object_Smart_Clipped_Data *cso;
cso = calloc(1, sizeof(*cso)); cso = calloc(1, sizeof(*cso));
evas_object_smart_clipped_smart_add(eo_obj, cso); evas_object_smart_clipped_init(eo_obj, cso);
} }
EOLIAN static void EOLIAN static void
@ -57,11 +57,11 @@ _efl_canvas_group_clipped_efl_canvas_group_group_add(Eo *eo_obj, void *_pd EINA_
Evas_Object_Smart_Clipped_Data *cso; Evas_Object_Smart_Clipped_Data *cso;
cso = evas_object_smart_data_get(eo_obj); cso = evas_object_smart_data_get(eo_obj);
evas_object_smart_clipped_smart_add(eo_obj, cso); evas_object_smart_clipped_init(eo_obj, cso);
} }
static void static void
evas_object_smart_clipped_smart_del(Evas_Object *eo_obj) evas_object_smart_clipped_smart_del_legacy(Evas_Object *eo_obj)
{ {
CSO_DATA_GET_OR_RETURN(eo_obj, cso); CSO_DATA_GET_OR_RETURN(eo_obj, cso);
@ -73,19 +73,6 @@ evas_object_smart_clipped_smart_del(Evas_Object *eo_obj)
} }
_efl_canvas_group_group_members_all_del(eo_obj); _efl_canvas_group_group_members_all_del(eo_obj);
/* If it's a legacy smart object, we should free the cso. */
if (!efl_isa(eo_obj, MY_CLASS))
free(cso);
evas_object_smart_data_set(eo_obj, NULL);
}
EOLIAN static void
_efl_canvas_group_clipped_efl_canvas_group_group_del(Eo *eo_obj, void *_pd EINA_UNUSED)
{
evas_object_smart_clipped_smart_del(eo_obj);
// group_del_called was already set to true, no need to call super here.
} }
static void static void
@ -232,7 +219,7 @@ evas_object_smart_clipped_smart_set(Evas_Smart_Class *sc)
return; return;
sc->add = evas_object_smart_clipped_smart_add_legacy; sc->add = evas_object_smart_clipped_smart_add_legacy;
sc->del = evas_object_smart_clipped_smart_del; sc->del = evas_object_smart_clipped_smart_del_legacy;
sc->move = evas_object_smart_clipped_smart_move; sc->move = evas_object_smart_clipped_smart_move;
sc->show = evas_object_smart_clipped_smart_show; sc->show = evas_object_smart_clipped_smart_show;
sc->hide = evas_object_smart_clipped_smart_hide; sc->hide = evas_object_smart_clipped_smart_hide;
@ -261,7 +248,7 @@ evas_object_smart_clipped_class_get(void)
/* Internal EO APIs and hidden overrides */ /* Internal EO APIs and hidden overrides */
#define EFL_CANVAS_GROUP_CLIPPED_EXTRA_OPS \ #define EFL_CANVAS_GROUP_CLIPPED_EXTRA_OPS \
EFL_CANVAS_GROUP_ADD_DEL_OPS(efl_canvas_group_clipped) EFL_CANVAS_GROUP_ADD_OPS(efl_canvas_group_clipped)
#include "canvas/efl_canvas_group_clipped.eo.c" #include "canvas/efl_canvas_group_clipped.eo.c"