diff --git a/src/bin/exactness.c b/src/bin/exactness.c index 6a31336..5323046 100644 --- a/src/bin/exactness.c +++ b/src/bin/exactness.c @@ -36,7 +36,7 @@ typedef enum static unsigned short _running_jobs = 0, _max_jobs = 1; static Eina_List *_base_dirs = NULL; static char *_dest_dir; -static char *_wrap_command = NULL; +static char *_wrap_command = NULL, *_fonts_dir = NULL; static int _verbose = 0; static Eina_Bool _scan_objs = EINA_FALSE; @@ -226,9 +226,10 @@ _run_command_prepare(const List_Entry *ent, char *buf) ok: sbuf = eina_strbuf_new(); eina_strbuf_append_printf(sbuf, - "%s %s exactness_play %s %s%.*s %s-t '%s' ", + "%s %s exactness_play %s %s%s %s%.*s %s-t '%s' ", CONFIG, _wrap_command ? _wrap_command : "", _mode == RUN_SIMULATION ? "-s" : "", + _fonts_dir ? "-f " : "", _fonts_dir ? _fonts_dir : "", _verbose ? "-" : "", _verbose, "vvvvvvvvvv", _scan_objs ? "--scan-objects " : "", scn_path @@ -458,6 +459,7 @@ static const Ecore_Getopt optdesc = { ECORE_GETOPT_STORE_TRUE('i', "init", "Run in init mode."), ECORE_GETOPT_STORE_TRUE('s', "simulation", "Run in simulation mode."), ECORE_GETOPT_STORE_TRUE(0, "scan-objects", "Extract information of all the objects at every shot."), + ECORE_GETOPT_STORE_STR('f', "fonts-dir", "Specify a directory of the fonts that should be used."), ECORE_GETOPT_COUNT('v', "verbose", "Turn verbose messages on."), ECORE_GETOPT_LICENSE('L', "license"), @@ -489,6 +491,7 @@ main(int argc, char *argv[]) ECORE_GETOPT_VALUE_BOOL(mode_init), ECORE_GETOPT_VALUE_BOOL(mode_simulation), ECORE_GETOPT_VALUE_BOOL(scan_objs), + ECORE_GETOPT_VALUE_STR(_fonts_dir), ECORE_GETOPT_VALUE_INT(_verbose), ECORE_GETOPT_VALUE_BOOL(want_quit), diff --git a/src/bin/inspect.c b/src/bin/inspect.c index 42f3a0d..1b3e953 100644 --- a/src/bin/inspect.c +++ b/src/bin/inspect.c @@ -21,6 +21,7 @@ typedef enum { + EX_FONTS_DIR, EX_SCENARIO, EX_IMAGE, EX_OBJ_INFO @@ -296,12 +297,37 @@ _grp_text_get(void *data, Evas_Object *gl, const char *part EINA_UNUSED) _Data_Type dt = (_Data_Type) data; switch (dt) { + case EX_FONTS_DIR: + { + char buf2[256]; + if (!compare) + { + Exactness_Unit *unit = efl_key_data_get(gl, "unit"); + sprintf(buf2, "Fonts directory: %s", unit->fonts_path?unit->fonts_path:"None"); + } + else + { + Eo *gl1 = eina_list_nth(_gls, 0); + Eo *gl2 = eina_list_nth(_gls, 1); + Exactness_Unit *unit1 = efl_key_data_get(gl1, "unit"); + Exactness_Unit *unit2 = efl_key_data_get(gl2, "unit"); + if (!!unit1->fonts_path ^ !!unit2->fonts_path) + sprintf(buf2, "Fonts directory comparison: XXXXX"); + else if (!strcmp(unit1->fonts_path, unit2->fonts_path)) + sprintf(buf2, "Fonts directory comparison: %s", unit1->fonts_path); + else + sprintf(buf2, "Fonts directory comparison: "LDIFF(%s)"/"RDIFF(%s), + unit1->fonts_path, unit2->fonts_path); + } + return strdup(buf2); + } case EX_SCENARIO: { str = "Scenario"; break; } case EX_IMAGE: { str = "Images"; break; } case EX_OBJ_INFO: { str = "Objects"; break; } default: { str = "Unknown"; break; } } sprintf(buf, "%s%s", str, compare ? " comparison" : ""); + if (dt == EX_FONTS_DIR) eina_stringshare_del(str); return strdup(buf); } @@ -916,6 +942,17 @@ _gui_unit_display(Exactness_Unit *unit1, Exactness_Unit *unit2) } _itc_init(); + if (unit1->fonts_path || (unit2 && unit2->fonts_path)) + { + if (!_show_only_diffs || !unit1 || !unit2 || + !unit1->fonts_path || !unit2->fonts_path || + strcmp(unit1->fonts_path, unit2->fonts_path)) + { + elm_genlist_item_append(gl1, _grp_itc, (void *)EX_FONTS_DIR, NULL, ELM_GENLIST_ITEM_GROUP, NULL, NULL); + elm_genlist_item_append(gl2, _grp_itc, (void *)EX_FONTS_DIR, NULL, ELM_GENLIST_ITEM_GROUP, NULL, NULL); + elm_genlist_item_append(glc, _grp_itc, (void *)EX_FONTS_DIR, NULL, ELM_GENLIST_ITEM_GROUP, NULL, NULL); + } + } itr1 = unit1 ? unit1->actions : NULL; itr2 = unit2 ? unit2->actions : NULL; @@ -1283,6 +1320,7 @@ main(int argc, char *argv[]) { Exactness_Action *act; Eina_List *itr; + if (unit->fonts_path) printf("Fonts dir: %s\n", unit->fonts_path); EINA_LIST_FOREACH(unit->actions, itr, act) { char specific_output[1024]; diff --git a/src/bin/player.c b/src/bin/player.c index 632af49..0fd10b9 100644 --- a/src/bin/player.c +++ b/src/bin/player.c @@ -819,36 +819,32 @@ _prg_invoke(const char *full_path, int argc, char **argv) return 1; } - if (_src_open()) + if (efl_main) { - if (efl_main) - { - elm_init(argc, argv); - elm_theme_overlay_add(NULL, DATA_DIR"/exactness_play.edj"); - efl_event_callback_add(efl_main_loop_get(), EFL_LOOP_EVENT_ARGUMENTS, efl_main, NULL); - ret__ = efl_loop_begin(efl_main_loop_get()); - real__ = efl_loop_exit_code_process(ret__); - elm_shutdown(); - } - else if (elm_main) - { - elm_init(argc, argv); - elm_theme_overlay_add(NULL, DATA_DIR"/exactness_play.edj"); - real__ = elm_main(argc, argv); - elm_shutdown(); - } - else if (c_main) - { - real__ = c_main(argc, argv); - } - else - { - fprintf(stderr, "Failed loading symbol 'efl_main', 'elm_main' or 'main' from %s.\n", full_path); - eina_module_free(h); - real__ = 1; - } + elm_init(argc, argv); + elm_theme_overlay_add(NULL, DATA_DIR"/exactness_play.edj"); + efl_event_callback_add(efl_main_loop_get(), EFL_LOOP_EVENT_ARGUMENTS, efl_main, NULL); + ret__ = efl_loop_begin(efl_main_loop_get()); + real__ = efl_loop_exit_code_process(ret__); + elm_shutdown(); + } + else if (elm_main) + { + elm_init(argc, argv); + elm_theme_overlay_add(NULL, DATA_DIR"/exactness_play.edj"); + real__ = elm_main(argc, argv); + elm_shutdown(); + } + else if (c_main) + { + real__ = c_main(argc, argv); + } + else + { + fprintf(stderr, "Failed loading symbol 'efl_main', 'elm_main' or 'main' from %s.\n", full_path); + eina_module_free(h); + real__ = 1; } - else real__ = 1; return real__; } @@ -938,6 +934,7 @@ static const Ecore_Getopt optdesc = { ECORE_GETOPT_STORE_TRUE(0, "scan-objects", "Extract information of all the objects at every shot."), ECORE_GETOPT_STORE_TRUE(0, "external-injection", "Expect events injection via Eina debug channel."), ECORE_GETOPT_STORE_TRUE(0, "disable-screenshots", "Disable screenshots."), + ECORE_GETOPT_STORE_STR('f', "fonts-dir", "Specify a directory of the fonts that should be used."), ECORE_GETOPT_COUNT('v', "verbose", "Turn verbose messages on."), ECORE_GETOPT_LICENSE('L', "license"), @@ -952,6 +949,8 @@ int main(int argc, char **argv) { int pret = 1, opt_args = 0; char *src = NULL, *dest = NULL, *eq; + char *fonts_dir = NULL; + const char *chosen_fonts = NULL; Eina_Bool show_on_screen = EINA_FALSE; Eina_Bool want_quit = EINA_FALSE, external_injection = EINA_FALSE; @@ -962,6 +961,7 @@ int main(int argc, char **argv) ECORE_GETOPT_VALUE_BOOL(_scan_objects), ECORE_GETOPT_VALUE_BOOL(external_injection), ECORE_GETOPT_VALUE_BOOL(_disable_shots), + ECORE_GETOPT_VALUE_STR(fonts_dir), ECORE_GETOPT_VALUE_INT(_verbose), ECORE_GETOPT_VALUE_BOOL(want_quit), @@ -1067,7 +1067,6 @@ int main(int argc, char **argv) goto end; } - if (!show_on_screen) setenv("ELM_ENGINE", "buffer", 1); if (!argv[opt_args]) { fprintf(stderr, "no program specified\nUse -h for more information\n"); @@ -1076,6 +1075,53 @@ int main(int argc, char **argv) if (_dest_type == FTYPE_EXU) _dest_unit = calloc(1, sizeof(*_dest_unit)); + if (!_src_open()) + { + fprintf(stderr, "Unable to read source file\n"); + goto end; + } + + if (!show_on_screen) setenv("ELM_ENGINE", "buffer", 1); + if (_src_unit && _src_unit->fonts_path) + { + char buf[PATH_]; + if (!fonts_dir) fonts_dir = "./fonts"; + sprintf(buf, "%s/%s", fonts_dir, _src_unit->fonts_path); + if (!ecore_file_exists(buf)) + { + fprintf(stderr, "Unable to use the fonts path '%s' provided in %s\n", + _src_unit->fonts_path, _src_filename); + goto end; + } + chosen_fonts = _src_unit->fonts_path; + } + if (fonts_dir) + { + Eina_Tmpstr *fonts_conf_name = NULL; + if (!ecore_file_exists(fonts_dir)) + { + fprintf(stderr, "Unable to find fonts directory %s\n", fonts_dir); + goto end; + } + if (!chosen_fonts) + { + Eina_List *dated_fonts = ecore_file_ls(fonts_dir); + char *date_dir; + chosen_fonts = eina_stringshare_add(eina_list_last_data_get(dated_fonts)); + EINA_LIST_FREE(dated_fonts, date_dir) free(date_dir); + } + if (chosen_fonts) + { + int tmp_fd = eina_file_mkstemp("/tmp/fonts_XXXXXX.conf", &fonts_conf_name); + dprintf(tmp_fd, + "\n\n\n" + "%s/%s\n\n", + fonts_dir, chosen_fonts); + close(tmp_fd); + + setenv("FONTCONFIG_FILE", fonts_conf_name, 1); + } + } efl_object_init(); evas_init(); diff --git a/src/bin/recorder.c b/src/bin/recorder.c index f6a1c99..d3a875e 100644 --- a/src/bin/recorder.c +++ b/src/bin/recorder.c @@ -362,6 +362,7 @@ static const Ecore_Getopt optdesc = { 1, { ECORE_GETOPT_STORE_STR('t', "test", "Name of the filename where to store the test."), + ECORE_GETOPT_STORE_STR('f', "fonts-dir", "Specify a directory of the fonts that should be used."), ECORE_GETOPT_COUNT('v', "verbose", "Turn verbose messages on."), ECORE_GETOPT_LICENSE('L', "license"), @@ -375,11 +376,13 @@ static const Ecore_Getopt optdesc = { int main(int argc, char **argv) { char *dest = NULL, *eq; + char *fonts_dir = NULL; int pret = 1, opt_args = 0; Eina_Bool want_quit = EINA_FALSE; Ecore_Getopt_Value values[] = { ECORE_GETOPT_VALUE_STR(dest), + ECORE_GETOPT_VALUE_STR(fonts_dir), ECORE_GETOPT_VALUE_INT(_verbose), ECORE_GETOPT_VALUE_BOOL(want_quit), @@ -462,6 +465,36 @@ int main(int argc, char **argv) efl_object_init(); evas_init(); + if (!_unit) + { + _unit = calloc(1, sizeof(*_unit)); + } + + if (fonts_dir) + { + Eina_Tmpstr *fonts_conf_name = NULL; + if (!ecore_file_exists(fonts_dir)) + { + fprintf(stderr, "Unable to find fonts directory %s\n", fonts_dir); + goto end; + } + Eina_List *dated_fonts = ecore_file_ls(fonts_dir); + char *date_dir; + _unit->fonts_path = strdup(eina_list_last_data_get(dated_fonts)); + EINA_LIST_FREE(dated_fonts, date_dir) free(date_dir); + if (_unit->fonts_path) + { + int tmp_fd = eina_file_mkstemp("/tmp/fonts_XXXXXX.conf", &fonts_conf_name); + dprintf(tmp_fd, + "\n\n\n" + "%s/%s\n\n", + fonts_dir, _unit->fonts_path); + close(tmp_fd); + + setenv("FONTCONFIG_FILE", fonts_conf_name, 1); + } + } + /* Replace the current command line to hide the Exactness part */ int len = argv[argc - 1] + strlen(argv[argc - 1]) - argv[opt_args]; memcpy(argv[0], argv[opt_args], len); @@ -481,11 +514,6 @@ int main(int argc, char **argv) if (!_shot_key) _shot_key = getenv("SHOT_KEY"); if (!_shot_key) _shot_key = SHOT_KEY_STR; - if (!_unit) - { - _unit = calloc(1, sizeof(*_unit)); - } - ecore_evas_callback_new_set(_my_evas_new); _last_timestamp = ecore_time_get() * 1000; pret = _prg_invoke(_prg_full_path_guess(argv[0]), argc - opt_args, argv); diff --git a/src/lib/Exactness.h b/src/lib/Exactness.h index 84c04b0..5392d04 100644 --- a/src/lib/Exactness.h +++ b/src/lib/Exactness.h @@ -192,6 +192,7 @@ typedef struct /* imgs not in EET */ Eina_List *imgs; /**< List of Exactness_Image */ Eina_List *objs; /**< List of Exactness_Objects */ + const char *fonts_path; /**< Path to the fonts to use, relative to the fonts dir given in parameter to the player/recorder */ int nb_shots; /**< The number of shots present in the unit */ } Exactness_Unit; diff --git a/src/lib/unit.c b/src/lib/unit.c index 8ef4d32..0977d86 100644 --- a/src/lib/unit.c +++ b/src/lib/unit.c @@ -243,6 +243,7 @@ _unit_desc_make(void) unit_d = eet_data_descriptor_stream_new(&eddc); EET_DATA_DESCRIPTOR_ADD_LIST(unit_d, Exactness_Unit, "actions", actions, action_d); EET_DATA_DESCRIPTOR_ADD_LIST(unit_d, Exactness_Unit, "objs", objs, objs_d); + EET_DATA_DESCRIPTOR_ADD_BASIC(unit_d, Exactness_Unit, "fonts_path", fonts_path, EET_T_STRING); EET_DATA_DESCRIPTOR_ADD_BASIC(unit_d, Exactness_Unit, "nb_shots", nb_shots, EET_T_UINT); }