move around - flatter.
[profile/ivi/evas.git] / src / lib / canvas / evas_object_intercept.c
1 #include "evas_common.h"
2 #include "evas_private.h"
3
4 /* local calls */
5
6 static void evas_object_intercept_init(Evas_Object *obj);
7 static void evas_object_intercept_deinit(Evas_Object *obj);
8
9 static void
10 evas_object_intercept_init(Evas_Object *obj)
11 {
12    /* MEM OK */
13    if (!obj->interceptors)
14      obj->interceptors = evas_mem_calloc(sizeof(Evas_Intercept_Func));
15 }
16
17 static void
18 evas_object_intercept_deinit(Evas_Object *obj)
19 {
20    /* MEM OK */
21    if (!obj->interceptors) return;
22    if ((obj->interceptors->show.func) ||
23        (obj->interceptors->hide.func) ||
24        (obj->interceptors->move.func) ||
25        (obj->interceptors->resize.func) ||
26        (obj->interceptors->raise.func) ||
27        (obj->interceptors->lower.func) ||
28        (obj->interceptors->stack_above.func) ||
29        (obj->interceptors->stack_below.func) ||
30        (obj->interceptors->layer_set.func) ||
31        (obj->interceptors->color_set.func) ||
32        (obj->interceptors->clip_set.func) ||
33        (obj->interceptors->clip_unset.func))
34      return;
35    free(obj->interceptors);
36    obj->interceptors = NULL;
37 }
38
39 /* private calls */
40
41 void
42 evas_object_intercept_cleanup(Evas_Object *obj)
43 {
44    /* MEM OK */
45    if (obj->interceptors) free(obj->interceptors);
46 }
47
48 int
49 evas_object_intercept_call_show(Evas_Object *obj)
50 {
51    /* MEM OK */
52    int ret;
53
54    if (!obj->interceptors) return 0;
55    if (obj->intercepted) return 0;
56    obj->intercepted = 1;
57    ret = ((obj->interceptors->show.func) != NULL);
58    if (obj->interceptors->show.func)
59      obj->interceptors->show.func(obj->interceptors->show.data, obj);
60    obj->intercepted = 0;
61    return ret;
62 }
63
64 int
65 evas_object_intercept_call_hide(Evas_Object *obj)
66 {
67    /* MEM OK */
68    int ret;
69
70    if (!obj->interceptors) return 0;
71    if (obj->intercepted) return 0;
72    obj->intercepted = 1;
73    ret = ((obj->interceptors->hide.func) != NULL);
74    if (obj->interceptors->hide.func)
75      obj->interceptors->hide.func(obj->interceptors->hide.data, obj);
76    obj->intercepted = 0;
77    return ret;
78 }
79
80 int
81 evas_object_intercept_call_move(Evas_Object *obj, Evas_Coord x, Evas_Coord y)
82 {
83    /* MEM OK */
84    int ret;
85
86    if (!obj->interceptors) return 0;
87    if (obj->intercepted) return 0;
88    obj->intercepted = 1;
89    ret = ((obj->interceptors->move.func) != NULL);
90    if (obj->interceptors->move.func)
91      obj->interceptors->move.func(obj->interceptors->move.data, obj, x, y);
92    obj->intercepted = 0;
93    return ret;
94 }
95
96 int
97 evas_object_intercept_call_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h)
98 {
99    /* MEM OK */
100    int ret;
101
102    if (!obj->interceptors) return 0;
103    if (obj->intercepted) return 0;
104    obj->intercepted = 1;
105    ret = ((obj->interceptors->resize.func) != NULL);
106    if (obj->interceptors->resize.func)
107      obj->interceptors->resize.func(obj->interceptors->resize.data, obj, w, h);
108    obj->intercepted = 0;
109    return ret;
110 }
111
112 int
113 evas_object_intercept_call_raise(Evas_Object *obj)
114 {
115    /* MEM OK */
116    int ret;
117
118    if (!obj->interceptors) return 0;
119    if (obj->intercepted) return 0;
120    obj->intercepted = 1;
121    ret = ((obj->interceptors->raise.func) != NULL);
122    if (obj->interceptors->raise.func)
123      obj->interceptors->raise.func(obj->interceptors->raise.data, obj);
124    obj->intercepted = 0;
125    return ret;
126 }
127
128 int
129 evas_object_intercept_call_lower(Evas_Object *obj)
130 {
131    /* MEM OK */
132    int ret;
133
134    if (!obj->interceptors) return 0;
135    if (obj->intercepted) return 0;
136    obj->intercepted = 1;
137    ret = ((obj->interceptors->lower.func) != NULL);
138    if (obj->interceptors->lower.func)
139      obj->interceptors->lower.func(obj->interceptors->lower.data, obj);
140    obj->intercepted = 0;
141    return ret;
142 }
143
144 int
145 evas_object_intercept_call_stack_above(Evas_Object *obj, Evas_Object *above)
146 {
147    /* MEM OK */
148    int ret;
149
150    if (!obj->interceptors) return 0;
151    if (obj->intercepted) return 0;
152    obj->intercepted = 1;
153    ret = ((obj->interceptors->stack_above.func) != NULL);
154    if (obj->interceptors->stack_above.func)
155      obj->interceptors->stack_above.func(obj->interceptors->stack_above.data, obj, above);
156    obj->intercepted = 0;
157    return ret;
158 }
159
160 int
161 evas_object_intercept_call_stack_below(Evas_Object *obj, Evas_Object *below)
162 {
163    /* MEM OK */
164    int ret;
165
166    if (!obj->interceptors) return 0;
167    if (obj->intercepted) return 0;
168    obj->intercepted = 1;
169    ret = ((obj->interceptors->stack_below.func) != NULL);
170    if (obj->interceptors->stack_below.func)
171      obj->interceptors->stack_below.func(obj->interceptors->stack_below.data, obj, below);
172    obj->intercepted = 0;
173    return ret;
174 }
175
176 int
177 evas_object_intercept_call_layer_set(Evas_Object *obj, int l)
178 {
179    /* MEM OK */
180    int ret;
181
182    if (!obj->interceptors) return 0;
183    if (obj->intercepted) return 0;
184    obj->intercepted = 1;
185    ret = ((obj->interceptors->layer_set.func) != NULL);
186    if (obj->interceptors->layer_set.func)
187      obj->interceptors->layer_set.func(obj->interceptors->layer_set.data, obj, l);
188    obj->intercepted = 0;
189    return ret;
190 }
191
192 int
193 evas_object_intercept_call_color_set(Evas_Object *obj, int r, int g, int b, int a)
194 {
195    /* MEM OK */
196    int ret;
197
198    if (!obj->interceptors) return 0;
199    if (obj->intercepted) return 0;
200    obj->intercepted = 1;
201    ret = ((obj->interceptors->color_set.func) != NULL);
202    if (obj->interceptors->color_set.func)
203      obj->interceptors->color_set.func(obj->interceptors->color_set.data, obj, r, g, b, a);
204    obj->intercepted = 0;
205    return ret;
206 }
207
208 int
209 evas_object_intercept_call_clip_set(Evas_Object *obj, Evas_Object *clip)
210 {
211    /* MEM OK */
212    int ret;
213
214    if (!obj->interceptors) return 0;
215    if (obj->intercepted) return 0;
216    obj->intercepted = 1;
217    ret = ((obj->interceptors->clip_set.func) != NULL);
218    if (obj->interceptors->clip_set.func)
219      obj->interceptors->clip_set.func(obj->interceptors->clip_set.data, obj, clip);
220    obj->intercepted = 0;
221    return ret;
222 }
223
224 int
225 evas_object_intercept_call_clip_unset(Evas_Object *obj)
226 {
227    /* MEM OK */
228    int ret;
229
230    if (!obj->interceptors) return 0;
231    if (obj->intercepted) return 0;
232    obj->intercepted = 1;
233    ret = ((obj->interceptors->clip_unset.func) != NULL);
234    if (obj->interceptors->clip_unset.func)
235      obj->interceptors->clip_unset.func(obj->interceptors->clip_unset.data, obj);
236    obj->intercepted = 0;
237    return ret;
238 }
239
240 /* public calls */
241
242 /**
243  * To be documented.
244  *
245  * FIXME: To be fixed.
246  *
247  */
248 EAPI void
249 evas_object_intercept_show_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), const void *data)
250 {
251    /* MEM OK */
252
253    MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
254    return;
255    MAGIC_CHECK_END();
256    if (!func) return;
257    evas_object_intercept_init(obj);
258    if (!obj->interceptors) return;
259    obj->interceptors->show.func = func;
260    obj->interceptors->show.data = (void *)data;
261 }
262
263 /**
264  * To be documented.
265  *
266  * FIXME: To be fixed.
267  *
268  */
269 EAPI void *
270 evas_object_intercept_show_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj))
271 {
272    /* MEM OK */
273    void *data;
274
275    MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
276    return NULL;
277    MAGIC_CHECK_END();
278    if (!func) return NULL;
279    if (!obj->interceptors) return NULL;
280    obj->interceptors->show.func = NULL;
281    data = obj->interceptors->show.data;
282    obj->interceptors->show.data = NULL;
283    evas_object_intercept_deinit(obj);
284    return data;
285 }
286
287 /**
288  * To be documented.
289  *
290  * FIXME: To be fixed.
291  *
292  */
293 EAPI void
294 evas_object_intercept_hide_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), const void *data)
295 {
296    /* MEM OK */
297    MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
298    return;
299    MAGIC_CHECK_END();
300    if (!func) return;
301    evas_object_intercept_init(obj);
302    if (!obj->interceptors) return;
303    obj->interceptors->hide.func = func;
304    obj->interceptors->hide.data = (void *)data;
305 }
306
307 /**
308  * To be documented.
309  *
310  * FIXME: To be fixed.
311  *
312  */
313 EAPI void *
314 evas_object_intercept_hide_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj))
315 {
316    /* MEM OK */
317    void *data;
318
319    MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
320    return NULL;
321    MAGIC_CHECK_END();
322    if (!func) return NULL;
323    if (!obj->interceptors) return NULL;
324    obj->interceptors->hide.func = NULL;
325    data = obj->interceptors->hide.data;
326    obj->interceptors->hide.data = NULL;
327    evas_object_intercept_deinit(obj);
328    return data;
329 }
330
331 /**
332  * To be documented.
333  *
334  * FIXME: To be fixed.
335  *
336  */
337 EAPI void
338 evas_object_intercept_move_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Coord x, Evas_Coord y), const void *data)
339 {
340    /* MEM OK */
341    MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
342    return;
343    MAGIC_CHECK_END();
344    if (!func) return;
345    evas_object_intercept_init(obj);
346    if (!obj->interceptors) return;
347    obj->interceptors->move.func = func;
348    obj->interceptors->move.data = (void *)data;
349 }
350
351 /**
352  * To be documented.
353  *
354  * FIXME: To be fixed.
355  *
356  */
357 EAPI void *
358 evas_object_intercept_move_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Coord x, Evas_Coord y))
359 {
360    /* MEM OK */
361    void *data;
362
363    MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
364    return NULL;
365    MAGIC_CHECK_END();
366    if (!func) return NULL;
367    if (!obj->interceptors) return NULL;
368    obj->interceptors->move.func = NULL;
369    data = obj->interceptors->move.data;
370    obj->interceptors->move.data = NULL;
371    evas_object_intercept_deinit(obj);
372    return data;
373 }
374
375 /**
376  * To be documented.
377  *
378  * FIXME: To be fixed.
379  *
380  */
381 EAPI void
382 evas_object_intercept_resize_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Coord w, Evas_Coord h), const void *data)
383 {
384    /* MEM OK */
385    MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
386    return;
387    MAGIC_CHECK_END();
388    if (!func) return;
389    evas_object_intercept_init(obj);
390    if (!obj->interceptors) return;
391    obj->interceptors->resize.func = func;
392    obj->interceptors->resize.data = (void *)data;
393 }
394
395 /**
396  * To be documented.
397  *
398  * FIXME: To be fixed.
399  *
400  */
401 EAPI void *
402 evas_object_intercept_resize_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Coord w, Evas_Coord h))
403 {
404    /* MEM OK */
405    void *data;
406
407    MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
408    return NULL;
409    MAGIC_CHECK_END();
410    if (!func) return NULL;
411    if (!obj->interceptors) return NULL;
412    obj->interceptors->resize.func = NULL;
413    data = obj->interceptors->resize.data;
414    obj->interceptors->resize.data = NULL;
415    evas_object_intercept_deinit(obj);
416    return data;
417 }
418
419 /**
420  * To be documented.
421  *
422  * FIXME: To be fixed.
423  *
424  */
425 EAPI void
426 evas_object_intercept_raise_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), const void *data)
427 {
428    /* MEM OK */
429    MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
430    return;
431    MAGIC_CHECK_END();
432    if (!func) return;
433    evas_object_intercept_init(obj);
434    if (!obj->interceptors) return;
435    obj->interceptors->raise.func = func;
436    obj->interceptors->raise.data = (void *)data;
437 }
438
439 /**
440  * To be documented.
441  *
442  * FIXME: To be fixed.
443  *
444  */
445 EAPI void *
446 evas_object_intercept_raise_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj))
447 {
448    /* MEM OK */
449    void *data;
450
451    MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
452    return NULL;
453    MAGIC_CHECK_END();
454    if (!func) return NULL;
455    if (!obj->interceptors) return NULL;
456    obj->interceptors->raise.func = NULL;
457    data = obj->interceptors->raise.data;
458    obj->interceptors->raise.data = NULL;
459    evas_object_intercept_deinit(obj);
460    return data;
461 }
462
463 /**
464  * To be documented.
465  *
466  * FIXME: To be fixed.
467  *
468  */
469 EAPI void
470 evas_object_intercept_lower_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), const void *data)
471 {
472    /* MEM OK */
473    MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
474    return;
475    MAGIC_CHECK_END();
476    if (!func) return;
477    evas_object_intercept_init(obj);
478    if (!obj->interceptors) return;
479    obj->interceptors->lower.func = func;
480    obj->interceptors->lower.data = (void *)data;
481 }
482
483 /**
484  * To be documented.
485  *
486  * FIXME: To be fixed.
487  *
488  */
489 EAPI void *
490 evas_object_intercept_lower_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj))
491 {
492    /* MEM OK */
493    void *data;
494
495    MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
496    return NULL;
497    MAGIC_CHECK_END();
498    if (!func) return NULL;
499    if (!obj->interceptors) return NULL;
500    obj->interceptors->lower.func = NULL;
501    data = obj->interceptors->lower.data;
502    obj->interceptors->lower.data = NULL;
503    evas_object_intercept_deinit(obj);
504    return data;
505 }
506
507 /**
508  * To be documented.
509  *
510  * FIXME: To be fixed.
511  *
512  */
513 EAPI void
514 evas_object_intercept_stack_above_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Object *above), const void *data)
515 {
516    /* MEM OK */
517    MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
518    return;
519    MAGIC_CHECK_END();
520    if (!func) return;
521    evas_object_intercept_init(obj);
522    if (!obj->interceptors) return;
523    obj->interceptors->stack_above.func = func;
524    obj->interceptors->stack_above.data = (void *)data;
525 }
526
527 /**
528  * To be documented.
529  *
530  * FIXME: To be fixed.
531  *
532  */
533 EAPI void *
534 evas_object_intercept_stack_above_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Object *above))
535 {
536    /* MEM OK */
537    void *data;
538
539    MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
540    return NULL;
541    MAGIC_CHECK_END();
542    if (!func) return NULL;
543    if (!obj->interceptors) return NULL;
544    obj->interceptors->stack_above.func = NULL;
545    data = obj->interceptors->stack_above.data;
546    obj->interceptors->stack_above.data = NULL;
547    evas_object_intercept_deinit(obj);
548    return data;
549 }
550
551 /**
552  * To be documented.
553  *
554  * FIXME: To be fixed.
555  *
556  */
557 EAPI void
558 evas_object_intercept_stack_below_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Object *below), const void *data)
559 {
560    /* MEM OK */
561    MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
562    return;
563    MAGIC_CHECK_END();
564    if (!func) return;
565    evas_object_intercept_init(obj);
566    if (!obj->interceptors) return;
567    obj->interceptors->stack_below.func = func;
568    obj->interceptors->stack_below.data = (void *)data;
569 }
570
571 /**
572  * To be documented.
573  *
574  * FIXME: To be fixed.
575  *
576  */
577 EAPI void *
578 evas_object_intercept_stack_below_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Object *below))
579 {
580    /* MEM OK */
581    void *data;
582
583    MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
584    return NULL;
585    MAGIC_CHECK_END();
586    if (!func) return NULL;
587    if (!obj->interceptors) return NULL;
588    obj->interceptors->stack_below.func = NULL;
589    data = obj->interceptors->stack_below.data;
590    obj->interceptors->stack_below.data = NULL;
591    evas_object_intercept_deinit(obj);
592    return data;
593 }
594
595 /**
596  * To be documented.
597  *
598  * FIXME: To be fixed.
599  *
600  */
601 EAPI void
602 evas_object_intercept_layer_set_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, int l), const void *data)
603 {
604    /* MEM OK */
605    MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
606    return;
607    MAGIC_CHECK_END();
608    if (!func) return;
609    evas_object_intercept_init(obj);
610    if (!obj->interceptors) return;
611    obj->interceptors->layer_set.func = func;
612    obj->interceptors->layer_set.data = (void *)data;
613 }
614
615 /**
616  * To be documented.
617  *
618  * FIXME: To be fixed.
619  *
620  */
621 EAPI void *
622 evas_object_intercept_layer_set_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, int l))
623 {
624    /* MEM OK */
625    void *data;
626
627    MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
628    return NULL;
629    MAGIC_CHECK_END();
630    if (!func) return NULL;
631    if (!obj->interceptors) return NULL;
632    obj->interceptors->layer_set.func = NULL;
633    data = obj->interceptors->layer_set.data;
634    obj->interceptors->layer_set.data = NULL;
635    evas_object_intercept_deinit(obj);
636    return data;
637 }
638
639 /**
640  * To be documented.
641  *
642  * FIXME: To be fixed.
643  *
644  */
645 EAPI void
646 evas_object_intercept_color_set_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, int r, int g, int b, int a), const void *data)
647 {
648    /* MEM OK */
649    MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
650    return;
651    MAGIC_CHECK_END();
652    if (!func) return;
653    evas_object_intercept_init(obj);
654    if (!obj->interceptors) return;
655    obj->interceptors->color_set.func = func;
656    obj->interceptors->color_set.data = (void *)data;
657 }
658
659 /**
660  * To be documented.
661  *
662  * FIXME: To be fixed.
663  *
664  */
665 EAPI void *
666 evas_object_intercept_color_set_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, int r, int g, int b, int a))
667 {
668    /* MEM OK */
669    void *data;
670
671    MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
672    return NULL;
673    MAGIC_CHECK_END();
674    if (!func) return NULL;
675    if (!obj->interceptors) return NULL;
676    obj->interceptors->color_set.func = NULL;
677    data = obj->interceptors->color_set.data;
678    obj->interceptors->color_set.data = NULL;
679    evas_object_intercept_deinit(obj);
680    return data;
681 }
682
683 /**
684  * To be documented.
685  *
686  * FIXME: To be fixed.
687  *
688  */
689 EAPI void
690 evas_object_intercept_clip_set_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Object *clip), const void *data)
691 {
692    /* MEM OK */
693    MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
694    return;
695    MAGIC_CHECK_END();
696    if (!func) return;
697    evas_object_intercept_init(obj);
698    if (!obj->interceptors) return;
699    obj->interceptors->clip_set.func = func;
700    obj->interceptors->clip_set.data = (void *)data;
701 }
702
703 /**
704  * To be documented.
705  *
706  * FIXME: To be fixed.
707  *
708  */
709 EAPI void *
710 evas_object_intercept_clip_set_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Object *clip))
711 {
712    /* MEM OK */
713    void *data;
714
715    MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
716    return NULL;
717    MAGIC_CHECK_END();
718    if (!func) return NULL;
719    if (!obj->interceptors) return NULL;
720    obj->interceptors->clip_set.func = NULL;
721    data = obj->interceptors->clip_set.data;
722    obj->interceptors->clip_set.data = NULL;
723    evas_object_intercept_deinit(obj);
724    return data;
725 }
726
727 /**
728  * To be documented.
729  *
730  * FIXME: To be fixed.
731  *
732  */
733 EAPI void
734 evas_object_intercept_clip_unset_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), const void *data)
735 {
736    /* MEM OK */
737    MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
738    return;
739    MAGIC_CHECK_END();
740    if (!func) return;
741    evas_object_intercept_init(obj);
742    if (!obj->interceptors) return;
743    obj->interceptors->clip_unset.func = func;
744    obj->interceptors->clip_unset.data = (void *)data;
745 }
746
747 /**
748  * To be documented.
749  *
750  * FIXME: To be fixed.
751  *
752  */
753 EAPI void *
754 evas_object_intercept_clip_unset_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj))
755 {
756    /* MEM OK */
757    void *data;
758
759    MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
760    return NULL;
761    MAGIC_CHECK_END();
762    if (!func) return NULL;
763    if (!obj->interceptors) return NULL;
764    obj->interceptors->clip_unset.func = NULL;
765    data = obj->interceptors->clip_unset.data;
766    obj->interceptors->clip_unset.data = NULL;
767    evas_object_intercept_deinit(obj);
768    return data;
769 }