summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJean-Philippe Andre <jp.andre@samsung.com>2017-09-06 21:26:57 +0900
committerJean-Philippe Andre <jp.andre@samsung.com>2017-09-13 09:57:05 +0900
commitd971ca2fb83faf5d6ddcbbb1f64a0ebaf69e8007 (patch)
treee08713b4953019fc63c67485d6407cb73d95c8a4
parent820b8a0e6f65642c2cfd4196f8d08fe444bce310 (diff)
emotion: Fix refcounts related to eio use
Inside emotion, if Eio is compiled, some asynchronous functions are used and a refcounted struct was used to ensure safety of the code. Unfortunately the logic didn't make much sense as emotion's private data is used. The refcount becomes useless, the lifecycle of the data being bound to the object itself. Note that an actual crash is almost impossible because: - eio is actually quite fast - evas objects are kept alive for 2 frames - eina_freeq is used to keep eo objects' data alive for some more time But this in theory fixes the events, as they were sent on the wrong object. "obj" is the image object, "smartobj" was the emotion object. This is fixed with a weak ref. I don't think it is necessary to backport this.
-rw-r--r--src/lib/emotion/emotion_smart.c189
-rw-r--r--src/lib/evas/canvas/evas_object_smart.c29
-rw-r--r--src/lib/evas/canvas/evas_object_smart_clipped.c8
3 files changed, 98 insertions, 128 deletions
diff --git a/src/lib/emotion/emotion_smart.c b/src/lib/emotion/emotion_smart.c
index b2a7370..064ca23 100644
--- a/src/lib/emotion/emotion_smart.c
+++ b/src/lib/emotion/emotion_smart.c
@@ -56,29 +56,24 @@
56#define MY_CLASS EFL_CANVAS_VIDEO_CLASS 56#define MY_CLASS EFL_CANVAS_VIDEO_CLASS
57 57
58typedef struct _Efl_Canvas_Video_Data Efl_Canvas_Video_Data; 58typedef struct _Efl_Canvas_Video_Data Efl_Canvas_Video_Data;
59typedef struct _Emotion_Xattr_Data Emotion_Xattr_Data;
59 60
60struct _Efl_Canvas_Video_Data 61struct _Efl_Canvas_Video_Data
61{ 62{
62 EINA_REFCOUNT;
63 Emotion_Engine_Instance *engine_instance; 63 Emotion_Engine_Instance *engine_instance;
64 64
65 const char *engine; 65 const char *engine;
66 const char *file; 66 const char *file;
67 Evas_Object *smartobj;
68 Evas_Object *obj; 67 Evas_Object *obj;
69 Evas_Object *bg; 68 Evas_Object *bg;
70 69
71 Ecore_Job *job; 70 Ecore_Job *job;
72 71
73 Efl_Vpath_File *file_obj; 72 Efl_Vpath_File *file_obj;
73 Emotion_Xattr_Data *xattr;
74 74
75 const char *title; 75 const char *title;
76 76
77#ifdef HAVE_EIO
78 Eio_File *load_xattr;
79 Eio_File *save_xattr;
80#endif
81
82 struct { 77 struct {
83 const char *info; 78 const char *info;
84 double stat; 79 double stat;
@@ -126,6 +121,16 @@ struct _Efl_Canvas_Video_Data
126 Eina_Bool seeking : 1; 121 Eina_Bool seeking : 1;
127}; 122};
128 123
124struct _Emotion_Xattr_Data
125{
126 EINA_REFCOUNT;
127 Eo *obj_wref;
128#ifdef HAVE_EIO
129 Eio_File *load;
130 Eio_File *save;
131#endif
132};
133
129static void _mouse_move(void *data, Evas *ev, Evas_Object *obj, void *event_info); 134static void _mouse_move(void *data, Evas *ev, Evas_Object *obj, void *event_info);
130static void _mouse_down(void *data, Evas *ev, Evas_Object *obj, void *event_info); 135static void _mouse_down(void *data, Evas *ev, Evas_Object *obj, void *event_info);
131static void _pos_set_job(void *data); 136static void _pos_set_job(void *data);
@@ -163,48 +168,26 @@ _emotion_image_data_zero(Evas_Object *img)
163} 168}
164 169
165static void 170static void
166_smart_data_free(Efl_Canvas_Video_Data *sd) 171_xattr_data_cancel(Emotion_Xattr_Data *xattr)
167{ 172{
173 (void) xattr;
168#ifdef HAVE_EIO 174#ifdef HAVE_EIO
169 /* Only cancel the load_xattr or we will loose ref to time_seek stringshare */ 175 /* Only cancel the load_xattr or we will loose ref to time_seek stringshare */
170 if (sd->load_xattr) eio_file_cancel(sd->load_xattr); 176 if (xattr->load) eio_file_cancel(xattr->load);
171 sd->load_xattr = NULL; 177 xattr->load = NULL;
172 if (sd->save_xattr) eio_file_cancel(sd->save_xattr); 178 if (xattr->save) eio_file_cancel(xattr->save);
173 sd->save_xattr = NULL; 179 xattr->save = NULL;
174#endif 180#endif
181}
175 182
176 if (sd->file_obj) 183static void
177 { 184_xattr_data_unref(Emotion_Xattr_Data *xattr)
178 efl_del(sd->file_obj); 185{
179 sd->file_obj = NULL; 186 EINA_REFCOUNT_UNREF(xattr) {} else return;
180 }
181 if (sd->engine_instance)
182 {
183 emotion_engine_instance_file_close(sd->engine_instance);
184 emotion_engine_instance_del(sd->engine_instance);
185 sd->engine_instance = NULL;
186 }
187 if (sd->obj) evas_object_del(sd->obj);
188 sd->obj = NULL;
189 if (sd->crop.clipper) evas_object_del(sd->crop.clipper);
190 sd->crop.clipper = NULL;
191 if (sd->bg) evas_object_del(sd->bg);
192 sd->bg = NULL;
193 if (sd->file) eina_stringshare_del(sd->file);
194 sd->file = NULL;
195 if (sd->job) ecore_job_del(sd->job);
196 sd->job = NULL;
197 if (sd->anim) ecore_animator_del(sd->anim);
198 sd->anim = NULL;
199 eina_stringshare_del(sd->progress.info);
200 sd->progress.info = NULL;
201 eina_stringshare_del(sd->ref.file);
202 sd->ref.file = NULL;
203 if (sd->engine) eina_stringshare_del(sd->engine);
204 sd->engine = NULL;
205 187
206 /* TODO: remove legacy: emotion used to have no shutdown, call automatically */ 188 _xattr_data_cancel(xattr);
207 emotion_shutdown(); 189 efl_wref_del_safe(&xattr->obj_wref);
190 free(xattr);
208} 191}
209 192
210static void 193static void
@@ -264,9 +247,7 @@ _efl_canvas_video_efl_object_constructor(Eo *obj, Efl_Canvas_Video_Data *pd EINA
264EAPI Evas_Object * 247EAPI Evas_Object *
265emotion_object_image_get(const Evas_Object *obj) 248emotion_object_image_get(const Evas_Object *obj)
266{ 249{
267 Efl_Canvas_Video_Data *sd; 250 Efl_Canvas_Video_Data *sd = efl_data_scope_safe_get(obj, MY_CLASS);
268
269 sd = evas_object_smart_data_get(obj);
270 if (!sd) return NULL; 251 if (!sd) return NULL;
271 return sd->obj; 252 return sd->obj;
272} 253}
@@ -436,13 +417,7 @@ _efl_canvas_video_efl_file_file_set(Eo *obj EINA_UNUSED, Efl_Canvas_Video_Data *
436 if (sd->anim) ecore_animator_del(sd->anim); 417 if (sd->anim) ecore_animator_del(sd->anim);
437 sd->anim = NULL; 418 sd->anim = NULL;
438 419
439#ifdef HAVE_EIO 420 _xattr_data_cancel(sd->xattr);
440 /* Only cancel the load_xattr or we will loose ref to time_seek stringshare */
441 if (sd->load_xattr) eio_file_cancel(sd->load_xattr);
442 sd->load_xattr = NULL;
443 if (sd->save_xattr) eio_file_cancel(sd->save_xattr);
444 sd->save_xattr = NULL;
445#endif
446 421
447 return EINA_TRUE; 422 return EINA_TRUE;
448} 423}
@@ -1359,37 +1334,31 @@ emotion_object_priority_get(const Evas_Object *obj)
1359 1334
1360#ifdef HAVE_EIO 1335#ifdef HAVE_EIO
1361static void 1336static void
1362_eio_load_xattr_cleanup(Efl_Canvas_Video_Data *sd, Eio_File *handler) 1337_eio_load_xattr_cleanup(Emotion_Xattr_Data *xattr, Eio_File *handler)
1363{ 1338{
1364 if (handler == sd->load_xattr) sd->load_xattr = NULL; 1339 if (handler == xattr->load) xattr->load = NULL;
1365 1340 _xattr_data_unref(xattr);
1366 EINA_REFCOUNT_UNREF(sd)
1367 {
1368 if (sd->smartobj) evas_object_smart_data_set(sd->smartobj, NULL);
1369 sd->smartobj = NULL;
1370 _smart_data_free(sd);
1371 }
1372} 1341}
1373 1342
1374static void 1343static void
1375_eio_load_xattr_done(void *data, Eio_File *handler, double xattr_double) 1344_eio_load_xattr_done(void *data, Eio_File *handler, double xattr_double)
1376{ 1345{
1377 Efl_Canvas_Video_Data *sd = data; 1346 Emotion_Xattr_Data *xattr = data;
1378 1347
1379 emotion_object_position_set(evas_object_smart_parent_get(sd->obj), xattr_double); 1348 emotion_object_position_set(evas_object_smart_parent_get(xattr->obj_wref), xattr_double);
1380 efl_event_callback_call(evas_object_smart_parent_get(sd->obj), EFL_CANVAS_VIDEO_EVENT_POSITION_LOAD_DONE, NULL); 1349 efl_event_callback_call(evas_object_smart_parent_get(xattr->obj_wref), EFL_CANVAS_VIDEO_EVENT_POSITION_LOAD_DONE, NULL);
1381 evas_object_smart_callback_call(evas_object_smart_parent_get(sd->obj), "position_load,succeed", NULL); 1350 evas_object_smart_callback_call(evas_object_smart_parent_get(xattr->obj_wref), "position_load,succeed", NULL);
1382 _eio_load_xattr_cleanup(sd, handler); 1351 _eio_load_xattr_cleanup(xattr, handler);
1383} 1352}
1384 1353
1385static void 1354static void
1386_eio_load_xattr_error(void *data, Eio_File *handler, int err EINA_UNUSED) 1355_eio_load_xattr_error(void *data, Eio_File *handler, int err EINA_UNUSED)
1387{ 1356{
1388 Efl_Canvas_Video_Data *sd = data; 1357 Emotion_Xattr_Data *xattr = data;
1389 1358
1390 efl_event_callback_call(evas_object_smart_parent_get(sd->obj), EFL_CANVAS_VIDEO_EVENT_POSITION_LOAD_FAIL, NULL); 1359 efl_event_callback_call(evas_object_smart_parent_get(xattr->obj_wref), EFL_CANVAS_VIDEO_EVENT_POSITION_LOAD_FAIL, NULL);
1391 evas_object_smart_callback_call(evas_object_smart_parent_get(sd->obj), "position_load,failed", NULL); 1360 evas_object_smart_callback_call(evas_object_smart_parent_get(xattr->obj_wref), "position_load,failed", NULL);
1392 _eio_load_xattr_cleanup(sd, handler); 1361 _eio_load_xattr_cleanup(xattr, handler);
1393} 1362}
1394#endif 1363#endif
1395 1364
@@ -1410,15 +1379,16 @@ emotion_object_last_position_load(Evas_Object *obj)
1410 else return; 1379 else return;
1411 1380
1412#ifdef HAVE_EIO 1381#ifdef HAVE_EIO
1413 if (sd->load_xattr) return; 1382 Emotion_Xattr_Data *xattr = sd->xattr;
1414 1383
1415 EINA_REFCOUNT_REF(sd); 1384 if (xattr->load) return;
1385 EINA_REFCOUNT_REF(xattr);
1416 1386
1417 sd->load_xattr = eio_file_xattr_double_get(tmp, 1387 xattr->load = eio_file_xattr_double_get(tmp,
1418 "user.e.time_seek", 1388 "user.e.time_seek",
1419 _eio_load_xattr_done, 1389 _eio_load_xattr_done,
1420 _eio_load_xattr_error, 1390 _eio_load_xattr_error,
1421 sd); 1391 xattr);
1422#else 1392#else
1423 if (eina_xattr_double_get(tmp, "user.e.time_seek", &xattr)) 1393 if (eina_xattr_double_get(tmp, "user.e.time_seek", &xattr))
1424 { 1394 {
@@ -1436,36 +1406,30 @@ emotion_object_last_position_load(Evas_Object *obj)
1436 1406
1437#ifdef HAVE_EIO 1407#ifdef HAVE_EIO
1438static void 1408static void
1439_eio_save_xattr_cleanup(Efl_Canvas_Video_Data *sd, Eio_File *handler) 1409_eio_save_xattr_cleanup(Emotion_Xattr_Data *xattr, Eio_File *handler)
1440{ 1410{
1441 if (handler == sd->save_xattr) sd->save_xattr = NULL; 1411 if (handler == xattr->save) xattr->save = NULL;
1442 1412 _xattr_data_unref(xattr);
1443 EINA_REFCOUNT_UNREF(sd)
1444 {
1445 if (sd->smartobj) evas_object_smart_data_set(sd->smartobj, NULL);
1446 sd->smartobj = NULL;
1447 _smart_data_free(sd);
1448 }
1449} 1413}
1450 1414
1451static void 1415static void
1452_eio_save_xattr_done(void *data, Eio_File *handler) 1416_eio_save_xattr_done(void *data, Eio_File *handler)
1453{ 1417{
1454 Efl_Canvas_Video_Data *sd = data; 1418 Emotion_Xattr_Data *xattr = data;
1455 1419
1456 efl_event_callback_call(sd->obj, EFL_CANVAS_VIDEO_EVENT_POSITION_SAVE_DONE, NULL); 1420 efl_event_callback_call(xattr->obj_wref, EFL_CANVAS_VIDEO_EVENT_POSITION_SAVE_DONE, NULL);
1457 evas_object_smart_callback_call(sd->obj, "position_save,succeed", NULL); 1421 evas_object_smart_callback_call(xattr->obj_wref, "position_save,succeed", NULL);
1458 _eio_save_xattr_cleanup(sd, handler); 1422 _eio_save_xattr_cleanup(xattr, handler);
1459} 1423}
1460 1424
1461static void 1425static void
1462_eio_save_xattr_error(void *data, Eio_File *handler, int err EINA_UNUSED) 1426_eio_save_xattr_error(void *data, Eio_File *handler, int err EINA_UNUSED)
1463{ 1427{
1464 Efl_Canvas_Video_Data *sd = data; 1428 Emotion_Xattr_Data *xattr = data;
1465 1429
1466 efl_event_callback_call(sd->obj, EFL_CANVAS_VIDEO_EVENT_POSITION_SAVE_FAIL, NULL); 1430 efl_event_callback_call(xattr->obj_wref, EFL_CANVAS_VIDEO_EVENT_POSITION_SAVE_FAIL, NULL);
1467 evas_object_smart_callback_call(sd->obj, "position_save,failed", NULL); 1431 evas_object_smart_callback_call(xattr->obj_wref, "position_save,failed", NULL);
1468 _eio_save_xattr_cleanup(sd, handler); 1432 _eio_save_xattr_cleanup(xattr, handler);
1469} 1433}
1470#endif 1434#endif
1471 1435
@@ -1482,16 +1446,18 @@ emotion_object_last_position_save(Evas_Object *obj)
1482 else if (!strstr(sd->file, "://")) tmp = sd->file; 1446 else if (!strstr(sd->file, "://")) tmp = sd->file;
1483 else return; 1447 else return;
1484#ifdef HAVE_EIO 1448#ifdef HAVE_EIO
1485 if (sd->save_xattr) return; 1449 Emotion_Xattr_Data *xattr = sd->xattr;
1486 1450
1487 EINA_REFCOUNT_REF(sd); 1451 if (xattr->save) return;
1488 sd->save_xattr = eio_file_xattr_double_set(tmp, 1452 EINA_REFCOUNT_REF(xattr);
1489 "user.e.time_seek", 1453
1490 emotion_object_position_get(obj), 1454 xattr->save = eio_file_xattr_double_set(tmp,
1491 0, 1455 "user.e.time_seek",
1492 _eio_save_xattr_done, 1456 emotion_object_position_get(obj),
1493 _eio_save_xattr_error, 1457 0,
1494 sd); 1458 _eio_save_xattr_done,
1459 _eio_save_xattr_error,
1460 xattr);
1495#else 1461#else
1496 if (eina_xattr_double_set(tmp, "user.e.time_seek", emotion_object_position_get(obj), 0)) 1462 if (eina_xattr_double_set(tmp, "user.e.time_seek", emotion_object_position_get(obj), 0))
1497 { 1463 {
@@ -1933,14 +1899,13 @@ _pixels_get(void *data, Evas_Object *obj)
1933EOLIAN static void 1899EOLIAN static void
1934_efl_canvas_video_efl_canvas_group_group_add(Evas_Object *obj, Efl_Canvas_Video_Data *sd) 1900_efl_canvas_video_efl_canvas_group_group_add(Evas_Object *obj, Efl_Canvas_Video_Data *sd)
1935{ 1901{
1902 Emotion_Xattr_Data *xattr;
1936 unsigned int *pixel; 1903 unsigned int *pixel;
1937 1904
1938 /* TODO: remove legacy: emotion used to have no init, call automatically */ 1905 /* TODO: remove legacy: emotion used to have no init, call automatically */
1939 emotion_init(); 1906 emotion_init();
1940 1907
1941 EINA_REFCOUNT_INIT(sd);
1942 sd->state = EMOTION_WAKEUP; 1908 sd->state = EMOTION_WAKEUP;
1943 sd->smartobj = obj;
1944 sd->obj = evas_object_image_add(evas_object_evas_get(obj)); 1909 sd->obj = evas_object_image_add(evas_object_evas_get(obj));
1945 sd->bg = evas_object_rectangle_add(evas_object_evas_get(obj)); 1910 sd->bg = evas_object_rectangle_add(evas_object_evas_get(obj));
1946 sd->engine = eina_stringshare_add("gstreamer1"); 1911 sd->engine = eina_stringshare_add("gstreamer1");
@@ -1962,7 +1927,11 @@ _efl_canvas_video_efl_canvas_group_group_add(Evas_Object *obj, Efl_Canvas_Video_
1962 *pixel = 0xff000000; 1927 *pixel = 0xff000000;
1963 evas_object_image_data_set(obj, pixel); 1928 evas_object_image_data_set(obj, pixel);
1964 } 1929 }
1965 evas_object_smart_data_set(obj, sd); 1930
1931 xattr = calloc(1, sizeof(*xattr));
1932 EINA_REFCOUNT_INIT(xattr);
1933 efl_wref_add(obj, &xattr->obj_wref);
1934 sd->xattr = xattr;
1966} 1935}
1967 1936
1968EOLIAN static void 1937EOLIAN static void
@@ -1990,9 +1959,7 @@ _efl_canvas_video_efl_canvas_group_group_del(Evas_Object *obj EINA_UNUSED, Efl_C
1990 sd->progress.info = NULL; 1959 sd->progress.info = NULL;
1991 eina_stringshare_del(sd->ref.file); 1960 eina_stringshare_del(sd->ref.file);
1992 sd->ref.file = NULL; 1961 sd->ref.file = NULL;
1993 if (sd->smartobj) evas_object_smart_data_set(sd->smartobj, NULL); 1962 _xattr_data_unref(sd->xattr);
1994 sd->smartobj = NULL;
1995 EINA_REFCOUNT_UNREF(sd) _smart_data_free(sd);
1996 efl_canvas_group_del(efl_super(obj, MY_CLASS)); 1963 efl_canvas_group_del(efl_super(obj, MY_CLASS));
1997} 1964}
1998 1965
diff --git a/src/lib/evas/canvas/evas_object_smart.c b/src/lib/evas/canvas/evas_object_smart.c
index 19a9eeb..87af439 100644
--- a/src/lib/evas/canvas/evas_object_smart.c
+++ b/src/lib/evas/canvas/evas_object_smart.c
@@ -294,15 +294,24 @@ _efl_canvas_group_group_member_add(Eo *smart_obj, Evas_Smart_Data *o, Evas_Objec
294 if (!smart->is_frame_top && (smart->is_frame != obj->is_frame)) 294 if (!smart->is_frame_top && (smart->is_frame != obj->is_frame))
295 efl_canvas_object_is_frame_object_set(eo_obj, smart->is_frame); 295 efl_canvas_object_is_frame_object_set(eo_obj, smart->is_frame);
296 296
297 if (o->clipped && o->constructed) 297 if (o->clipped)
298 { 298 {
299 Evas_Object *clipper = _smart_clipper_get(o); 299 Evas_Object *clipper = _smart_clipper_get(o);
300 Eina_Bool had_clippees = efl_canvas_object_clipees_has(clipper); 300 Eina_Bool had_clippees = efl_canvas_object_clipees_has(clipper);
301 301
302 EINA_SAFETY_ON_NULL_RETURN(clipper); 302 if (EINA_UNLIKELY(!clipper && !o->constructed))
303 efl_canvas_object_clip_set(eo_obj, clipper); 303 {
304 if (!had_clippees && smart->cur->visible) 304 _evas_object_smart_clipped_init(smart_obj);
305 efl_gfx_visible_set(clipper, 1); 305 clipper = _smart_clipper_get(o);
306 }
307
308 if (clipper != eo_obj)
309 {
310 EINA_SAFETY_ON_NULL_RETURN(clipper);
311 efl_canvas_object_clip_set(eo_obj, clipper);
312 if (!had_clippees && smart->cur->visible)
313 efl_gfx_visible_set(clipper, 1);
314 }
306 } 315 }
307 316
308 evas_object_change(eo_obj, obj); 317 evas_object_change(eo_obj, obj);
@@ -675,7 +684,7 @@ _efl_canvas_group_efl_object_constructor(Eo *eo_obj, Evas_Smart_Data *sd)
675 obj->is_smart = EINA_TRUE; 684 obj->is_smart = EINA_TRUE;
676 obj->func = &object_func; 685 obj->func = &object_func;
677 obj->private_data = efl_data_ref(eo_obj, MY_CLASS); 686 obj->private_data = efl_data_ref(eo_obj, MY_CLASS);
678 if (sd->clipped) 687 if (sd->clipped && !sd->data)
679 _evas_object_smart_clipped_init(eo_obj); 688 _evas_object_smart_clipped_init(eo_obj);
680 689
681 efl_canvas_object_type_set(eo_obj, MY_CLASS_NAME_LEGACY); 690 efl_canvas_object_type_set(eo_obj, MY_CLASS_NAME_LEGACY);
@@ -771,23 +780,23 @@ _evas_object_smart_clipped_init(Evas_Object *eo_obj)
771 if (!cso) 780 if (!cso)
772 { 781 {
773 cso = calloc(1, sizeof(*cso)); 782 cso = calloc(1, sizeof(*cso));
783 o->data = cso;
774 o->data_nofree = EINA_FALSE; 784 o->data_nofree = EINA_FALSE;
775 } 785 }
776 786
777 cso->evas = evas_object_evas_get(eo_obj); 787 cso->evas = evas_object_evas_get(eo_obj);
778 clipper = evas_object_rectangle_add(cso->evas); 788 clipper = evas_object_rectangle_add(cso->evas);
779 evas_object_static_clip_set(clipper, 1); 789 evas_object_static_clip_set(clipper, 1);
780 cso->clipper = NULL;
781 evas_object_smart_member_add(clipper, eo_obj);
782 cso->clipper = clipper; 790 cso->clipper = clipper;
791 o->clipped = 0;
792 evas_object_smart_member_add(clipper, eo_obj);
793 o->clipped = 1;
783 evas_object_color_set(cso->clipper, 255, 255, 255, 255); 794 evas_object_color_set(cso->clipper, 255, 255, 255, 255);
784 evas_object_move(cso->clipper, -100000, -100000); 795 evas_object_move(cso->clipper, -100000, -100000);
785 evas_object_resize(cso->clipper, 200000, 200000); 796 evas_object_resize(cso->clipper, 200000, 200000);
786 evas_object_pass_events_set(cso->clipper, 1); 797 evas_object_pass_events_set(cso->clipper, 1);
787 evas_object_hide(cso->clipper); /* show when have something clipped to it */ 798 evas_object_hide(cso->clipper); /* show when have something clipped to it */
788 efl_canvas_object_no_render_set(cso->clipper, 1); 799 efl_canvas_object_no_render_set(cso->clipper, 1);
789
790 evas_object_smart_data_set(eo_obj, cso);
791} 800}
792 801
793EOLIAN static void 802EOLIAN static void
diff --git a/src/lib/evas/canvas/evas_object_smart_clipped.c b/src/lib/evas/canvas/evas_object_smart_clipped.c
index f023045..60cdc78 100644
--- a/src/lib/evas/canvas/evas_object_smart_clipped.c
+++ b/src/lib/evas/canvas/evas_object_smart_clipped.c
@@ -29,14 +29,8 @@ evas_object_smart_clipped_smart_del(Evas_Object *eo_obj)
29{ 29{
30 CSO_DATA_GET_OR_RETURN(eo_obj, cso); 30 CSO_DATA_GET_OR_RETURN(eo_obj, cso);
31 31
32 if (cso->clipper)
33 {
34 Evas_Object *clipper = cso->clipper;
35 cso->clipper = NULL;
36 evas_object_del(clipper);
37 }
38
39 _efl_canvas_group_group_members_all_del(eo_obj); 32 _efl_canvas_group_group_members_all_del(eo_obj);
33 cso->clipper = NULL;
40} 34}
41 35
42static void 36static void