elm/genlist: remove calc jobs

now that we have a sane and consistent sizing calc mechanism, we no longer
need to be randomly creating jobs to do additional side calcs in addition
to our other multiple bespoke calculation methods

instead, we can now call the calc function directly during the group calc
to perform all the calcs at once and avoid the overhead of constantly triggering
calc jobs

a possible future improvement here could be to remove the _calc_job() call in
the internal pan object's group_calculate, as this is likely a duplicated op
but it will require additional testing to verify

unit test performance (e.g., tree) increases roughly 50-80% after this patch

Reviewed-by: Cedric BAIL <cedric.bail@free.fr>
Differential Revision: https://phab.enlightenment.org/D10523
This commit is contained in:
Mike Blumenkrantz 2019-10-21 16:05:33 -04:00 committed by Marcel Hollerbach
parent 0777b74f07
commit 712266fb9a
2 changed files with 22 additions and 40 deletions

View File

@ -183,14 +183,6 @@ static const Elm_Action key_actions[] = {
{NULL, NULL}
};
static inline void
_add_calc_job(Elm_Genlist_Data *sd)
{
ELM_SAFE_FREE(sd->calc_job, ecore_job_del);
if (!efl_alive_get(sd->obj)) return;
sd->calc_job = ecore_job_add(_calc_job, sd->obj);
}
static void
_size_cache_free(void *data)
{
@ -296,7 +288,6 @@ _elm_genlist_pan_efl_gfx_entity_position_set(Eo *obj, Elm_Genlist_Pan_Data *psd,
psd->wsd->pan_changed = EINA_TRUE;
evas_object_smart_changed(obj);
ELM_SAFE_FREE(psd->wsd->calc_job, ecore_job_del);
}
static void
@ -332,9 +323,7 @@ _elm_genlist_pan_efl_gfx_entity_size_set(Eo *obj, Elm_Genlist_Pan_Data *psd, Ein
// away or appeared to queue a job to deal with it. it should settle in
// the end to a steady-state
if (old.w != size.w)
_add_calc_job(sd);
else
ELM_SAFE_FREE(sd->calc_job, ecore_job_del);
efl_canvas_group_change(sd->obj);
super:
efl_gfx_entity_size_set(efl_super(obj, MY_PAN_CLASS), size);
@ -783,7 +772,7 @@ _must_recalc_idler(void *data)
{
ELM_GENLIST_DATA_GET(data, sd);
_add_calc_job(sd);
efl_canvas_group_change(sd->obj);
sd->must_recalc_idler = NULL;
return ECORE_CALLBACK_CANCEL;
}
@ -793,7 +782,7 @@ _calc_job(void *data)
{
int in = 0;
Item_Block *itb, *chb = NULL;
ELM_GENLIST_DATA_GET(data, sd);
Elm_Genlist_Data *sd = data;
Eina_Bool minw_change = EINA_FALSE;
Eina_Bool did_must_recalc = EINA_FALSE;
Evas_Coord minw = -1, minh = 0, y = 0, ow = 0, vw = 0;
@ -905,7 +894,7 @@ _calc_job(void *data)
if (did_must_recalc)
{
if (!sd->must_recalc_idler)
sd->must_recalc_idler = ecore_idler_add(_must_recalc_idler, data);
sd->must_recalc_idler = ecore_idler_add(_must_recalc_idler, sd->obj);
}
if (!sd->show_item) sd->check_scroll = EINA_FALSE;
if (sd->check_scroll)
@ -917,7 +906,6 @@ _calc_job(void *data)
_item_scroll(sd);
}
sd->calc_job = NULL;
evas_object_smart_changed(sd->pan_obj);
evas_event_thaw(e);
evas_event_thaw_eval(e);
@ -956,11 +944,13 @@ _elm_genlist_efl_canvas_group_group_calculate(Eo *obj, Elm_Genlist_Data *sd)
{
itb->must_recalc = EINA_TRUE;
}
_add_calc_job(sd);
_calc_job(sd);
}
minw = vmw;
minh = vmh;
}
else
_calc_job(sd);
if (sd->scr_minw)
{
@ -2621,9 +2611,7 @@ _elm_genlist_pan_efl_canvas_group_group_calculate(Eo *obj, Elm_Genlist_Pan_Data
if (sd->pan_changed)
{
ecore_job_del(sd->calc_job);
sd->calc_job = NULL;
_calc_job(sd->obj);
_calc_job(sd);
sd->pan_changed = EINA_FALSE;
}
@ -3577,7 +3565,7 @@ _elm_genlist_efl_ui_widget_theme_apply(Eo *obj, Elm_Genlist_Data *sd)
itb->changed = EINA_TRUE;
}
if (sd->obj && efl_finalized_get(obj))
_add_calc_job(sd);
efl_canvas_group_change(sd->obj);
elm_layout_sizing_eval(obj);
evas_event_thaw(e);
evas_event_thaw_eval(e);
@ -3699,7 +3687,7 @@ _item_block_del(Elm_Gen_Item *it)
itb->items = eina_list_remove(itb->items, it);
itb->count--;
itb->changed = EINA_TRUE;
_add_calc_job(sd);
efl_canvas_group_change(sd->obj);
if (itb->count < 1)
{
Item_Block *itbn;
@ -3767,8 +3755,6 @@ _item_block_del(Elm_Gen_Item *it)
{
sd->pan_changed = EINA_TRUE;
evas_object_smart_changed(sd->pan_obj);
ecore_job_del(sd->calc_job);
sd->calc_job = NULL;
}
}
@ -3847,7 +3833,7 @@ _elm_genlist_item_del_serious(Elm_Gen_Item *it)
sd->group_items = eina_list_remove(sd->group_items, it);
ELM_SAFE_FREE(sd->state, eina_inlist_sorted_state_free);
_add_calc_job(sd);
efl_canvas_group_change(sd->obj);
ELM_SAFE_FREE(it->item, free);
}
@ -4049,7 +4035,7 @@ _item_mouse_move_cb(void *data,
else
_item_position(it, VIEW(it), it->item->scrl_x, y_pos);
_add_calc_job(sd);
efl_canvas_group_change(sd->obj);
}
return;
}
@ -4653,7 +4639,7 @@ newblock:
itb->count++;
itb->changed = EINA_TRUE;
it->item->block = itb;
_add_calc_job(itb->sd);
efl_canvas_group_change(itb->sd->obj);
if (itb->count > itb->sd->max_items_per_block)
{
@ -4812,7 +4798,6 @@ _item_process_post(Elm_Genlist_Data *sd, Elm_Gen_Item *it)
if (sd->pan_changed)
{
evas_object_smart_changed(sd->pan_obj);
ELM_SAFE_FREE(sd->calc_job, ecore_job_del);
}
}
if (show_me) it->item->block->show_me = EINA_TRUE;
@ -4898,7 +4883,7 @@ _item_idle_enterer(void *data)
if (wakeup)
{
// wake up mainloop
_add_calc_job(sd);
efl_canvas_group_change(sd->obj);
}
if (ok == ECORE_CALLBACK_CANCEL) sd->queue_idle_enterer = NULL;
@ -5144,7 +5129,7 @@ _item_mouse_up_cb(void *data,
}
else
{
_add_calc_job(sd);
efl_canvas_group_change(sd->obj);
}
edje_object_signal_emit(VIEW(it), SIGNAL_REORDER_DISABLED, "elm");
if (_elm_config->atspi_mode)
@ -5541,7 +5526,7 @@ _update_job(void *data)
}
if (position)
{
_add_calc_job(sd);
efl_canvas_group_change(sd->obj);
}
evas_event_thaw(e);
evas_event_thaw_eval(e);
@ -5895,7 +5880,6 @@ _elm_genlist_efl_canvas_group_group_del(Eo *obj, Elm_Genlist_Data *sd)
EVAS_CALLBACK_CANVAS_VIEWPORT_RESIZE,
_evas_viewport_resize_cb, sd);
ELM_SAFE_FREE(sd->calc_job, ecore_job_del);
ELM_SAFE_FREE(sd->update_job, ecore_job_del);
ELM_SAFE_FREE(sd->pan_obj, evas_object_del);
ELM_SAFE_FREE(sd->queue_idle_enterer, ecore_idle_enterer_del);
@ -6048,7 +6032,6 @@ _internal_elm_genlist_clear(Evas_Object *obj)
sd->pan_changed = EINA_TRUE;
if (!sd->queue)
{
ELM_SAFE_FREE(sd->calc_job, ecore_job_del);
sd->anchor_item = NULL;
ELM_SAFE_FREE(sd->queue_idle_enterer, ecore_idle_enterer_del);
ELM_SAFE_FREE(sd->must_recalc_idler, ecore_idler_del);
@ -7296,7 +7279,7 @@ _elm_genlist_item_coordinates_calc(Elm_Gen_Item *it,
sd->scroll_to_type = type;
it->item->show_me = EINA_TRUE;
_add_calc_job(sd);
efl_canvas_group_change(sd->obj);
return EINA_FALSE;
}
@ -7912,7 +7895,7 @@ _item_filtered_get(Elm_Gen_Item *it)
_filter_item_internal(it);
if (it->item->block)
it->item->block->changed = EINA_TRUE;
_add_calc_job(sd);
efl_canvas_group_change(sd->obj);
}
if (!it->hide) return EINA_TRUE;
return EINA_FALSE;
@ -7971,7 +7954,7 @@ _item_filter_enterer(void *data)
if (wakeup)
{
// wake up mainloop
_add_calc_job(sd);
efl_canvas_group_change(sd->obj);
}
if (ok == ECORE_CALLBACK_CANCEL)
{
@ -8023,7 +8006,7 @@ _elm_genlist_filter_set(Eo *obj EINA_UNUSED, Elm_Genlist_Data *sd, void *filter_
}
}
}
_calc_job(sd->obj);
_calc_job(sd);
sd->queue_filter_enterer = ecore_idle_enterer_add(_item_filter_enterer,
sd->obj);
@ -8277,7 +8260,7 @@ _elm_genlist_decorate_mode_set(Eo *obj, Elm_Genlist_Data *sd, Eina_Bool decorate
}
}
_add_calc_job(sd);
efl_canvas_group_change(sd->obj);
}
EOLIAN static void
@ -8423,7 +8406,7 @@ _flip_job(void *data)
it->flipped = EINA_TRUE;
it->item->nocache = EINA_TRUE;
_add_calc_job(sd);
efl_canvas_group_change(sd->obj);
}
EOLIAN static void

View File

@ -55,7 +55,6 @@ struct _Elm_Genlist_Data
Elm_Object_Item *last_selected_item;
Elm_Object_Item *focused_item; /**< a focused item by keypad arrow or mouse. This is set to NULL if widget looses focus. */
Elm_Object_Item *last_focused_item; /**< This records the last focused item when widget looses focus. This is required to set the focus on last focused item when widgets gets focus. */
Ecore_Job *calc_job;
int walking;
int minw, minh;
unsigned int item_count;