edje_cc: delete anonymous lookup during program removal 71/87271/4
authorJee-Yong Um <jc9.um@samsung.com>
Fri, 15 Apr 2016 18:14:31 +0000 (11:14 -0700)
committerGerrit Code Review <gerrit@review.vlan103.tizen.org>
Wed, 7 Sep 2016 12:56:31 +0000 (05:56 -0700)
Summary:
program_remove attribute allows to remove program inherited from
parent group, but if its action is EDJE_ACTION_TYPE_SCRIPT,
anonymous lookup also should be deleted.

@fix

Reviewers: cedric, jpeg

Differential Revision: https://phab.enlightenment.org/D3875

Signed-off-by: Cedric Bail <cedric@osg.samsung.com>
Change-Id: Id96e26e525d58efbbb3d4563335fc8adbcfca88a

src/bin/edje/edje_cc.h
src/bin/edje/edje_cc_handlers.c
src/bin/edje/edje_cc_out.c

index eae4685..f7b6039 100644 (file)
@@ -181,6 +181,7 @@ void   *data_queue_program_lookup(Edje_Part_Collection *pc, const char *name, in
 void    program_lookup_rename(void *p, const char *name);
 void    copied_program_lookup_delete(Edje_Part_Collection *pc, const char *name);
 void    data_queue_copied_program_lookup(Edje_Part_Collection *pc, int *src, int *dest);
+void    copied_program_anonymous_lookup_delete(Edje_Part_Collection *pc, int *dest);
 void    data_queue_anonymous_lookup(Edje_Part_Collection *pc, Edje_Program *ep, int *dest);
 void    data_queue_copied_anonymous_lookup(Edje_Part_Collection *pc, int *src, int *dest);
 void    data_queue_image_lookup(char *name, int *dest, Eina_Bool *set);
index 00c693a..bacdcc0 100644 (file)
@@ -166,6 +166,7 @@ Eina_Bool current_group_inherit = EINA_FALSE;
 Eina_Bool script_override = EINA_FALSE;
 static Edje_Program *sequencing = NULL;
 static Eina_List *sequencing_lookups = NULL;
+static int *anonymous_delete = NULL;
 
 Eina_List *po_files;
 
@@ -5339,6 +5340,11 @@ _program_remove(const char *name, Edje_Program **pgrms, unsigned int count)
 
           _edje_program_remove(pc, pr);
 
+          if (pr->action == EDJE_ACTION_TYPE_SCRIPT)
+            {
+               anonymous_delete = &pr->id;
+            }
+
           _program_free(pr);
           return EINA_TRUE;
        }
@@ -5388,6 +5394,11 @@ st_collections_group_program_remove(void)
         success |= _program_remove(name, pc->programs.nocmp, pc->programs.nocmp_count);
 
         copied_program_lookup_delete(pc, name);
+        if (anonymous_delete)
+          {
+             copied_program_anonymous_lookup_delete(pc, anonymous_delete);
+             anonymous_delete = NULL;
+          }
         if (!success)
           {
              ERR("Attempted removal of nonexistent program '%s' in group '%s'.",
index 6c728e8..bdacc62 100644 (file)
@@ -2847,6 +2847,20 @@ data_queue_anonymous_lookup(Edje_Part_Collection *pc, Edje_Program *ep, int *des
 }
 
 void
+copied_program_anonymous_lookup_delete(Edje_Part_Collection *pc, int *dest)
+{
+   Program_Lookup *pl;
+   Eina_List *l, *ll;
+
+   EINA_LIST_FOREACH_SAFE(program_lookups, l, ll, pl)
+     {
+        if ((!pl->anonymous) || (pl->pc != pc) || (dest != &pl->u.ep->id)) continue;
+        program_lookups = eina_list_remove_list(program_lookups, l);
+        free(pl);
+     }
+}
+
+void
 data_queue_copied_anonymous_lookup(Edje_Part_Collection *pc, int *src, int *dest)
 {
    Eina_List *l;