Revert "[*] partial rollback: evas_object_smart.c"
authorMike McCormack <mj.mccormack@samsung.com>
Thu, 13 Oct 2011 03:21:32 +0000 (12:21 +0900)
committerMike McCormack <mj.mccormack@samsung.com>
Thu, 13 Oct 2011 03:21:32 +0000 (12:21 +0900)
This reverts commit 78ad3d360dd29d4b1e84050b57567cde1266cf60.

src/lib/canvas/evas_object_smart.c

index 7f60e92..f516aa7 100644 (file)
@@ -549,32 +549,49 @@ evas_object_smart_need_recalculate_set(Evas_Object *obj, Eina_Bool value)
    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
@@ -637,34 +654,37 @@ evas_smart_objects_calculate_count_get(const Evas *e)
 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