edje_cc: Keep script block during group inheritance
authorJeeyong Um <conr2d@gmail.com>
Thu, 20 Apr 2017 11:26:17 +0000 (20:26 +0900)
committerJeeyong Um <conr2d@gmail.com>
Thu, 20 Apr 2017 12:09:59 +0000 (21:09 +0900)
Currently, script block is removed when an edje group inherits from other group
after defining its own script block.
  group { "somegroup";
    script {
       ...
    }
    parts {
       ...
    }
    inherit: "othergroup"; // <= previous script block is removed here.
  }

If parent group doesn't have script block, it doesn't need to overwrite previous
one. This will keep script block and print warning when script block is overwritten.

src/bin/edje/edje_cc_handlers.c

index 2c62ed3..aae16a2 100644 (file)
@@ -4914,9 +4914,22 @@ st_collections_group_inherit(void)
    cd = eina_list_data_get(eina_list_last(codes));
 
    cd->is_lua = cd2->is_lua;
-   cd->shared = STRDUP(cd2->shared);
-   cd->original = STRDUP(cd2->original);
-   script_override = EINA_TRUE;
+   if (cd2->shared)
+     {
+        if (cd->shared)
+          {
+             WRN("%s:%i. script block in group \"%s\" will be overwritten by inheriting "
+                 "from group \"%s\".", file_in, line - 1, pc->part, pc2->part);
+             free(cd->shared);
+          }
+        if (cd->original)
+          free(cd->original);
+
+        cd->shared = STRDUP(cd2->shared);
+        cd->original = STRDUP(cd2->original);
+
+        script_override = EINA_TRUE;
+     }
 
    EINA_LIST_FOREACH(cd2->programs, l, cp2)
      {
@@ -5267,8 +5280,10 @@ st_collections_group_program_source(void)
 static void
 ob_collections_group_script(void)
 {
+   Edje_Part_Collection *pc;
    Code *cd;
 
+   pc = eina_list_last_data_get(edje_collections);
    cd = eina_list_data_get(eina_list_last(codes));
 
    if (!is_verbatim()) track_verbatim(1);
@@ -5288,6 +5303,9 @@ ob_collections_group_script(void)
                        free(cd->shared);
                        free(cd->original);
                        script_override = EINA_FALSE;
+
+                       WRN("%s:%i. Inherited script block in group \"%s\" is redefined. "
+                           "This can break inherited edje programs.", file_in, line - 1, pc->part);
                     }
                   else
                     {