From: Bluezery <ohpowel@gmail.com>
authorBluezery <ohpowel@gmail.com>
Mon, 10 Dec 2012 06:37:00 +0000 (06:37 +0000)
committerCarsten Haitzler <raster@rasterman.com>
Mon, 10 Dec 2012 06:37:00 +0000 (06:37 +0000)
Subject: [E-devel] [Patch][edje] Prevent duplicated inherition of
"after"

When inherting group, "after" of "program" section is also inherited.
But duplicated name of "after" can be also inherited.
I think that multiple "after" can be used but duplicated should be
not.  because this seems to be useless.
Is there case that duplicated after usage is used?
Duplicated "target" is prevented.  I just copy those codes.

SVN revision: 80565

legacy/edje/AUTHORS
legacy/edje/ChangeLog
legacy/edje/NEWS
legacy/edje/src/bin/edje_cc_handlers.c

index 96cc8ec..e4b6e31 100644 (file)
@@ -33,3 +33,4 @@ Flavio Ceolin <flavio.ceolin@profusion.mobi>
 Daniel Zaoui <daniel.zaoui@yahoo.com>
 Daniel Willmann <d.willmann@samsung.com>
 Robert David <robert.david.public@gmail.com>
+Bluezery <ohpowel@gmail.com>
index 84f10e7..5a8c7e6 100644 (file)
 2012-12-05  Robert David
 
        * Fix Solaris 11 build.
+
+2012-12-05  Tae-Hwan Kim (Bluezery)
+
+       * Fix inheriting gorups with programs that have after programs where
+        after programs are duplicated in the list.
index 50ef92d..07f3fa6 100644 (file)
@@ -30,6 +30,7 @@ Fixes:
     * fix edje_text_class_set to update the text classes correctly.
     * fix to not update map uv for proxy
     * fix build on Solaris 11.
+    * fix duplicate after programs in group inheritance.
 
 Edje 1.7.0
 
index 2ab0acd..8cb1da8 100644 (file)
@@ -1208,9 +1208,11 @@ _edje_program_copy(Edje_Program *ep, Edje_Program *ep2)
 
    EINA_LIST_FOREACH(ep2->after, l, pa2)
      {
-        pa = mem_alloc(SZ(Edje_Program_After));
+        name = (char*) (pa2 + 1);
+        pa = mem_alloc(SZ(Edje_Program_After) + strlen(name) + 1);
         ep->after = eina_list_append(ep->after, pa);
-
+        copy = (char*) (pa + 1);
+        memcpy(copy, name, strlen(name) + 1);
         data_queue_copied_program_lookup(pc, &(pa2->id), &(pa->id));
      }
 
@@ -8461,9 +8463,7 @@ st_collections_group_programs_program_target(void)
        et = mem_alloc(SZ(Edje_Program_Target) + strlen(name) + 1);
        ep->targets = eina_list_append(ep->targets, et);
        copy = (char*) (et + 1);
-
        memcpy(copy, name, strlen(name) + 1);
-
         switch (ep->action)
           {
            case EDJE_ACTION_TYPE_ACTION_STOP:
@@ -8520,14 +8520,27 @@ st_collections_group_programs_program_after(void)
    ep = current_program;
      {
        Edje_Program_After *pa;
+       Edje_Program_After *pa2;
+       Eina_List *l;
        char *name;
+        char *copy;
 
        name = parse_str(0);
 
-       pa = mem_alloc(SZ(Edje_Program_After));
+        EINA_LIST_FOREACH(ep->after, l, pa2)
+          {
+             if (!strcmp(name, (char*) (pa2 + 1)))
+               {
+                  free(name);
+                  return;
+               }
+          }
+
+       pa = mem_alloc(SZ(Edje_Program_After) + strlen(name) + 1);
        pa->id = -1;
        ep->after = eina_list_append(ep->after, pa);
-
+        copy = (char*)(pa + 1);
+        memcpy(copy, name, strlen(name) + 1);
        data_queue_program_lookup(pc, name, &(pa->id));
        free(name);
      }