From ea6e0152753893bf89eabf443130a7cf57879f95 Mon Sep 17 00:00:00 2001 From: Daniel Juyung Seo Date: Fri, 26 Dec 2014 18:40:14 +0900 Subject: [PATCH] gengrid, genlist, list, toolbar: Fix memory leak and enhance performance. 1. Fix memory leak by freeing eina_list. 2. Enhance performance by getting the item list when it is really needed. @fix --- src/lib/elm_gengrid.c | 14 ++++++++++---- src/lib/elm_genlist.c | 14 ++++++++++---- src/lib/elm_list.c | 14 ++++++++++---- src/lib/elm_toolbar.c | 9 +++------ 4 files changed, 33 insertions(+), 18 deletions(-) diff --git a/src/lib/elm_gengrid.c b/src/lib/elm_gengrid.c index f419131..0009d6d 100644 --- a/src/lib/elm_gengrid.c +++ b/src/lib/elm_gengrid.c @@ -3003,8 +3003,6 @@ _elm_gengrid_nearest_visible_item_get(Evas_Object *obj, Elm_Object_Item *eo_it) evas_object_geometry_get(sd->pan_obj, &vx, &vy, &vw, &vh); evas_object_geometry_get(VIEW(it), &ix, &iy, &iw, &ih); // FIXME: check if the item is realized or not - item_list = elm_gengrid_realized_items_get(obj); - if (ELM_RECTS_INCLUDE(vx, vy, vw, vh, ix, iy, iw, ih)) { if (!elm_object_item_disabled_get(eo_it)) @@ -3013,6 +3011,8 @@ _elm_gengrid_nearest_visible_item_get(Evas_Object *obj, Elm_Object_Item *eo_it) search_next = EINA_TRUE; } + item_list = elm_gengrid_realized_items_get(obj); + if ((iy < vy) || search_next) { EINA_LIST_FOREACH(item_list, l, eo_item) @@ -3021,7 +3021,10 @@ _elm_gengrid_nearest_visible_item_get(Evas_Object *obj, Elm_Object_Item *eo_it) evas_object_geometry_get(VIEW(item), &cx, &cy, &cw, &ch); if (ELM_RECTS_INCLUDE(vx, vy, vw, vh, cx, cy, cw, ch) && !elm_object_item_disabled_get(eo_item)) - return eo_item; + { + eina_list_free(item_list); + return eo_item; + } } } else @@ -3032,7 +3035,10 @@ _elm_gengrid_nearest_visible_item_get(Evas_Object *obj, Elm_Object_Item *eo_it) evas_object_geometry_get(VIEW(item), &cx, &cy, &cw, &ch); if (ELM_RECTS_INCLUDE(vx, vy, vw, vh, cx, cy, cw, ch) && !elm_object_item_disabled_get(eo_item)) - return eo_item; + { + eina_list_free(item_list); + return eo_item; + } } } return eo_it; diff --git a/src/lib/elm_genlist.c b/src/lib/elm_genlist.c index 8fcfdca..65b1fd7 100644 --- a/src/lib/elm_genlist.c +++ b/src/lib/elm_genlist.c @@ -3065,8 +3065,6 @@ _elm_genlist_nearest_visible_item_get(Evas_Object *obj, Elm_Object_Item *eo_it) evas_object_geometry_get(sd->pan_obj, &vx, &vy, &vw, &vh); evas_object_geometry_get(VIEW(it), &ix, &iy, &iw, &ih); // FIXME: check if the item is realized or not - item_list = elm_genlist_realized_items_get(obj); - if (ELM_RECTS_INCLUDE(vx, vy, vw, vh, ix, iy, iw, ih)) { if (!elm_object_item_disabled_get(eo_it)) @@ -3075,6 +3073,8 @@ _elm_genlist_nearest_visible_item_get(Evas_Object *obj, Elm_Object_Item *eo_it) search_next = EINA_TRUE; } + item_list = elm_genlist_realized_items_get(obj); + if ((iy < vy) || search_next) { EINA_LIST_FOREACH(item_list, l, eo_item) @@ -3083,7 +3083,10 @@ _elm_genlist_nearest_visible_item_get(Evas_Object *obj, Elm_Object_Item *eo_it) evas_object_geometry_get(VIEW(item), &cx, &cy, &cw, &ch); if (ELM_RECTS_INCLUDE(vx, vy, vw, vh, cx, cy, cw, ch) && !elm_object_item_disabled_get(eo_item)) - return eo_item; + { + eina_list_free(item_list); + return eo_item; + } } } else @@ -3094,7 +3097,10 @@ _elm_genlist_nearest_visible_item_get(Evas_Object *obj, Elm_Object_Item *eo_it) evas_object_geometry_get(VIEW(item), &cx, &cy, &cw, &ch); if (ELM_RECTS_INCLUDE(vx, vy, vw, vh, cx, cy, cw, ch) && !elm_object_item_disabled_get(eo_item)) - return eo_item; + { + eina_list_free(item_list); + return eo_item; + } } } return eo_it; diff --git a/src/lib/elm_list.c b/src/lib/elm_list.c index ba907c5..61860ff 100644 --- a/src/lib/elm_list.c +++ b/src/lib/elm_list.c @@ -1203,8 +1203,6 @@ _elm_list_nearest_visible_item_get(Evas_Object *obj, Elm_List_Item_Data *it) evas_object_geometry_get(obj, &vx, &vy, &vw, &vh); evas_object_geometry_get(VIEW(it), &ix, &iy, &iw, &ih); - item_list = eina_list_data_find_list(sd->items, EO_OBJ(it)); - if (ELM_RECTS_INCLUDE(vx, vy, vw, vh, ix, iy, iw, ih)) { if (!elm_object_item_disabled_get(EO_OBJ(it))) @@ -1213,6 +1211,8 @@ _elm_list_nearest_visible_item_get(Evas_Object *obj, Elm_List_Item_Data *it) search_next = EINA_TRUE; } + item_list = eina_list_data_find_list(sd->items, EO_OBJ(it)); + if ((!sd->h_mode && (iy < vy)) || (sd->h_mode && (iw < vw)) || search_next) @@ -1223,7 +1223,10 @@ _elm_list_nearest_visible_item_get(Evas_Object *obj, Elm_List_Item_Data *it) evas_object_geometry_get(VIEW(item), &cx, &cy, &cw, &ch); if (ELM_RECTS_INCLUDE(vx, vy, vw, vh, cx, cy, cw, ch) && !elm_object_item_disabled_get(EO_OBJ(item))) - return item; + { + eina_list_free(item_list); + return item; + } } } else @@ -1234,7 +1237,10 @@ _elm_list_nearest_visible_item_get(Evas_Object *obj, Elm_List_Item_Data *it) evas_object_geometry_get(VIEW(item), &cx, &cy, &cw, &ch); if (ELM_RECTS_INCLUDE(vx, vy, vw, vh, cx, cy, cw, ch) && !elm_object_item_disabled_get(EO_OBJ(item))) - return item; + { + eina_list_free(item_list); + return item; + } } } return it; diff --git a/src/lib/elm_toolbar.c b/src/lib/elm_toolbar.c index cff0cf0..94320d3 100644 --- a/src/lib/elm_toolbar.c +++ b/src/lib/elm_toolbar.c @@ -685,19 +685,16 @@ _elm_toolbar_nearest_visible_item_get(Evas_Object *obj, Elm_Object_Item *eo_it) evas_object_geometry_get(obj, &vx, &vy, &vw, &vh); evas_object_geometry_get(VIEW(it), &ix, &iy, &iw, &ih); - item_list = evas_object_box_children_get(sd->bx); - if (ELM_RECTS_INCLUDE(vx, vy, vw, vh, ix, iy, iw, ih)) { if (!elm_object_item_disabled_get(eo_it)) - { - eina_list_free(item_list); - return eo_it; - } + return eo_it; else search_next = EINA_TRUE; } + item_list = evas_object_box_children_get(sd->bx); + if ((sd->vertical && (iy < vy)) || (!sd->vertical && (iw < vw)) || search_next) -- 2.7.4