gengrid, genlist, list, toolbar: Fix memory leak and enhance performance.
authorDaniel Juyung Seo <seojuyung2@gmail.com>
Fri, 26 Dec 2014 09:40:14 +0000 (18:40 +0900)
committerDaniel Juyung Seo <seojuyung2@gmail.com>
Fri, 26 Dec 2014 09:41:48 +0000 (18:41 +0900)
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
src/lib/elm_genlist.c
src/lib/elm_list.c
src/lib/elm_toolbar.c

index f419131..0009d6d 100644 (file)
@@ -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;
index 8fcfdca..65b1fd7 100644 (file)
@@ -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;
index ba907c5..61860ff 100644 (file)
@@ -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;
index cff0cf0..94320d3 100644 (file)
@@ -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)