nikawhite pushed a commit to branch master.

http://git.enlightenment.org/tools/enventor.git/commit/?id=7d523c5edefa0d8a25a4c7bc98a481eb9d038869

commit 7d523c5edefa0d8a25a4c7bc98a481eb9d038869
Author: Mykyta Biliavskyi <m.biliavs...@samsung.com>
Date:   Tue Dec 22 11:01:11 2015 +0900

    Dummy object: split remove fake objetcts of Spacer and Swallow.
    
    Fix removing fake objects, that represent deleted parts.
    Previous solution wasn't clearing spacer list, and this can
    cause undefined behaviour.
    
    Function dummy_objs_update should be optimized. Because in
    current state inside this function there are too much loop
    with the similar logic.
    
    @fix
---
 src/lib/dummy_obj.c | 36 +++++++++++++++++++++++++++++-------
 1 file changed, 29 insertions(+), 7 deletions(-)

diff --git a/src/lib/dummy_obj.c b/src/lib/dummy_obj.c
index 11c81d9..8409e2a 100644
--- a/src/lib/dummy_obj.c
+++ b/src/lib/dummy_obj.c
@@ -56,12 +56,11 @@ dummy_objs_update(dummy_obj *dummy)
         EINA_LIST_FOREACH(parts, l2, part_name)
           {
              if (po->name[0] != part_name[0]) continue;
-             if (strlen(po->name) != strlen(part_name)) continue;
+             if ((strlen(po->name) != strlen(part_name))) continue;
              if (!strcmp(po->name, part_name))
                {
                   type = edje_edit_part_type_get(dummy->layout, part_name);
-                  if ((type == EDJE_PART_TYPE_SWALLOW) ||
-                       (type == EDJE_PART_TYPE_SPACER))
+                  if ((type == EDJE_PART_TYPE_SWALLOW))
                     removed = EINA_FALSE;
                   break;
                }
@@ -70,10 +69,33 @@ dummy_objs_update(dummy_obj *dummy)
           {
              evas_object_del(po->obj);
              eina_stringshare_del(po->name);
-             if (type == EDJE_PART_TYPE_SWALLOW)
-               dummy->swallows = eina_list_remove_list(dummy->swallows, l);
-             else if (type == EDJE_PART_TYPE_SPACER)
-               dummy->spacers = eina_list_remove_list(dummy->spacers, l);
+             dummy->swallows = eina_list_remove_list(dummy->swallows, l);
+             free(po);
+          }
+     }
+
+   //Remove the fake swallow objects that parts are removed.
+   EINA_LIST_FOREACH_SAFE(dummy->spacers, l, l_next, po)
+     {
+        removed = EINA_TRUE;
+
+        EINA_LIST_FOREACH(parts, l2, part_name)
+          {
+             if (po->name[0] != part_name[0]) continue;
+             if ((strlen(po->name) != strlen(part_name))) continue;
+             if (!strcmp(po->name, part_name))
+               {
+                  type = edje_edit_part_type_get(dummy->layout, part_name);
+                  if ((type == EDJE_PART_TYPE_SPACER))
+                    removed = EINA_FALSE;
+                  break;
+               }
+          }
+        if (removed)
+          {
+             evas_object_del(po->obj);
+             eina_stringshare_del(po->name);
+             dummy->spacers = eina_list_remove_list(dummy->spacers, l);
              free(po);
           }
      }

-- 


Reply via email to