From f3d5cee0e4260c5b7287eef37fba687551b4d6ed Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Sat, 22 Mar 2014 02:18:54 -0400 Subject: [PATCH] edje_cc can now use group.program_remove to remove inherited programs @feature --- src/bin/edje/edje_cc.h | 1 + src/bin/edje/edje_cc_handlers.c | 91 +++++++++++++++++++++++++++++++++ src/bin/edje/edje_cc_out.c | 15 ++++++ 3 files changed, 107 insertions(+) diff --git a/src/bin/edje/edje_cc.h b/src/bin/edje/edje_cc.h index 6f43260f49..c611af033e 100644 --- a/src/bin/edje/edje_cc.h +++ b/src/bin/edje/edje_cc.h @@ -157,6 +157,7 @@ void data_queue_part_reallocated_lookup(Edje_Part_Collection *pc, const char void data_queue_copied_part_lookup(Edje_Part_Collection *pc, int *src, int *dest); void *data_queue_program_lookup(Edje_Part_Collection *pc, const char *name, int *dest); 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 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); diff --git a/src/bin/edje/edje_cc_handlers.c b/src/bin/edje/edje_cc_handlers.c index eb7b0f9fb8..3b93d83138 100644 --- a/src/bin/edje/edje_cc_handlers.c +++ b/src/bin/edje/edje_cc_handlers.c @@ -195,6 +195,7 @@ static void ob_collections_group(void); static void st_collections_group_name(void); static void st_collections_group_inherit(void); static void st_collections_group_part_remove(void); +static void st_collections_group_program_remove(void); static void st_collections_group_script_only(void); static void st_collections_group_alias(void); static void st_collections_group_min(void); @@ -498,6 +499,7 @@ New_Statement_Handler statement_handlers[] = {"collections.group.name", st_collections_group_name}, {"collections.group.inherit", st_collections_group_inherit}, {"collections.group.part_remove", st_collections_group_part_remove}, + {"collections.group.program_remove", st_collections_group_program_remove}, {"collections.group.script_only", st_collections_group_script_only}, {"collections.group.lua_script_only", st_collections_group_script_only}, {"collections.group.alias", st_collections_group_alias}, @@ -3555,6 +3557,95 @@ st_collections_group_parts_part_inherit(void) free(name); } +static Eina_Bool +_program_remove(const char *name, Edje_Program **pgrms, unsigned int count) +{ + unsigned int i; + Edje_Part_Collection *pc; + + pc = eina_list_last_data_get(edje_collections); + + for (i = 0; i < count; ++i) + if (pgrms[i]->name && (!strcmp(name, pgrms[i]->name))) + { + Edje_Program_Target *prt; + Edje_Program_After *pa; + Edje_Program *pr = pgrms[i]; + + _edje_program_remove(pc, pgrms[i]); + + free((void*)pr->name); + free((void*)pr->signal); + free((void*)pr->source); + free((void*)pr->filter.part); + free((void*)pr->filter.state); + free((void*)pr->state); + free((void*)pr->state2); + free((void*)pr->sample_name); + free((void*)pr->tone_name); + EINA_LIST_FREE(pr->targets, prt); + free(prt); + EINA_LIST_FREE(pr->after, pa) + free(pa); + free(pr); + return EINA_TRUE; + } + return EINA_FALSE; +} + +/** + @page edcref + @property + program_remove + @parameters + [program name] [program name] [program name] ... + @effect + Removes the listed programs from an inherited group. Removing nonexistent + programs is not allowed. + This will break program sequences if a program in the middle of the sequence is removed. + @endproperty + @since 1.10 +*/ +static void +st_collections_group_program_remove(void) +{ + unsigned int n, argc; + Edje_Part_Collection *pc; + + check_min_arg_count(1); + + if (!current_group_inherit) + { + ERR("Cannot remove programs from non-inherited group '%s'", current_de->entry); + exit(-1); + } + + pc = eina_list_last_data_get(edje_collections); + + for (n = 0, argc = get_arg_count(); n < argc; n++) + { + char *name; + Eina_Bool success = EINA_FALSE; + + name = parse_str(n); + + success |= _program_remove(name, pc->programs.fnmatch, pc->programs.fnmatch_count); + success |= _program_remove(name, pc->programs.strcmp, pc->programs.strcmp_count); + success |= _program_remove(name, pc->programs.strncmp, pc->programs.strncmp_count); + success |= _program_remove(name, pc->programs.strrncmp, pc->programs.strrncmp_count); + success |= _program_remove(name, pc->programs.nocmp, pc->programs.nocmp_count); + + copied_program_lookup_delete(pc, name); + if (!success) + { + ERR("Attempted removal of nonexistent program '%s' in group '%s'.", + name, current_de->entry); + exit(-1); + } + free(name); + } +} + /** @page edcref @property diff --git a/src/bin/edje/edje_cc_out.c b/src/bin/edje/edje_cc_out.c index 05d3e4f915..4b303a56e1 100644 --- a/src/bin/edje/edje_cc_out.c +++ b/src/bin/edje/edje_cc_out.c @@ -2376,6 +2376,21 @@ program_lookup_rename(void *p, const char *name) pl->u.name = strdup(name); } +void +copied_program_lookup_delete(Edje_Part_Collection *pc, const char *name) +{ + Program_Lookup *pl; + Eina_List *l, *ll; + + EINA_LIST_FOREACH_SAFE(program_lookups, l, ll, pl) + { + if (pl->anonymous || (pl->pc != pc) || strcmp(pl->u.name, name)) continue; + free(pl->u.name); + program_lookups = eina_list_remove_list(program_lookups, l); + free(pl); + } +} + void data_queue_copied_program_lookup(Edje_Part_Collection *pc, int *src, int *dest) {