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); evas_object_show(bt_1500);
elm_box_pack_end(bx, 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, gli = elm_genlist_item_append(gl, &itc1,
(void *)(long)i/* item data */, (void *)(long)i/* item data */,

View File

@ -205,7 +205,8 @@ struct _Widget_Data
Pan *pan; Pan *pan;
Evas_Coord pan_x, pan_y, w, h, minw, minh, realminw, prev_viewport_w; Evas_Coord pan_x, pan_y, w, h, minw, minh, realminw, prev_viewport_w;
Ecore_Job *calc_job, *update_job; 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; Eina_List *queue, *selected;
Elm_Genlist_Item *show_item, *last_selected_item, *anchor_item, *mode_item; Elm_Genlist_Item *show_item, *last_selected_item, *anchor_item, *mode_item;
Eina_Inlist *item_cache; Eina_Inlist *item_cache;
@ -632,6 +633,7 @@ _del_hook(Evas_Object *obj)
_item_cache_zero(wd); _item_cache_zero(wd);
if (wd->calc_job) ecore_job_del(wd->calc_job); if (wd->calc_job) ecore_job_del(wd->calc_job);
if (wd->update_job) ecore_job_del(wd->update_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->must_recalc_idler) ecore_idler_del(wd->must_recalc_idler);
if (wd->multi_timer) ecore_timer_del(wd->multi_timer); if (wd->multi_timer) ecore_timer_del(wd->multi_timer);
if (wd->mode_type) eina_stringshare_del(wd->mode_type); if (wd->mode_type) eina_stringshare_del(wd->mode_type);
@ -3054,7 +3056,7 @@ _queue_process(Widget_Data *wd,
} }
static Eina_Bool static Eina_Bool
_item_idler(void *data) _idle_process(void *data, Eina_Bool *wakeup)
{ {
Widget_Data *wd = data; Widget_Data *wd = data;
@ -3062,23 +3064,34 @@ _item_idler(void *data)
//static double q_start = 0.0; //static double q_start = 0.0;
//if (q_start == 0.0) q_start = ecore_time_get(); //if (q_start == 0.0) q_start = ecore_time_get();
//xxx //xxx
if (_queue_process(wd, 1) > 0) *wakeup = EINA_TRUE;
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 (!wd->queue) if (!wd->queue)
{ {
//xxx //xxx
//printf("PROCESS TIME: %3.3f\n", ecore_time_get() - q_start); //printf("PROCESS TIME: %3.3f\n", ecore_time_get() - q_start);
//xxx //xxx
wd->queue_idler = NULL;
return ECORE_CALLBACK_CANCEL; return ECORE_CALLBACK_CANCEL;
} }
return ECORE_CALLBACK_RENEW; 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 static void
_item_queue(Widget_Data *wd, _item_queue(Widget_Data *wd,
Elm_Genlist_Item *it) Elm_Genlist_Item *it)
@ -3088,14 +3101,15 @@ _item_queue(Widget_Data *wd,
wd->queue = eina_list_append(wd->queue, it); wd->queue = eina_list_append(wd->queue, it);
while ((wd->queue) && ((!wd->blocks) || (!wd->blocks->next))) while ((wd->queue) && ((!wd->blocks) || (!wd->blocks->next)))
{ {
if (wd->queue_idler) if (wd->queue_idle_enterer)
{ {
ecore_idler_del(wd->queue_idler); ecore_idle_enterer_del(wd->queue_idle_enterer);
wd->queue_idler = NULL; wd->queue_idle_enterer = NULL;
} }
_queue_process(wd, 0); _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); ecore_job_del(wd->calc_job);
wd->calc_job = NULL; wd->calc_job = NULL;
} }
if (wd->queue_idler) if (wd->queue_idle_enterer)
{ {
ecore_idler_del(wd->queue_idler); ecore_idle_enterer_del(wd->queue_idle_enterer);
wd->queue_idler = NULL; wd->queue_idle_enterer = NULL;
} }
if (wd->must_recalc_idler) if (wd->must_recalc_idler)
{ {