diff --git a/legacy/edje/src/bin/edje_cc.c b/legacy/edje/src/bin/edje_cc.c index c03f4d9cd3..54d16bf266 100644 --- a/legacy/edje/src/bin/edje_cc.c +++ b/legacy/edje/src/bin/edje_cc.c @@ -88,6 +88,7 @@ main(int argc, char **argv) edje_init(); edje_file = mem_alloc(SZ(Edje_File)); + edje_file->version = EDJE_FILE_VERSION; data_setup(); compile(); diff --git a/legacy/edje/src/bin/edje_cc_handlers.c b/legacy/edje/src/bin/edje_cc_handlers.c index f501c829ba..be15aa3147 100644 --- a/legacy/edje/src/bin/edje_cc_handlers.c +++ b/legacy/edje/src/bin/edje_cc_handlers.c @@ -1193,7 +1193,7 @@ ob_collections_group_programs_program(void) pc->programs = evas_list_append(pc->programs, ep); ep->id = evas_list_count(pc->programs) - 1; ep->tween.mode = EDJE_TWEEN_MODE_LINEAR; - ep->after = -1; + ep->after = NULL; } static void @@ -1346,10 +1346,16 @@ st_collections_group_programs_program_after(void) pc = evas_list_data(evas_list_last(edje_collections)); ep = evas_list_data(evas_list_last(pc->programs)); { + Edje_Program_After *pa; char *name; - + name = parse_str(0); - data_queue_program_lookup(pc, name, &(ep->after)); + + pa = mem_alloc(SZ(Edje_Program_After)); + pa->id = -1; + ep->after = evas_list_append(ep->after, pa); + + data_queue_program_lookup(pc, name, &(pa->id)); free(name); } } diff --git a/legacy/edje/src/bin/edje_main.c b/legacy/edje/src/bin/edje_main.c index 175f710a2f..fee156445a 100644 --- a/legacy/edje/src/bin/edje_main.c +++ b/legacy/edje/src/bin/edje_main.c @@ -490,13 +490,13 @@ list_head_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) static void cb (void *data, Evas_Object *o, const char *sig, const char *src) { -/* printf("CALLBACK for %p %p \"%s\" \"%s\"\n", data, o, sig, src);*/ + printf("CALLBACK for %p %p \"%s\" \"%s\"\n", data, o, sig, src); if (!strcmp(sig, "drag")) { double x, y; edje_object_part_drag_value_get(o, src, &x, &y); -/* printf("Drag %3.3f %3.3f\n", x, y);*/ + printf("Drag %3.3f %3.3f\n", x, y); } } diff --git a/legacy/edje/src/lib/Edje.h b/legacy/edje/src/lib/Edje.h index 47f64e468f..5f792b9d9a 100644 --- a/legacy/edje/src/lib/Edje.h +++ b/legacy/edje/src/lib/Edje.h @@ -15,6 +15,7 @@ #define EDJE_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED 4 #define EDJE_LOAD_ERROR_CORRUPT_FILE 5 #define EDJE_LOAD_ERROR_UNKNOWN_FORMAT 6 +#define EDJE_LOAD_ERROR_INCOMPATIBLE_FILE 7 #ifdef __cplusplus extern "C" { diff --git a/legacy/edje/src/lib/Edje_Edit.h b/legacy/edje/src/lib/Edje_Edit.h index 035d72bd1e..5a1b92f698 100644 --- a/legacy/edje/src/lib/Edje_Edit.h +++ b/legacy/edje/src/lib/Edje_Edit.h @@ -16,6 +16,7 @@ typedef struct _Edje_Image_Directory Edje_Image_Directory; typedef struct _Edje_Image_Directory_Entry Edje_Image_Directory_Entry; typedef struct _Edje_Program Edje_Program; typedef struct _Edje_Program_Target Edje_Program_Target; +typedef struct _Edje_Program_After Edje_Program_After; typedef struct _Edje_Part_Collection_Directory Edje_Part_Collection_Directory; typedef struct _Edje_Part_Collection_Directory_Entry Edje_Part_Collection_Directory_Entry; typedef struct _Edje_Part_Collection Edje_Part_Collection; @@ -127,6 +128,7 @@ struct _Edje_File Evas_Hash *collection_hash; int references; + int version; }; /*----------*/ @@ -180,7 +182,7 @@ struct _Edje_Program /* a conditional program to be run */ Evas_List *targets; /* list of target parts to apply the state to */ - int after; /* an action id to run at the end of this, for looping */ + Evas_List *after; /* list of actions to run at the end of this, for looping */ }; struct _Edje_Program_Target /* the target of an action */ @@ -188,6 +190,11 @@ struct _Edje_Program_Target /* the target of an action */ int id; /* just the part id no, or action id no */ }; +struct _Edje_Program_After /* the action to run after another action */ +{ + int id; +}; + /*----------*/ struct _Edje_Part_Collection_Directory diff --git a/legacy/edje/src/lib/edje_data.c b/legacy/edje/src/lib/edje_data.c index 7848b64ae2..8898255806 100644 --- a/legacy/edje/src/lib/edje_data.c +++ b/legacy/edje/src/lib/edje_data.c @@ -7,6 +7,7 @@ Eet_Data_Descriptor *_edje_edd_edje_image_directory = NULL; Eet_Data_Descriptor *_edje_edd_edje_image_directory_entry = NULL; Eet_Data_Descriptor *_edje_edd_edje_program = NULL; Eet_Data_Descriptor *_edje_edd_edje_program_target = NULL; +Eet_Data_Descriptor *_edje_edd_edje_program_after = NULL; Eet_Data_Descriptor *_edje_edd_edje_part_collection_directory = NULL; Eet_Data_Descriptor *_edje_edd_edje_part_collection_directory_entry = NULL; Eet_Data_Descriptor *_edje_edd_edje_part_collection = NULL; @@ -40,6 +41,7 @@ _edje_edd_free(void) FREED(_edje_edd_edje_image_directory_entry); FREED(_edje_edd_edje_program); FREED(_edje_edd_edje_program_target); + FREED(_edje_edd_edje_program_after); FREED(_edje_edd_edje_part_collection_directory); FREED(_edje_edd_edje_part_collection_directory_entry); FREED(_edje_edd_edje_part_collection); @@ -88,6 +90,7 @@ _edje_edd_setup(void) _edje_edd_edje_file = NEWD("Edje_File", Edje_File); + EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_file, Edje_File, "version", version, EET_T_INT); EET_DATA_DESCRIPTOR_ADD_SUB(_edje_edd_edje_file, Edje_File, "image_dir", image_dir, _edje_edd_edje_image_directory); EET_DATA_DESCRIPTOR_ADD_SUB(_edje_edd_edje_file, Edje_File, "collection_dir", collection_dir, _edje_edd_edje_part_collection_directory); EET_DATA_DESCRIPTOR_ADD_LIST(_edje_edd_edje_file, Edje_File, "data", data, _edje_edd_edje_data); @@ -97,7 +100,12 @@ _edje_edd_setup(void) NEWD("Edje_Program_Target", Edje_Program_Target); EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_program_target, Edje_Program_Target, "id", id, EET_T_INT); - + + _edje_edd_edje_program_after = + NEWD("Edje_Program_After", Edje_Program_After); + EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_program_after, + Edje_Program_After, "id", id, EET_T_INT); + _edje_edd_edje_program = NEWD("Edje_Program", Edje_Program); @@ -115,8 +123,8 @@ _edje_edd_setup(void) EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_program, Edje_Program, "tween.mode", tween.mode, EET_T_INT); EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_program, Edje_Program, "tween.time", tween.time, EET_T_DOUBLE); EET_DATA_DESCRIPTOR_ADD_LIST(_edje_edd_edje_program, Edje_Program, "targets", targets, _edje_edd_edje_program_target); - EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_program, Edje_Program, "after", after, EET_T_INT); - + EET_DATA_DESCRIPTOR_ADD_LIST(_edje_edd_edje_program, Edje_Program, "after", after, _edje_edd_edje_program_after); + _edje_edd_edje_part_image_id = NEWD("Edje_Part_Image_Id", Edje_Part_Image_Id); diff --git a/legacy/edje/src/lib/edje_load.c b/legacy/edje/src/lib/edje_load.c index 4cdb920b82..4d063b1ce4 100644 --- a/legacy/edje/src/lib/edje_load.c +++ b/legacy/edje/src/lib/edje_load.c @@ -360,6 +360,14 @@ _edje_file_add(Edje *ed) goto out; } + if (ed->file->version != EDJE_FILE_VERSION) + { + _edje_file_free(ed->file); + ed->file = NULL; + ed->load_error = EDJE_LOAD_ERROR_INCOMPATIBLE_FILE; + goto out; + } + ed->file->references = 1; ed->file->path = strdup(ed->path); if (!ed->file->collection_dir) @@ -577,6 +585,14 @@ _edje_collection_free(Edje *ed, Edje_Part_Collection *ec) pr->targets = evas_list_remove(pr->targets, prt); free(prt); } + while (pr->after) + { + Edje_Program_After *pa; + + pa = pr->after->data; + pr->after = evas_list_remove(pr->after, pa); + free(pa); + } free(pr); } while (ec->parts) diff --git a/legacy/edje/src/lib/edje_main.c b/legacy/edje/src/lib/edje_main.c index 47fc58c4cf..9e3bb04a1d 100644 --- a/legacy/edje/src/lib/edje_main.c +++ b/legacy/edje/src/lib/edje_main.c @@ -55,6 +55,26 @@ _edje_del(Edje *ed) ed->path = NULL; if (ed->part) free(ed->part); ed->part = NULL; + if ((ed->actions) || (ed->pending_actions)) + { + _edje_animators = evas_list_remove(_edje_animators, ed); + } + while (ed->actions) + { + Edje_Running_Program *runp; + + runp = ed->actions->data; + ed->actions = evas_list_remove(ed->actions, runp); + free(runp); + } + while (ed->pending_actions) + { + Edje_Pending_Program *pp; + + pp = ed->pending_actions->data; + ed->pending_actions = evas_list_remove(ed->pending_actions, pp); + free(pp); + } while (ed->callbacks) { Edje_Signal_Callback *escb; diff --git a/legacy/edje/src/lib/edje_private.h b/legacy/edje/src/lib/edje_private.h index 39162ba822..c22dd0ffce 100644 --- a/legacy/edje/src/lib/edje_private.h +++ b/legacy/edje/src/lib/edje_private.h @@ -17,6 +17,11 @@ #include "Edje_Edit.h" +/* increment this when the EET data descriptors have changed and old + * EETs cannot be loaded/used correctly anymore. + */ +#define EDJE_FILE_VERSION 1 + /* FIXME: * * more example edje files diff --git a/legacy/edje/src/lib/edje_program.c b/legacy/edje/src/lib/edje_program.c index 540d9f126e..092f653411 100644 --- a/legacy/edje/src/lib/edje_program.c +++ b/legacy/edje/src/lib/edje_program.c @@ -268,17 +268,20 @@ _edje_program_run_iterate(Edje_Running_Program *runp, double tim) if (!ed->walking_actions) free(runp); goto break_prog; } - if (runp->program->after >= 0) + for (l = runp->program->after; l; l = l->next) { Edje_Program *pr; + Edje_Program_After *pa = l->data; - pr = evas_list_nth(ed->collection->programs, - runp->program->after); - if (pr) _edje_program_run(ed, pr, 0); - if (_edje_block_break(ed)) + if (pa->id >= 0) { - if (!ed->walking_actions) free(runp); - goto break_prog; + pr = evas_list_nth(ed->collection->programs, pa->id); + if (pr) _edje_program_run(ed, pr, 0); + if (_edje_block_break(ed)) + { + if (!ed->walking_actions) free(runp); + goto break_prog; + } } } _edje_thaw(ed); @@ -330,10 +333,10 @@ _edje_program_end(Edje *ed, Edje_Running_Program *runp) { _edje_anim_count--; ed->actions = evas_list_remove(ed->actions, runp); + free(runp); if (!ed->actions) { _edje_animators = evas_list_remove(_edje_animators, ed); - free(runp); } } _edje_emit(ed, "program,stop", pname); @@ -409,7 +412,11 @@ _edje_program_run(Edje *ed, Edje_Program *pr, int force) } } _edje_emit(ed, "program,start", pr->name); - if (_edje_block_break(ed)) goto break_prog; + if (_edje_block_break(ed)) + { + ed->actions = evas_list_append(ed->actions, runp); + goto break_prog; + } if (!ed->actions) _edje_animators = evas_list_append(_edje_animators, ed); ed->actions = evas_list_append(ed->actions, runp); @@ -445,14 +452,18 @@ _edje_program_run(Edje *ed, Edje_Program *pr, int force) if (_edje_block_break(ed)) goto break_prog; _edje_emit(ed, "program,stop", pr->name); if (_edje_block_break(ed)) goto break_prog; - if (pr->after >= 0) + + for (l = pr->after; l; l = l->next) { Edje_Program *pr2; - - pr2 = evas_list_nth(ed->collection->programs, - pr->after); - if (pr2) _edje_program_run(ed, pr2, 0); - if (_edje_block_break(ed)) goto break_prog; + Edje_Program_After *pa = l->data; + + if (pa->id >= 0) + { + pr2 = evas_list_nth(ed->collection->programs, pa->id); + if (pr2) _edje_program_run(ed, pr2, 0); + if (_edje_block_break(ed)) goto break_prog; + } } _edje_recalc(ed); } @@ -591,13 +602,17 @@ _edje_program_run(Edje *ed, Edje_Program *pr, int force) /* && (pr->tween.time > 0.0) && (!ed->no_anim))) */ )) { - if (pr->after >= 0) + for (l= pr->after; l; l = l->next) { Edje_Program *pr2; + Edje_Program_After *pa = l->data; - pr2 = evas_list_nth(ed->collection->programs, pr->after); - if (pr2) _edje_program_run(ed, pr2, 0); - if (_edje_block_break(ed)) goto break_prog; + if (pa->id >= 0) + { + pr2 = evas_list_nth(ed->collection->programs, pa->id); + if (pr2) _edje_program_run(ed, pr2, 0); + if (_edje_block_break(ed)) goto break_prog; + } } } break_prog: diff --git a/legacy/edje/src/lib/edje_smart.c b/legacy/edje/src/lib/edje_smart.c index 265d9f52c4..c7017871d8 100644 --- a/legacy/edje/src/lib/edje_smart.c +++ b/legacy/edje/src/lib/edje_smart.c @@ -316,7 +316,8 @@ _edje_smart_hide(Evas_Object * obj) ed = evas_object_smart_data_get(obj); if (!ed) return; if (!evas_object_visible_get(obj)) return; - evas_object_hide(ed->clipper); + if ((ed->collection) && (ed->parts)) + evas_object_hide(ed->clipper); _edje_emit(ed, "hide", ""); }