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);
ed->delete_me = 1;
_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);
#ifdef HAVE_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);
priv->base = *cso;
evas_object_smart_data_set(eo_obj, priv);
free(cso);
}
EOLIAN static void

View File

@ -49,6 +49,7 @@ struct _Evas_Smart_Data
Eina_Bool update_boundingbox_needed : 1;
Eina_Bool group_del_called : 1;
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
@ -130,7 +131,13 @@ EAPI void
evas_object_smart_data_set(Evas_Object *eo_obj, void *data)
{
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 *
@ -517,17 +524,21 @@ evas_object_smart_members_get_direct(const Evas_Object *eo_obj)
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
_efl_canvas_group_group_members_all_del(Evas_Object *eo_obj)
{
Evas_Smart_Data *o = efl_data_scope_get(eo_obj, MY_CLASS);
Evas_Object_Protected_Data *memobj;
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;
_efl_canvas_group_group_members_all_del_internal(o);
}
static void
@ -630,6 +641,8 @@ EOLIAN static void
_efl_canvas_group_efl_object_destructor(Eo *eo_obj, Evas_Smart_Data *o)
{
efl_destructor(efl_super(eo_obj, MY_CLASS));
if (o->data && !o->data_nofree)
free(o->data);
if (!o->group_del_called)
{
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
_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;
}

View File

@ -22,7 +22,7 @@ evas_object_smart_clipped_clipper_get(const Evas_Object *eo_obj)
}
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;
@ -48,7 +48,7 @@ evas_object_smart_clipped_smart_add_legacy(Evas_Object *eo_obj)
Evas_Object_Smart_Clipped_Data *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
@ -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;
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
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);
@ -73,19 +73,6 @@ evas_object_smart_clipped_smart_del(Evas_Object *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
@ -232,7 +219,7 @@ evas_object_smart_clipped_smart_set(Evas_Smart_Class *sc)
return;
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->show = evas_object_smart_clipped_smart_show;
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 */
#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"