fix genlist processing items in idle time... idle entere instead :)
authorraster <raster@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Wed, 27 Apr 2011 10:17:26 +0000 (10:17 +0000)
committerraster <raster@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Wed, 27 Apr 2011 10:17:26 +0000 (10:17 +0000)
git-svn-id: https://svn.enlightenment.org/svn/e/trunk/elementary@58951 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/bin/test_genlist.c
src/lib/elm_genlist.c

index 6950016..fa784bf 100644 (file)
@@ -156,7 +156,7 @@ test_genlist(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_inf
    evas_object_show(bt_1500);
    elm_box_pack_end(bx, bt_1500);
 
-   for (i = 0; i < 2000; i++)
+   for (i = 0; i < 200000; i++)
      {
         gli = elm_genlist_item_append(gl, &itc1,
                                       (void *)(long)i/* item data */,
index f2471ad..2a16000 100644 (file)
@@ -205,7 +205,8 @@ struct _Widget_Data
    Pan              *pan;
    Evas_Coord        pan_x, pan_y, w, h, minw, minh, realminw, prev_viewport_w;
    Ecore_Job        *calc_job, *update_job;
-   Ecore_Idler      *queue_idler, *must_recalc_idler;
+   Ecore_Idle_Enterer *queue_idle_enterer;
+   Ecore_Idler        *must_recalc_idler;
    Eina_List        *queue, *selected;
    Elm_Genlist_Item *show_item, *last_selected_item, *anchor_item, *mode_item;
    Eina_Inlist      *item_cache;
@@ -632,6 +633,7 @@ _del_hook(Evas_Object *obj)
    _item_cache_zero(wd);
    if (wd->calc_job) ecore_job_del(wd->calc_job);
    if (wd->update_job) ecore_job_del(wd->update_job);
+   if (wd->queue_idle_enterer) ecore_idle_enterer_del(wd->queue_idle_enterer);
    if (wd->must_recalc_idler) ecore_idler_del(wd->must_recalc_idler);
    if (wd->multi_timer) ecore_timer_del(wd->multi_timer);
    if (wd->mode_type) eina_stringshare_del(wd->mode_type);
@@ -3054,7 +3056,7 @@ _queue_process(Widget_Data *wd,
 }
 
 static Eina_Bool
-_item_idler(void *data)
+_idle_process(void *data, Eina_Bool *wakeup)
 {
    Widget_Data *wd = data;
 
@@ -3062,23 +3064,34 @@ _item_idler(void *data)
    //static double q_start = 0.0;
    //if (q_start == 0.0) q_start = ecore_time_get();
    //xxx
-
-   if (_queue_process(wd, 1) > 0)
-     {
-        if (wd->calc_job) ecore_job_del(wd->calc_job);
-        wd->calc_job = ecore_job_add(_calc_job, wd);
-     }
+   if (_queue_process(wd, 1) > 0) *wakeup = EINA_TRUE;
    if (!wd->queue)
      {
         //xxx
         //printf("PROCESS TIME: %3.3f\n", ecore_time_get() - q_start);
         //xxx
-        wd->queue_idler = NULL;
         return ECORE_CALLBACK_CANCEL;
      }
    return ECORE_CALLBACK_RENEW;
 }
 
+static Eina_Bool
+_item_idle_enterer(void *data)
+{
+   Widget_Data *wd = data;
+   Eina_Bool wakeup = EINA_FALSE;
+   Eina_Bool ok = _idle_process(data, &wakeup);
+   
+   if (wakeup)
+     {
+        // wake up mainloop
+        if (wd->calc_job) ecore_job_del(wd->calc_job);
+        wd->calc_job = ecore_job_add(_calc_job, wd);
+     }
+   if (ok == ECORE_CALLBACK_CANCEL) wd->queue_idle_enterer = NULL;   
+   return ok;
+}
+
 static void
 _item_queue(Widget_Data      *wd,
             Elm_Genlist_Item *it)
@@ -3088,14 +3101,15 @@ _item_queue(Widget_Data      *wd,
    wd->queue = eina_list_append(wd->queue, it);
    while ((wd->queue) && ((!wd->blocks) || (!wd->blocks->next)))
      {
-        if (wd->queue_idler)
+        if (wd->queue_idle_enterer)
           {
-             ecore_idler_del(wd->queue_idler);
-             wd->queue_idler = NULL;
+             ecore_idle_enterer_del(wd->queue_idle_enterer);
+             wd->queue_idle_enterer = NULL;
           }
         _queue_process(wd, 0);
      }
-   if (!wd->queue_idler) wd->queue_idler = ecore_idler_add(_item_idler, wd);
+   if (!wd->queue_idle_enterer) 
+      wd->queue_idle_enterer = ecore_idle_enterer_add(_item_idle_enterer, wd);
 }
 
 /**
@@ -3376,10 +3390,10 @@ elm_genlist_clear(Evas_Object *obj)
         ecore_job_del(wd->calc_job);
         wd->calc_job = NULL;
      }
-   if (wd->queue_idler)
+   if (wd->queue_idle_enterer)
      {
-        ecore_idler_del(wd->queue_idler);
-        wd->queue_idler = NULL;
+        ecore_idle_enterer_del(wd->queue_idle_enterer);
+        wd->queue_idle_enterer = NULL;
      }
    if (wd->must_recalc_idler)
      {