return;
MAGIC_CHECK_END();
+ // XXX: do i need this?
+ if (obj->delete_me) return;
+
value = !!value;
- if (o->need_recalculate == value)
- return;
+ if (value)
+ {
+ Evas *e = obj->layer->evas;
+
+ if (o->need_recalculate)
+ {
+ if ((o->calc_node) && (e->calc_list_current != o->calc_node))
+ e->calc_list = eina_list_demote_list(e->calc_list,
+ o->calc_node);
+ else
+ e->calc_list = eina_list_append(e->calc_list, obj);
+ }
+ else
+ e->calc_list = eina_list_append(e->calc_list, obj);
+ o->calc_node = eina_list_last(e->calc_list);
+ }
+ else
+ {
+ Evas *e = obj->layer->evas;
+
+ if (o->need_recalculate)
+ {
+ if ((o->calc_node) && (e->calc_list_current != o->calc_node))
+ e->calc_list = eina_list_remove_list(e->calc_list,
+ o->calc_node);
+ o->calc_node = NULL;
+
+ }
+ }
+
+ if (o->need_recalculate == value) return;
- if (obj->recalculate_cycle > 64)
+ if (obj->recalculate_cycle > 256)
{
ERR("Object %p is not stable during recalc loop", obj);
- return ;
+ return;
}
- if (obj->layer->evas->in_smart_calc)
- obj->recalculate_cycle++;
+ if (obj->layer->evas->in_smart_calc) obj->recalculate_cycle++;
o->need_recalculate = value;
-
- if (!obj->smart.smart->smart_class->calculate) return;
-
- /* XXX: objects can be present multiple times in calculate_objects()
- * XXX: after a set-unset-set cycle, but it's not a problem since
- * XXX: on _evas_render_call_smart_calculate() will check for the flag
- * XXX: and it will be unset after the first.
- */
- if (o->need_recalculate)
- {
- Evas *e = obj->layer->evas;
- eina_array_push(&e->calculate_objects, obj);
- }
- /* TODO: else, remove from array */
}
EAPI Eina_Bool
void
evas_call_smarts_calculate(Evas *e)
{
- Eina_Array *calculate;
Evas_Object *obj;
- Eina_Array_Iterator it;
- unsigned int i;
+ Eina_List *l;
+// printf("+CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALC-----------v\n");
+ evas_event_freeze(e);
e->in_smart_calc++;
- calculate = &e->calculate_objects;
- for (i = 0; i < eina_array_count_get(calculate); ++i)
+
+ EINA_LIST_FOREACH(e->calc_list, l, obj)
{
- Evas_Object_Smart *o;
-
- obj = eina_array_data_get(calculate, i);
- if (obj->delete_me)
- continue;
-
- o = obj->object_data;
+ Evas_Object_Smart *o = obj->object_data;
+
+ if (obj->delete_me) continue;
+ e->calc_list_current = l;
if (o->need_recalculate)
{
o->need_recalculate = 0;
obj->smart.smart->smart_class->calculate(obj);
}
+ if (o->calc_node == l) o->calc_node = NULL;
+ e->calc_list_current = NULL;
}
- EINA_ARRAY_ITER_NEXT(calculate, i, obj, it)
+ EINA_LIST_FREE(e->calc_list, obj)
{
obj->recalculate_cycle = 0;
}
+ e->calc_list_current = NULL;
e->in_smart_calc--;
- if (e->in_smart_calc == 0) eina_array_clean(calculate);
+ if (e->in_smart_calc == 0) e->smart_calc_count++;
+ evas_event_thaw(e);
+ evas_event_thaw_eval(e);
+// printf("-CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALC-----------^\n");
}
EAPI void