1 #include "evas_common.h"
2 #include "evas_private.h"
4 typedef struct _Evas_Object_Smart Evas_Object_Smart;
5 typedef struct _Evas_Smart_Callback Evas_Smart_Callback;
7 struct _Evas_Object_Smart
13 Eina_Inlist *contained;
14 Evas_Smart_Cb_Description_Array callbacks_descriptions;
16 Eina_Bool deletions_waiting : 1;
17 Eina_Bool need_recalculate : 1;
20 struct _Evas_Smart_Callback
25 Evas_Callback_Priority priority;
29 /* private methods for smart objects */
30 static void evas_object_smart_callbacks_clear(Evas_Object *obj);
31 static void evas_object_smart_init(Evas_Object *obj);
32 static void *evas_object_smart_new(void);
33 static void evas_object_smart_render(Evas_Object *obj, void *output, void *context, void *surface, int x, int y);
34 static void evas_object_smart_free(Evas_Object *obj);
35 static void evas_object_smart_render_pre(Evas_Object *obj);
36 static void evas_object_smart_render_post(Evas_Object *obj);
38 static unsigned int evas_object_smart_id_get(Evas_Object *obj);
39 static unsigned int evas_object_smart_visual_id_get(Evas_Object *obj);
40 static void *evas_object_smart_engine_data_get(Evas_Object *obj);
42 static const Evas_Object_Func object_func =
44 /* methods (compulsory) */
45 evas_object_smart_free,
46 evas_object_smart_render,
47 evas_object_smart_render_pre,
48 evas_object_smart_render_post,
49 evas_object_smart_id_get,
50 evas_object_smart_visual_id_get,
51 evas_object_smart_engine_data_get,
52 /* these are optional. NULL = nothing */
68 EVAS_MEMPOOL(_mp_obj);
73 evas_object_smart_data_set(Evas_Object *obj, void *data)
77 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
80 o = (Evas_Object_Smart *)(obj->object_data);
81 MAGIC_CHECK(o, Evas_Object_Smart, MAGIC_OBJ_SMART);
88 evas_object_smart_data_get(const Evas_Object *obj)
92 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
95 o = (Evas_Object_Smart *)(obj->object_data);
101 evas_object_smart_smart_get(const Evas_Object *obj)
103 Evas_Object_Smart *o;
105 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
108 o = (Evas_Object_Smart *)(obj->object_data);
109 MAGIC_CHECK(o, Evas_Object_Smart, MAGIC_OBJ_SMART);
112 return obj->smart.smart;
116 evas_object_smart_member_add(Evas_Object *obj, Evas_Object *smart_obj)
118 Evas_Object_Smart *o;
120 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
123 MAGIC_CHECK(smart_obj, Evas_Object, MAGIC_OBJ);
126 o = (Evas_Object_Smart *)(smart_obj->object_data);
127 MAGIC_CHECK(o, Evas_Object_Smart, MAGIC_OBJ_SMART);
133 CRIT("Adding deleted object %p to smart obj %p", obj, smart_obj);
137 if (smart_obj->delete_me)
139 CRIT("Adding object %p to deleted smart obj %p", obj, smart_obj);
143 if (!smart_obj->layer)
145 CRIT("No evas surface associated with smart object (%p)", smart_obj);
149 if ((obj->layer && smart_obj->layer) &&
150 (obj->layer->evas != smart_obj->layer->evas))
152 CRIT("Adding object %p from Evas (%p) from another Evas (%p)", obj, obj->layer->evas, smart_obj->layer->evas);
157 if (obj->smart.parent == smart_obj) return;
159 if (obj->smart.parent) evas_object_smart_member_del(obj);
161 evas_object_release(obj, 1);
162 obj->layer = smart_obj->layer;
163 obj->cur.layer = obj->layer->layer;
165 obj->smart.parent = smart_obj;
166 o->contained = eina_inlist_append(o->contained, EINA_INLIST_GET(obj));
167 evas_object_smart_member_cache_invalidate(obj, EINA_TRUE, EINA_TRUE);
169 evas_object_change(obj);
170 evas_object_mapped_clip_across_mark(obj);
171 if (smart_obj->smart.smart->smart_class->member_add)
172 smart_obj->smart.smart->smart_class->member_add(smart_obj, obj);
176 evas_object_smart_member_del(Evas_Object *obj)
178 Evas_Object_Smart *o;
179 Evas_Object *smart_obj;
181 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
185 if (!obj->smart.parent) return;
187 smart_obj = obj->smart.parent;
188 if (smart_obj->smart.smart->smart_class->member_del)
189 smart_obj->smart.smart->smart_class->member_del(smart_obj, obj);
191 o = (Evas_Object_Smart *)(obj->smart.parent->object_data);
192 o->contained = eina_inlist_remove(o->contained, EINA_INLIST_GET(obj));
193 obj->smart.parent = NULL;
194 evas_object_smart_member_cache_invalidate(obj, EINA_TRUE, EINA_TRUE);
196 obj->cur.layer = obj->layer->layer;
197 evas_object_inject(obj, obj->layer->evas);
199 evas_object_change(obj);
200 evas_object_mapped_clip_across_mark(obj);
204 evas_object_smart_parent_get(const Evas_Object *obj)
206 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
210 return obj->smart.parent;
214 evas_object_smart_type_check(const Evas_Object *obj, const char *type)
216 const Evas_Smart_Class *sc;
218 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
222 if (!obj->smart.smart)
224 sc = obj->smart.smart->smart_class;
227 if (!strcmp(sc->name, type))
236 evas_object_smart_type_check_ptr(const Evas_Object *obj, const char *type)
238 const Evas_Smart_Class *sc;
240 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
244 if (!obj->smart.smart)
246 sc = obj->smart.smart->smart_class;
249 if (sc->name == type)
258 evas_object_smart_members_get(const Evas_Object *obj)
260 Evas_Object_Smart *o;
264 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
267 o = (Evas_Object_Smart *)(obj->object_data);
268 MAGIC_CHECK(o, Evas_Object_Smart, MAGIC_OBJ_SMART);
273 for (member = o->contained; member; member = member->next)
274 members = eina_list_append(members, member);
280 evas_object_smart_members_get_direct(const Evas_Object *obj)
282 Evas_Object_Smart *o;
284 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
287 o = (Evas_Object_Smart *)(obj->object_data);
288 MAGIC_CHECK(o, Evas_Object_Smart, MAGIC_OBJ_SMART);
295 _evas_object_smart_members_all_del(Evas_Object *obj)
297 Evas_Object_Smart *o = (Evas_Object_Smart *)(obj->object_data);
299 evas_object_del((Evas_Object *)(o->contained));
303 evas_object_smart_add(Evas *e, Evas_Smart *s)
307 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
310 MAGIC_CHECK(s, Evas_Smart, MAGIC_SMART);
314 obj = evas_object_new(e);
315 if (!obj) return NULL;
316 obj->smart.smart = s;
317 obj->type = s->smart_class->name;
318 evas_object_smart_init(obj);
319 evas_object_inject(obj, e);
321 evas_object_smart_use(s);
323 if (s->smart_class->add) s->smart_class->add(obj);
329 _callback_priority_cmp(const void *_a, const void *_b)
331 const Evas_Smart_Callback *a, *b;
332 a = (const Evas_Smart_Callback *) _a;
333 b = (const Evas_Smart_Callback *) _b;
334 if (a->priority < b->priority)
341 evas_object_smart_callback_add(Evas_Object *obj, const char *event, Evas_Smart_Cb func, const void *data)
343 evas_object_smart_callback_priority_add(obj, event,
344 EVAS_CALLBACK_PRIORITY_DEFAULT, func, data);
348 evas_object_smart_callback_priority_add(Evas_Object *obj, const char *event, Evas_Callback_Priority priority, Evas_Smart_Cb func, const void *data)
350 Evas_Object_Smart *o;
351 Evas_Smart_Callback *cb;
353 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
356 o = (Evas_Object_Smart *)(obj->object_data);
357 MAGIC_CHECK(o, Evas_Object_Smart, MAGIC_OBJ_SMART);
362 EVAS_MEMPOOL_INIT(_mp_cb, "evas_smart_callback", Evas_Smart_Callback, 512, );
363 cb = EVAS_MEMPOOL_ALLOC(_mp_cb, Evas_Smart_Callback);
365 EVAS_MEMPOOL_PREP(_mp_cb, cb, Evas_Smart_Callback);
366 cb->event = eina_stringshare_add(event);
368 cb->func_data = (void *)data;
369 cb->priority = priority;
370 o->callbacks = eina_list_sorted_insert(o->callbacks, _callback_priority_cmp,
375 evas_object_smart_callback_del(Evas_Object *obj, const char *event, Evas_Smart_Cb func)
377 Evas_Object_Smart *o;
379 Evas_Smart_Callback *cb;
381 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
384 o = (Evas_Object_Smart *)(obj->object_data);
385 MAGIC_CHECK(o, Evas_Object_Smart, MAGIC_OBJ_SMART);
388 if (!event) return NULL;
389 EINA_LIST_FOREACH(o->callbacks, l, cb)
391 if ((!strcmp(cb->event, event)) && (cb->func == func))
395 data = cb->func_data;
397 o->deletions_waiting = 1;
398 evas_object_smart_callbacks_clear(obj);
406 evas_object_smart_callback_del_full(Evas_Object *obj, const char *event, Evas_Smart_Cb func, const void *data)
408 Evas_Object_Smart *o;
410 Evas_Smart_Callback *cb;
412 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
415 o = (Evas_Object_Smart *)(obj->object_data);
416 MAGIC_CHECK(o, Evas_Object_Smart, MAGIC_OBJ_SMART);
419 if (!event) return NULL;
420 EINA_LIST_FOREACH(o->callbacks, l, cb)
422 if ((!strcmp(cb->event, event)) && (cb->func == func) && (cb->func_data == data))
428 o->deletions_waiting = 1;
429 evas_object_smart_callbacks_clear(obj);
437 evas_object_smart_callback_call(Evas_Object *obj, const char *event, void *event_info)
439 Evas_Object_Smart *o;
441 Evas_Smart_Callback *cb;
442 const char *strshare;
444 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
447 o = (Evas_Object_Smart *)(obj->object_data);
448 MAGIC_CHECK(o, Evas_Object_Smart, MAGIC_OBJ_SMART);
452 if (obj->delete_me) return;
454 strshare = eina_stringshare_add(event);
455 EINA_LIST_FOREACH(o->callbacks, l, cb)
459 if (cb->event == strshare)
460 cb->func(cb->func_data, obj, event_info);
465 eina_stringshare_del(strshare);
467 evas_object_smart_callbacks_clear(obj);
471 evas_object_smart_callbacks_descriptions_set(Evas_Object *obj, const Evas_Smart_Cb_Description *descriptions)
473 const Evas_Smart_Cb_Description *d;
474 Evas_Object_Smart *o;
475 unsigned int i, count = 0;
477 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
480 o = (Evas_Object_Smart *)(obj->object_data);
481 MAGIC_CHECK(o, Evas_Object_Smart, MAGIC_OBJ_SMART);
485 if ((!descriptions) || (!descriptions->name))
487 evas_smart_cb_descriptions_resize(&o->callbacks_descriptions, 0);
491 for (count = 0, d = descriptions; d->name; d++)
494 evas_smart_cb_descriptions_resize(&o->callbacks_descriptions, count);
495 if (count == 0) return EINA_TRUE;
497 for (i = 0, d = descriptions; i < count; d++, i++)
498 o->callbacks_descriptions.array[i] = d;
500 evas_smart_cb_descriptions_fix(&o->callbacks_descriptions);
506 evas_object_smart_callbacks_descriptions_get(const Evas_Object *obj, const Evas_Smart_Cb_Description ***class_descriptions, unsigned int *class_count, const Evas_Smart_Cb_Description ***instance_descriptions, unsigned int *instance_count)
508 Evas_Object_Smart *o;
510 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
511 if (class_descriptions) *class_descriptions = NULL;
512 if (class_count) *class_count = 0;
513 if (instance_descriptions) *instance_descriptions = NULL;
514 if (instance_count) *instance_count = 0;
517 o = (Evas_Object_Smart *)(obj->object_data);
518 MAGIC_CHECK(o, Evas_Object_Smart, MAGIC_OBJ_SMART);
519 if (class_descriptions) *class_descriptions = NULL;
520 if (class_count) *class_count = 0;
521 if (instance_descriptions) *instance_descriptions = NULL;
522 if (instance_count) *instance_count = 0;
526 if (class_descriptions)
527 *class_descriptions = obj->smart.smart->callbacks.array;
529 *class_count = obj->smart.smart->callbacks.size;
531 if (instance_descriptions)
532 *instance_descriptions = o->callbacks_descriptions.array;
534 *instance_count = o->callbacks_descriptions.size;
538 evas_object_smart_callback_description_find(const Evas_Object *obj, const char *name, const Evas_Smart_Cb_Description **class_description, const Evas_Smart_Cb_Description **instance_description)
540 Evas_Object_Smart *o;
544 if (class_description) *class_description = NULL;
545 if (instance_description) *instance_description = NULL;
549 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
550 if (class_description) *class_description = NULL;
551 if (instance_description) *instance_description = NULL;
554 o = (Evas_Object_Smart *)(obj->object_data);
555 MAGIC_CHECK(o, Evas_Object_Smart, MAGIC_OBJ_SMART);
556 if (class_description) *class_description = NULL;
557 if (instance_description) *instance_description = NULL;
561 if (class_description)
562 *class_description = evas_smart_cb_description_find
563 (&obj->smart.smart->callbacks, name);
565 if (instance_description)
566 *instance_description = evas_smart_cb_description_find
567 (&o->callbacks_descriptions, name);
571 evas_object_smart_need_recalculate_set(Evas_Object *obj, Eina_Bool value)
573 Evas_Object_Smart *o;
574 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
577 o = obj->object_data;
578 MAGIC_CHECK(o, Evas_Object_Smart, MAGIC_OBJ_SMART);
582 // XXX: do i need this?
583 if (obj->delete_me) return;
585 /* remove this entry from calc_list or processed list */
586 if (eina_clist_element_is_linked(&obj->calc_entry))
587 eina_clist_remove(&obj->calc_entry);
591 eina_clist_add_tail(&obj->layer->evas->calc_list, &obj->calc_entry);
593 eina_clist_add_tail(&obj->layer->evas->calc_done, &obj->calc_entry);
595 if (o->need_recalculate == value) return;
597 if (obj->recalculate_cycle > 254)
599 ERR("Object %p is not stable during recalc loop", obj);
602 if (obj->layer->evas->in_smart_calc) obj->recalculate_cycle++;
603 o->need_recalculate = value;
607 evas_object_smart_need_recalculate_get(const Evas_Object *obj)
609 Evas_Object_Smart *o;
610 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
613 o = obj->object_data;
614 MAGIC_CHECK(o, Evas_Object_Smart, MAGIC_OBJ_SMART);
618 return o->need_recalculate;
622 evas_object_smart_calculate(Evas_Object *obj)
624 Evas_Object_Smart *o;
625 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
628 o = obj->object_data;
629 MAGIC_CHECK(o, Evas_Object_Smart, MAGIC_OBJ_SMART);
633 if (!obj->smart.smart->smart_class->calculate)
636 o->need_recalculate = 0;
637 obj->smart.smart->smart_class->calculate(obj);
641 evas_smart_objects_calculate(Evas *e)
643 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
646 evas_call_smarts_calculate(e);
650 evas_smart_objects_calculate_count_get(const Evas *e)
652 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
655 return e->smart_calc_count;
659 * Call calculate() on all smart objects that need_recalculate.
664 evas_call_smarts_calculate(Evas *e)
669 // printf("+CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALC-----------v\n");
670 evas_event_freeze(e);
673 while (NULL != (elem = eina_clist_head(&e->calc_list)))
675 Evas_Object_Smart *o;
677 /* move the item to the processed list */
678 obj = EINA_CLIST_ENTRY(elem, Evas_Object, calc_entry);
679 eina_clist_remove(&obj->calc_entry);
680 if (obj->delete_me) continue;
681 eina_clist_add_tail(&e->calc_done, &obj->calc_entry);
683 o = obj->object_data;
685 if (o->need_recalculate)
687 o->need_recalculate = 0;
688 obj->smart.smart->smart_class->calculate(obj);
692 while (NULL != (elem = eina_clist_head(&e->calc_done)))
694 obj = EINA_CLIST_ENTRY(elem, Evas_Object, calc_entry);
695 obj->recalculate_cycle = 0;
696 eina_clist_remove(&obj->calc_entry);
700 if (e->in_smart_calc == 0) e->smart_calc_count++;
702 evas_event_thaw_eval(e);
706 evas_object_smart_changed(Evas_Object *obj)
708 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
711 evas_object_change(obj);
712 evas_object_smart_need_recalculate_set(obj, 1);
717 evas_object_smart_callbacks_clear(Evas_Object *obj)
719 Evas_Object_Smart *o;
721 Evas_Smart_Callback *cb;
723 o = (Evas_Object_Smart *)(obj->object_data);
725 if (o->walking_list) return;
726 if (!o->deletions_waiting) return;
727 for (l = o->callbacks; l;)
729 cb = eina_list_data_get(l);
730 l = eina_list_next(l);
733 o->callbacks = eina_list_remove(o->callbacks, cb);
734 if (cb->event) eina_stringshare_del(cb->event);
735 EVAS_MEMPOOL_FREE(_mp_cb, cb);
741 evas_object_smart_del(Evas_Object *obj)
745 if (obj->delete_me) return;
746 s = obj->smart.smart;
747 if ((s) && (s->smart_class->del)) s->smart_class->del(obj);
748 if (obj->smart.parent) evas_object_smart_member_del(obj);
749 if (s) evas_object_smart_unuse(s);
753 evas_object_smart_cleanup(Evas_Object *obj)
755 Evas_Object_Smart *o;
757 if (obj->smart.parent)
758 evas_object_smart_member_del(obj);
760 o = (Evas_Object_Smart *)(obj->object_data);
761 if (o->magic == MAGIC_OBJ_SMART)
763 if (obj->calc_entry.next)
764 eina_clist_remove(&obj->calc_entry);
767 evas_object_smart_member_del((Evas_Object *)o->contained);
771 Evas_Smart_Callback *cb = o->callbacks->data;
772 o->callbacks = eina_list_remove(o->callbacks, cb);
773 if (cb->event) eina_stringshare_del(cb->event);
774 EVAS_MEMPOOL_FREE(_mp_cb, cb);
777 evas_smart_cb_descriptions_resize(&o->callbacks_descriptions, 0);
781 obj->smart.parent = NULL;
782 obj->smart.smart = NULL;
786 evas_object_smart_member_cache_invalidate(Evas_Object *obj,
787 Eina_Bool pass_events,
788 Eina_Bool freeze_events)
790 Evas_Object_Smart *o;
793 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
798 obj->parent_cache.pass_events_valid = EINA_FALSE;
800 obj->parent_cache.freeze_events_valid = EINA_FALSE;
802 o = obj->object_data;
803 if (o->magic != MAGIC_OBJ_SMART) return;
805 EINA_INLIST_FOREACH(o->contained, member)
806 evas_object_smart_member_cache_invalidate(member,
812 evas_object_smart_member_raise(Evas_Object *member)
814 Evas_Object_Smart *o;
816 o = (Evas_Object_Smart *)(member->smart.parent->object_data);
817 o->contained = eina_inlist_demote(o->contained, EINA_INLIST_GET(member));
821 evas_object_smart_member_lower(Evas_Object *member)
823 Evas_Object_Smart *o;
825 o = (Evas_Object_Smart *)(member->smart.parent->object_data);
826 o->contained = eina_inlist_promote(o->contained, EINA_INLIST_GET(member));
830 evas_object_smart_member_stack_above(Evas_Object *member, Evas_Object *other)
832 Evas_Object_Smart *o;
834 o = (Evas_Object_Smart *)(member->smart.parent->object_data);
835 o->contained = eina_inlist_remove(o->contained, EINA_INLIST_GET(member));
836 o->contained = eina_inlist_append_relative(o->contained, EINA_INLIST_GET(member), EINA_INLIST_GET(other));
840 evas_object_smart_member_stack_below(Evas_Object *member, Evas_Object *other)
842 Evas_Object_Smart *o;
844 o = (Evas_Object_Smart *)(member->smart.parent->object_data);
845 o->contained = eina_inlist_remove(o->contained, EINA_INLIST_GET(member));
846 o->contained = eina_inlist_prepend_relative(o->contained, EINA_INLIST_GET(member), EINA_INLIST_GET(other));
849 /* all nice and private */
851 evas_object_smart_init(Evas_Object *obj)
853 /* alloc smart obj, setup methods and default values */
854 obj->object_data = evas_object_smart_new();
855 /* set up default settings for this kind of object */
856 obj->cur.color.r = 255;
857 obj->cur.color.g = 255;
858 obj->cur.color.b = 255;
859 obj->cur.color.a = 255;
860 obj->cur.geometry.x = 0;
861 obj->cur.geometry.y = 0;
862 obj->cur.geometry.w = 0;
863 obj->cur.geometry.h = 0;
865 /* set up object-specific settings */
866 obj->prev = obj->cur;
867 /* set up methods (compulsory) */
868 obj->func = &object_func;
872 evas_object_smart_new(void)
874 Evas_Object_Smart *o;
876 /* alloc obj private data */
877 EVAS_MEMPOOL_INIT(_mp_obj, "evas_object_smart", Evas_Object_Smart, 256, NULL);
878 o = EVAS_MEMPOOL_ALLOC(_mp_obj, Evas_Object_Smart);
880 EVAS_MEMPOOL_PREP(_mp_obj, o, Evas_Object_Smart);
881 o->magic = MAGIC_OBJ_SMART;
886 evas_object_smart_free(Evas_Object *obj)
888 Evas_Object_Smart *o;
890 /* frees private object data. very simple here */
891 o = (Evas_Object_Smart *)(obj->object_data);
892 MAGIC_CHECK(o, Evas_Object_Smart, MAGIC_OBJ_SMART);
897 EVAS_MEMPOOL_FREE(_mp_obj, o);
901 evas_object_smart_render(Evas_Object *obj __UNUSED__, void *output __UNUSED__, void *context __UNUSED__, void *surface __UNUSED__, int x __UNUSED__, int y __UNUSED__)
907 evas_object_smart_render_pre(Evas_Object *obj)
909 if (obj->pre_render_done) return;
910 if (!obj->child_has_map)
913 Evas_Object_Smart *o;
915 o = (Evas_Object_Smart *)(obj->object_data);
916 if (o->member_count > 1 &&
917 obj->cur.bounding_box.w == obj->prev.bounding_box.w &&
918 obj->cur.bounding_box.h == obj->prev.bounding_box.h &&
919 (obj->cur.bounding_box.x != obj->prev.bounding_box.x ||
920 obj->cur.bounding_box.y != obj->prev.bounding_box.y))
922 fprintf(stderr, "Wouhou, I can detect moving smart object (%s, %p < %p)\n", evas_object_type_get(obj), obj, obj->smart.parent);
926 if (obj->changed_map)
927 evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
929 obj->pre_render_done = EINA_TRUE;
933 evas_object_smart_render_post(Evas_Object *obj)
935 obj->prev = obj->cur;
938 static unsigned int evas_object_smart_id_get(Evas_Object *obj)
940 Evas_Object_Smart *o;
942 o = (Evas_Object_Smart *)(obj->object_data);
944 return MAGIC_OBJ_SMART;
947 static unsigned int evas_object_smart_visual_id_get(Evas_Object *obj)
949 Evas_Object_Smart *o;
951 o = (Evas_Object_Smart *)(obj->object_data);
953 return MAGIC_OBJ_CONTAINER;
956 static void *evas_object_smart_engine_data_get(Evas_Object *obj)
958 Evas_Object_Smart *o;
960 o = (Evas_Object_Smart *)(obj->object_data);
962 return o->engine_data;