evas: Fix crash with smart objects

This is due to the previous patches.
This commit is contained in:
Jean-Philippe Andre 2017-09-06 12:13:58 +09:00
parent 9ed6838f17
commit 7ef714924a
11 changed files with 30 additions and 32 deletions

View File

@ -30,7 +30,7 @@ _edje_object_efl_object_constructor(Eo *obj, Edje *ed)
Evas *e;
void *tmp;
efl_canvas_group_unclipped_set(obj, EINA_FALSE);
efl_canvas_group_clipped_set(obj, EINA_TRUE);
obj = efl_constructor(efl_super(obj, MY_CLASS));
efl_canvas_object_type_set(obj, MY_CLASS_NAME_LEGACY);
ed->base = evas_object_smart_data_get(obj);

View File

@ -198,7 +198,7 @@ _elm_pan_add(Evas *evas)
EOLIAN static Eo *
_elm_pan_efl_object_constructor(Eo *obj, Elm_Pan_Smart_Data *_pd EINA_UNUSED)
{
efl_canvas_group_unclipped_set(obj, EINA_FALSE);
efl_canvas_group_clipped_set(obj, EINA_TRUE);
obj = efl_constructor(efl_super(obj, MY_PAN_CLASS));
efl_canvas_object_type_set(obj, MY_PAN_CLASS_NAME_LEGACY);
evas_object_smart_callbacks_descriptions_set(obj, _smart_callbacks);

View File

@ -6183,7 +6183,7 @@ _elm_widget_efl_object_constructor(Eo *obj, Elm_Widget_Smart_Data *sd EINA_UNUSE
Eo *parent = NULL;
sd->on_create = EINA_TRUE;
efl_canvas_group_unclipped_set(obj, EINA_TRUE);
efl_canvas_group_clipped_set(obj, EINA_FALSE);
obj = efl_constructor(efl_super(obj, MY_CLASS));
efl_canvas_object_type_set(obj, MY_CLASS_NAME_LEGACY);
evas_object_smart_callbacks_descriptions_set(obj, _smart_callbacks);

View File

@ -254,7 +254,7 @@ emotion_object_add(Evas *evas)
EOLIAN static Eo *
_efl_canvas_video_efl_object_constructor(Eo *obj, Efl_Canvas_Video_Data *pd EINA_UNUSED)
{
efl_canvas_group_unclipped_set(obj, EINA_TRUE);
efl_canvas_group_clipped_set(obj, EINA_FALSE);
obj = efl_constructor(efl_super(obj, MY_CLASS));
efl_canvas_object_type_set(obj, E_OBJ_NAME);

View File

@ -53,7 +53,7 @@ EOAPI void efl_canvas_object_legacy_ctor(Eo *obj);
EOAPI void efl_canvas_object_type_set(Eo *obj, const char *type);
EOAPI void efl_canvas_group_add(Eo *obj);
EOAPI void efl_canvas_group_del(Eo *obj);
EOAPI void efl_canvas_group_unclipped_set(Eo *obj, Eina_Bool unclipped);
EOAPI void efl_canvas_group_clipped_set(Eo *obj, Eina_Bool unclipped);
EOAPI void *efl_input_legacy_info_get(const Eo *obj);
EOAPI Eo *efl_input_instance_get(const Eo *obj, Efl_Object *owner, void **priv);

View File

@ -320,7 +320,7 @@ _efl_canvas_object_event_grabber_efl_object_constructor(Eo *eo_obj, Efl_Object_E
{
Evas_Object_Protected_Data *obj;
efl_canvas_group_unclipped_set(eo_obj, EINA_TRUE);
efl_canvas_group_clipped_set(eo_obj, EINA_FALSE);
eo_obj = efl_constructor(efl_super(eo_obj, MY_CLASS));
efl_canvas_object_type_set(eo_obj, MY_CLASS_NAME_LEGACY);
obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);

View File

@ -484,7 +484,7 @@ evas_object_box_add(Evas *evas)
EOLIAN static Eo *
_evas_box_efl_object_constructor(Eo *obj, Evas_Object_Box_Data *class_data EINA_UNUSED)
{
efl_canvas_group_unclipped_set(obj, EINA_FALSE);
efl_canvas_group_clipped_set(obj, EINA_TRUE);
obj = efl_constructor(efl_super(obj, MY_CLASS));
evas_object_smart_callbacks_descriptions_set(obj, _signals);
efl_canvas_object_type_set(obj, MY_CLASS_NAME_LEGACY);

View File

@ -285,7 +285,7 @@ evas_object_grid_add(Evas *evas)
EOLIAN static Eo *
_evas_grid_efl_object_constructor(Eo *obj, Evas_Grid_Data *class_data EINA_UNUSED)
{
efl_canvas_group_unclipped_set(obj, EINA_FALSE);
efl_canvas_group_clipped_set(obj, EINA_TRUE);
obj = efl_constructor(efl_super(obj, MY_CLASS));
evas_object_smart_attach(obj, _evas_object_grid_smart_class_new());

View File

@ -48,7 +48,7 @@ struct _Evas_Smart_Data
Eina_Bool need_recalculate : 1;
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 clipped : 1; /* If true, smart clipped */
Eina_Bool data_nofree : 1; /* If true, do NOT free the data */
Eina_Bool constructed : 1; /* constructor finished */
};
@ -129,7 +129,7 @@ static const Evas_Object_Func object_func =
static inline Evas_Object *
_smart_clipper_get(Evas_Smart_Data *o)
{
Evas_Object_Smart_Clipped_Data *cso = (!o->unclipped) ? o->data : NULL;
Evas_Object_Smart_Clipped_Data *cso = o->clipped ? o->data : NULL;
return cso ? cso->clipper : NULL;
}
@ -294,7 +294,7 @@ _efl_canvas_group_group_member_add(Eo *smart_obj, Evas_Smart_Data *o, Evas_Objec
if (!smart->is_frame_top && (smart->is_frame != obj->is_frame))
efl_canvas_object_is_frame_object_set(eo_obj, smart->is_frame);
if (!o->unclipped && o->constructed)
if (o->clipped && o->constructed)
{
Evas_Object *clipper = _smart_clipper_get(o);
Eina_Bool had_clippees = efl_canvas_object_clipees_has(clipper);
@ -339,7 +339,7 @@ _efl_canvas_group_group_member_del(Eo *smart_obj, Evas_Smart_Data *_pd EINA_UNUS
o = efl_data_scope_get(smart_obj, MY_CLASS);
if (!o->unclipped)
if (o->clipped)
{
Evas_Object *clipper = _smart_clipper_get(o);
@ -675,7 +675,7 @@ _efl_canvas_group_efl_object_constructor(Eo *eo_obj, Evas_Smart_Data *sd)
obj->is_smart = EINA_TRUE;
obj->func = &object_func;
obj->private_data = efl_data_ref(eo_obj, MY_CLASS);
if (!sd->unclipped)
if (sd->clipped)
_evas_object_smart_clipped_init(eo_obj);
efl_canvas_object_type_set(eo_obj, MY_CLASS_NAME_LEGACY);
@ -798,7 +798,7 @@ _efl_canvas_group_group_add(Eo *eo_obj EINA_UNUSED, Evas_Smart_Data *o EINA_UNUS
EOLIAN static void
_efl_canvas_group_group_del(Eo *eo_obj EINA_UNUSED, Evas_Smart_Data *o)
{
if (!o->unclipped)
if (o->clipped)
{
_efl_canvas_group_group_members_all_del_internal(o);
}
@ -816,7 +816,7 @@ _efl_canvas_group_efl_canvas_object_no_render_set(Eo *eo_obj, Evas_Smart_Data *o
efl_canvas_object_no_render_set(efl_super(eo_obj, MY_CLASS), enable);
clipper = (!o->unclipped) ? _smart_clipper_get(o) : NULL;
clipper = (o->clipped) ? _smart_clipper_get(o) : NULL;
EINA_INLIST_FOREACH(o->contained, obj2)
{
if (obj2->object != clipper)
@ -832,7 +832,7 @@ _efl_canvas_group_efl_gfx_color_set(Eo *eo_obj, Evas_Smart_Data *o, int r, int g
efl_gfx_color_set(efl_super(eo_obj, MY_CLASS), r, g, b, a);
if (!o->unclipped)
if (o->clipped)
{
Evas_Object *clipper = _smart_clipper_get(o);
EINA_SAFETY_ON_NULL_RETURN(clipper);
@ -850,7 +850,7 @@ _efl_canvas_group_efl_gfx_visible_set(Eo *eo_obj, Evas_Smart_Data *o, Eina_Bool
efl_gfx_visible_set(efl_super(eo_obj, MY_CLASS), vis);
if (!o->unclipped)
if (o->clipped)
{
Evas_Object *clipper = _smart_clipper_get(o);
EINA_SAFETY_ON_NULL_RETURN(clipper);
@ -869,7 +869,7 @@ _efl_canvas_group_efl_gfx_position_set(Eo *eo_obj, Evas_Smart_Data *o, Evas_Coor
if (_evas_object_intercept_call(eo_obj, EVAS_OBJECT_INTERCEPT_CB_MOVE, 0, x, y))
return;
if (!o->unclipped)
if (o->clipped)
_evas_object_smart_clipped_smart_move_internal(eo_obj, x, y);
efl_gfx_position_set(efl_super(eo_obj, MY_CLASS), x, y);
}
@ -883,7 +883,7 @@ _efl_canvas_group_efl_canvas_object_clip_set(Eo *eo_obj, Evas_Smart_Data *o, Eva
efl_canvas_object_clip_set(efl_super(eo_obj, MY_CLASS), clip);
if (!o->unclipped)
if (o->clipped)
{
Evas_Object *clipper = _smart_clipper_get(o);
EINA_SAFETY_ON_NULL_RETURN(clipper);
@ -1820,12 +1820,12 @@ _efl_canvas_group_efl_canvas_object_paragraph_direction_get(Eo *eo_obj EINA_UNUS
/* Internal EO */
static void
_efl_canvas_group_group_unclipped_set(Eo *eo_obj EINA_UNUSED, Evas_Smart_Data *sd, Eina_Bool unclipped)
_efl_canvas_group_group_clipped_set(Eo *eo_obj EINA_UNUSED, Evas_Smart_Data *sd, Eina_Bool clipped)
{
// We must call this function BEFORE the constructor (yes, it's hacky)
EINA_SAFETY_ON_FALSE_RETURN(!sd->object);
sd->unclipped = !!unclipped;
if (!unclipped && !sd->data)
sd->clipped = !!clipped;
if (clipped && !sd->data)
sd->data = calloc(1, sizeof(Evas_Object_Smart_Clipped_Data));
}
@ -1833,11 +1833,11 @@ _efl_canvas_group_group_unclipped_set(Eo *eo_obj EINA_UNUSED, Evas_Smart_Data *s
EOAPI EFL_VOID_FUNC_BODY(efl_canvas_group_add)
EOAPI EFL_VOID_FUNC_BODY(efl_canvas_group_del)
EOAPI EFL_VOID_FUNC_BODYV(efl_canvas_group_unclipped_set, EFL_FUNC_CALL(enable), Eina_Bool enable)
EOAPI EFL_VOID_FUNC_BODYV(efl_canvas_group_clipped_set, EFL_FUNC_CALL(enable), Eina_Bool enable)
#define EFL_CANVAS_GROUP_EXTRA_OPS \
EFL_OBJECT_OP_FUNC(efl_canvas_group_add, _efl_canvas_group_group_add), \
EFL_OBJECT_OP_FUNC(efl_canvas_group_del, _efl_canvas_group_group_del), \
EFL_OBJECT_OP_FUNC(efl_canvas_group_unclipped_set, _efl_canvas_group_group_unclipped_set)
EFL_OBJECT_OP_FUNC(efl_canvas_group_clipped_set, _efl_canvas_group_group_clipped_set)
#include "canvas/efl_canvas_group.eo.c"

View File

@ -1,5 +1,4 @@
#define EFL_CANVAS_GROUP_PROTECTED
#define EFL_CANVAS_GROUP_BETA
/* Legacy only */
#include "evas_common_private.h"
#include "evas_private.h"
@ -20,13 +19,13 @@ evas_object_smart_clipped_clipper_get(const Evas_Object *eo_obj)
}
static void
evas_object_smart_clipped_smart_add_legacy(Evas_Object *eo_obj)
evas_object_smart_clipped_smart_add(Evas_Object *eo_obj)
{
_evas_object_smart_clipped_init(eo_obj);
}
static void
evas_object_smart_clipped_smart_del_legacy(Evas_Object *eo_obj)
evas_object_smart_clipped_smart_del(Evas_Object *eo_obj)
{
CSO_DATA_GET_OR_RETURN(eo_obj, cso);
@ -105,15 +104,14 @@ evas_object_smart_clipped_smart_member_del(Evas_Object *eo_obj, Evas_Object *mem
evas_object_hide(cso->clipper);
}
/* Legacy only */
EAPI void
evas_object_smart_clipped_smart_set(Evas_Smart_Class *sc)
{
if (!sc)
return;
sc->add = evas_object_smart_clipped_smart_add_legacy;
sc->del = evas_object_smart_clipped_smart_del_legacy;
sc->add = evas_object_smart_clipped_smart_add;
sc->del = evas_object_smart_clipped_smart_del;
sc->move = evas_object_smart_clipped_smart_move;
sc->show = evas_object_smart_clipped_smart_show;
sc->hide = evas_object_smart_clipped_smart_hide;

View File

@ -988,7 +988,7 @@ evas_object_table_add(Evas *evas)
EOLIAN static Eo *
_evas_table_efl_object_constructor(Eo *obj, Evas_Table_Data *class_data EINA_UNUSED)
{
efl_canvas_group_unclipped_set(obj, EINA_FALSE);
efl_canvas_group_clipped_set(obj, EINA_TRUE);
obj = efl_constructor(efl_super(obj, MY_CLASS));
efl_canvas_object_type_set(obj, MY_CLASS_NAME_LEGACY);