seoz pushed a commit to branch elementary-1.12. http://git.enlightenment.org/core/elementary.git/commit/?id=6ac2038023550cc4581d7133e1cebfe38bfb7c10
commit 6ac2038023550cc4581d7133e1cebfe38bfb7c10 Author: Daniel Juyung Seo <[email protected]> Date: Fri Dec 26 18:40:14 2014 +0900 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 Conflicts: src/lib/elm_gengrid.c src/lib/elm_genlist.c src/lib/elm_list.c src/lib/elm_toolbar.c --- 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 9c2605b..c8f8d33 100644 --- a/src/lib/elm_gengrid.c +++ b/src/lib/elm_gengrid.c @@ -2941,8 +2941,6 @@ _elm_gengrid_nearest_visible_item_get(Evas_Object *obj, Elm_Object_Item *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(it)) @@ -2951,6 +2949,8 @@ _elm_gengrid_nearest_visible_item_get(Evas_Object *obj, Elm_Object_Item *it) search_next = EINA_TRUE; } + item_list = elm_gengrid_realized_items_get(obj); + if ((iy < vy) || search_next) { EINA_LIST_FOREACH(item_list, l, item) @@ -2958,7 +2958,10 @@ _elm_gengrid_nearest_visible_item_get(Evas_Object *obj, Elm_Object_Item *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(item)) - return item; + { + eina_list_free(item_list); + return item; + } } } else @@ -2968,7 +2971,10 @@ _elm_gengrid_nearest_visible_item_get(Evas_Object *obj, Elm_Object_Item *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(item)) - return item; + { + eina_list_free(item_list); + return item; + } } } return it; diff --git a/src/lib/elm_genlist.c b/src/lib/elm_genlist.c index 882188a..453e693 100644 --- a/src/lib/elm_genlist.c +++ b/src/lib/elm_genlist.c @@ -2911,8 +2911,6 @@ _elm_genlist_nearest_visible_item_get(Evas_Object *obj, Elm_Object_Item *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(it)) @@ -2921,6 +2919,8 @@ _elm_genlist_nearest_visible_item_get(Evas_Object *obj, Elm_Object_Item *it) search_next = EINA_TRUE; } + item_list = elm_genlist_realized_items_get(obj); + if ((iy < vy) || search_next) { EINA_LIST_FOREACH(item_list, l, item) @@ -2928,7 +2928,10 @@ _elm_genlist_nearest_visible_item_get(Evas_Object *obj, Elm_Object_Item *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(item)) - return item; + { + eina_list_free(item_list); + return item; + } } } else @@ -2938,7 +2941,10 @@ _elm_genlist_nearest_visible_item_get(Evas_Object *obj, Elm_Object_Item *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(item)) - return item; + { + eina_list_free(item_list); + return item; + } } } return it; diff --git a/src/lib/elm_list.c b/src/lib/elm_list.c index 37c3b9d..54f4ddc 100644 --- a/src/lib/elm_list.c +++ b/src/lib/elm_list.c @@ -1189,8 +1189,6 @@ _elm_list_nearest_visible_item_get(Evas_Object *obj, Elm_Object_Item *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, it); - if (ELM_RECTS_INCLUDE(vx, vy, vw, vh, ix, iy, iw, ih)) { if (!elm_object_item_disabled_get(it)) @@ -1199,6 +1197,8 @@ _elm_list_nearest_visible_item_get(Evas_Object *obj, Elm_Object_Item *it) search_next = EINA_TRUE; } + item_list = eina_list_data_find_list(sd->items, it); + if ((!sd->h_mode && (iy < vy)) || (sd->h_mode && (iw < vw)) || search_next) @@ -1209,7 +1209,10 @@ _elm_list_nearest_visible_item_get(Evas_Object *obj, Elm_Object_Item *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(item)) - return item; + { + eina_list_free(item_list); + return item; + } } } else @@ -1220,7 +1223,10 @@ _elm_list_nearest_visible_item_get(Evas_Object *obj, Elm_Object_Item *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(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 109b03b..62b6d5e 100644 --- a/src/lib/elm_toolbar.c +++ b/src/lib/elm_toolbar.c @@ -679,19 +679,16 @@ _elm_toolbar_nearest_visible_item_get(Evas_Object *obj, Elm_Object_Item *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(it)) - { - eina_list_free(item_list); - return it; - } + return 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) --
