fix genlist processing items in idle time... idle entere instead :)

SVN revision: 58951
This commit is contained in:
Carsten Haitzler 2011-04-27 10:17:26 +00:00
parent 5dc8b2be5e
commit 071c5747bf
2 changed files with 31 additions and 17 deletions

View 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 */,

View 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)
{