summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Zaoui <daniel.zaoui@yahoo.com>2018-06-04 23:59:02 +0300
committerDaniel Zaoui <daniel.zaoui@yahoo.com>2018-06-05 00:06:18 +0300
commit0e1f0cf1c5f7766f5228e74bbbc718a4e898660c (patch)
treef28279497d5d42d45033a853a10311b07af8d84a
parent621dac67ce8ed95200f28e8312c662a7c250cdbc (diff)
Exactness: add fonts support
One of the biggest issue in Exactness is related to the system configuration differences. Among them, the fonts can for example impact on the height of the widgets. The solution to not be dependent on the fonts consist in using embedded fonts and to force their usage when playing the applications. The -f option has been added to the player and the recorder so the user can provide the path to a fonts directory. This option must be set in order to force the fonts replacement. Since tests shots can use different fonts, the exu file stores the version of fonts that have been used. This is why it is needed to have in the provided directory different directories, each pointing to a different version of the fonts. For example, some old tests can use fonts of 2017 (e.g directory 20170101) while new tests will use new fonts (20180601). Check the exactness-elm-data repository (fonts branch) for a better understanding. During recording, the -f option will apply the indicated fonts on the launched application and will record the mouse events accordingly. The fonts datestamp is stored in the exu output. During playing, the fonts will be loaded by reading the exu fonts path, and then the application is launched. If no information is provided in the exu but -f is used, the tool will load the most recent fonts (by comparing the datestamp directories).
-rw-r--r--src/bin/exactness.c7
-rw-r--r--src/bin/inspect.c38
-rw-r--r--src/bin/player.c104
-rw-r--r--src/bin/recorder.c38
-rw-r--r--src/lib/Exactness.h1
-rw-r--r--src/lib/unit.c1
6 files changed, 153 insertions, 36 deletions
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
36static unsigned short _running_jobs = 0, _max_jobs = 1; 36static unsigned short _running_jobs = 0, _max_jobs = 1;
37static Eina_List *_base_dirs = NULL; 37static Eina_List *_base_dirs = NULL;
38static char *_dest_dir; 38static char *_dest_dir;
39static char *_wrap_command = NULL; 39static char *_wrap_command = NULL, *_fonts_dir = NULL;
40static int _verbose = 0; 40static int _verbose = 0;
41static Eina_Bool _scan_objs = EINA_FALSE; 41static Eina_Bool _scan_objs = EINA_FALSE;
42 42
@@ -226,9 +226,10 @@ _run_command_prepare(const List_Entry *ent, char *buf)
226ok: 226ok:
227 sbuf = eina_strbuf_new(); 227 sbuf = eina_strbuf_new();
228 eina_strbuf_append_printf(sbuf, 228 eina_strbuf_append_printf(sbuf,
229 "%s %s exactness_play %s %s%.*s %s-t '%s' ", 229 "%s %s exactness_play %s %s%s %s%.*s %s-t '%s' ",
230 CONFIG, _wrap_command ? _wrap_command : "", 230 CONFIG, _wrap_command ? _wrap_command : "",
231 _mode == RUN_SIMULATION ? "-s" : "", 231 _mode == RUN_SIMULATION ? "-s" : "",
232 _fonts_dir ? "-f " : "", _fonts_dir ? _fonts_dir : "",
232 _verbose ? "-" : "", _verbose, "vvvvvvvvvv", 233 _verbose ? "-" : "", _verbose, "vvvvvvvvvv",
233 _scan_objs ? "--scan-objects " : "", 234 _scan_objs ? "--scan-objects " : "",
234 scn_path 235 scn_path
@@ -458,6 +459,7 @@ static const Ecore_Getopt optdesc = {
458 ECORE_GETOPT_STORE_TRUE('i', "init", "Run in init mode."), 459 ECORE_GETOPT_STORE_TRUE('i', "init", "Run in init mode."),
459 ECORE_GETOPT_STORE_TRUE('s', "simulation", "Run in simulation mode."), 460 ECORE_GETOPT_STORE_TRUE('s', "simulation", "Run in simulation mode."),
460 ECORE_GETOPT_STORE_TRUE(0, "scan-objects", "Extract information of all the objects at every shot."), 461 ECORE_GETOPT_STORE_TRUE(0, "scan-objects", "Extract information of all the objects at every shot."),
462 ECORE_GETOPT_STORE_STR('f', "fonts-dir", "Specify a directory of the fonts that should be used."),
461 ECORE_GETOPT_COUNT('v', "verbose", "Turn verbose messages on."), 463 ECORE_GETOPT_COUNT('v', "verbose", "Turn verbose messages on."),
462 464
463 ECORE_GETOPT_LICENSE('L', "license"), 465 ECORE_GETOPT_LICENSE('L', "license"),
@@ -489,6 +491,7 @@ main(int argc, char *argv[])
489 ECORE_GETOPT_VALUE_BOOL(mode_init), 491 ECORE_GETOPT_VALUE_BOOL(mode_init),
490 ECORE_GETOPT_VALUE_BOOL(mode_simulation), 492 ECORE_GETOPT_VALUE_BOOL(mode_simulation),
491 ECORE_GETOPT_VALUE_BOOL(scan_objs), 493 ECORE_GETOPT_VALUE_BOOL(scan_objs),
494 ECORE_GETOPT_VALUE_STR(_fonts_dir),
492 ECORE_GETOPT_VALUE_INT(_verbose), 495 ECORE_GETOPT_VALUE_INT(_verbose),
493 496
494 ECORE_GETOPT_VALUE_BOOL(want_quit), 497 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 @@
21 21
22typedef enum 22typedef enum
23{ 23{
24 EX_FONTS_DIR,
24 EX_SCENARIO, 25 EX_SCENARIO,
25 EX_IMAGE, 26 EX_IMAGE,
26 EX_OBJ_INFO 27 EX_OBJ_INFO
@@ -296,12 +297,37 @@ _grp_text_get(void *data, Evas_Object *gl, const char *part EINA_UNUSED)
296 _Data_Type dt = (_Data_Type) data; 297 _Data_Type dt = (_Data_Type) data;
297 switch (dt) 298 switch (dt)
298 { 299 {
300 case EX_FONTS_DIR:
301 {
302 char buf2[256];
303 if (!compare)
304 {
305 Exactness_Unit *unit = efl_key_data_get(gl, "unit");
306 sprintf(buf2, "Fonts directory: %s", unit->fonts_path?unit->fonts_path:"None");
307 }
308 else
309 {
310 Eo *gl1 = eina_list_nth(_gls, 0);
311 Eo *gl2 = eina_list_nth(_gls, 1);
312 Exactness_Unit *unit1 = efl_key_data_get(gl1, "unit");
313 Exactness_Unit *unit2 = efl_key_data_get(gl2, "unit");
314 if (!!unit1->fonts_path ^ !!unit2->fonts_path)
315 sprintf(buf2, "Fonts directory comparison: XXXXX");
316 else if (!strcmp(unit1->fonts_path, unit2->fonts_path))
317 sprintf(buf2, "Fonts directory comparison: %s", unit1->fonts_path);
318 else
319 sprintf(buf2, "Fonts directory comparison: "LDIFF(%s)"/"RDIFF(%s),
320 unit1->fonts_path, unit2->fonts_path);
321 }
322 return strdup(buf2);
323 }
299 case EX_SCENARIO: { str = "Scenario"; break; } 324 case EX_SCENARIO: { str = "Scenario"; break; }
300 case EX_IMAGE: { str = "Images"; break; } 325 case EX_IMAGE: { str = "Images"; break; }
301 case EX_OBJ_INFO: { str = "Objects"; break; } 326 case EX_OBJ_INFO: { str = "Objects"; break; }
302 default: { str = "Unknown"; break; } 327 default: { str = "Unknown"; break; }
303 } 328 }
304 sprintf(buf, "%s%s", str, compare ? " comparison" : ""); 329 sprintf(buf, "%s%s", str, compare ? " comparison" : "");
330 if (dt == EX_FONTS_DIR) eina_stringshare_del(str);
305 return strdup(buf); 331 return strdup(buf);
306} 332}
307 333
@@ -916,6 +942,17 @@ _gui_unit_display(Exactness_Unit *unit1, Exactness_Unit *unit2)
916 } 942 }
917 _itc_init(); 943 _itc_init();
918 944
945 if (unit1->fonts_path || (unit2 && unit2->fonts_path))
946 {
947 if (!_show_only_diffs || !unit1 || !unit2 ||
948 !unit1->fonts_path || !unit2->fonts_path ||
949 strcmp(unit1->fonts_path, unit2->fonts_path))
950 {
951 elm_genlist_item_append(gl1, _grp_itc, (void *)EX_FONTS_DIR, NULL, ELM_GENLIST_ITEM_GROUP, NULL, NULL);
952 elm_genlist_item_append(gl2, _grp_itc, (void *)EX_FONTS_DIR, NULL, ELM_GENLIST_ITEM_GROUP, NULL, NULL);
953 elm_genlist_item_append(glc, _grp_itc, (void *)EX_FONTS_DIR, NULL, ELM_GENLIST_ITEM_GROUP, NULL, NULL);
954 }
955 }
919 itr1 = unit1 ? unit1->actions : NULL; 956 itr1 = unit1 ? unit1->actions : NULL;
920 itr2 = unit2 ? unit2->actions : NULL; 957 itr2 = unit2 ? unit2->actions : NULL;
921 958
@@ -1283,6 +1320,7 @@ main(int argc, char *argv[])
1283 { 1320 {
1284 Exactness_Action *act; 1321 Exactness_Action *act;
1285 Eina_List *itr; 1322 Eina_List *itr;
1323 if (unit->fonts_path) printf("Fonts dir: %s\n", unit->fonts_path);
1286 EINA_LIST_FOREACH(unit->actions, itr, act) 1324 EINA_LIST_FOREACH(unit->actions, itr, act)
1287 { 1325 {
1288 char specific_output[1024]; 1326 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)
819 return 1; 819 return 1;
820 } 820 }
821 821
822 if (_src_open()) 822 if (efl_main)
823 { 823 {
824 if (efl_main) 824 elm_init(argc, argv);
825 { 825 elm_theme_overlay_add(NULL, DATA_DIR"/exactness_play.edj");
826 elm_init(argc, argv); 826 efl_event_callback_add(efl_main_loop_get(), EFL_LOOP_EVENT_ARGUMENTS, efl_main, NULL);
827 elm_theme_overlay_add(NULL, DATA_DIR"/exactness_play.edj"); 827 ret__ = efl_loop_begin(efl_main_loop_get());
828 efl_event_callback_add(efl_main_loop_get(), EFL_LOOP_EVENT_ARGUMENTS, efl_main, NULL); 828 real__ = efl_loop_exit_code_process(ret__);
829 ret__ = efl_loop_begin(efl_main_loop_get()); 829 elm_shutdown();
830 real__ = efl_loop_exit_code_process(ret__); 830 }
831 elm_shutdown(); 831 else if (elm_main)
832 } 832 {
833 else if (elm_main) 833 elm_init(argc, argv);
834 { 834 elm_theme_overlay_add(NULL, DATA_DIR"/exactness_play.edj");
835 elm_init(argc, argv); 835 real__ = elm_main(argc, argv);
836 elm_theme_overlay_add(NULL, DATA_DIR"/exactness_play.edj"); 836 elm_shutdown();
837 real__ = elm_main(argc, argv); 837 }
838 elm_shutdown(); 838 else if (c_main)
839 } 839 {
840 else if (c_main) 840 real__ = c_main(argc, argv);
841 { 841 }
842 real__ = c_main(argc, argv); 842 else
843 } 843 {
844 else 844 fprintf(stderr, "Failed loading symbol 'efl_main', 'elm_main' or 'main' from %s.\n", full_path);
845 { 845 eina_module_free(h);
846 fprintf(stderr, "Failed loading symbol 'efl_main', 'elm_main' or 'main' from %s.\n", full_path); 846 real__ = 1;
847 eina_module_free(h);
848 real__ = 1;
849 }
850 } 847 }
851 else real__ = 1;
852 848
853 return real__; 849 return real__;
854} 850}
@@ -938,6 +934,7 @@ static const Ecore_Getopt optdesc = {
938 ECORE_GETOPT_STORE_TRUE(0, "scan-objects", "Extract information of all the objects at every shot."), 934 ECORE_GETOPT_STORE_TRUE(0, "scan-objects", "Extract information of all the objects at every shot."),
939 ECORE_GETOPT_STORE_TRUE(0, "external-injection", "Expect events injection via Eina debug channel."), 935 ECORE_GETOPT_STORE_TRUE(0, "external-injection", "Expect events injection via Eina debug channel."),
940 ECORE_GETOPT_STORE_TRUE(0, "disable-screenshots", "Disable screenshots."), 936 ECORE_GETOPT_STORE_TRUE(0, "disable-screenshots", "Disable screenshots."),
937 ECORE_GETOPT_STORE_STR('f', "fonts-dir", "Specify a directory of the fonts that should be used."),
941 ECORE_GETOPT_COUNT('v', "verbose", "Turn verbose messages on."), 938 ECORE_GETOPT_COUNT('v', "verbose", "Turn verbose messages on."),
942 939
943 ECORE_GETOPT_LICENSE('L', "license"), 940 ECORE_GETOPT_LICENSE('L', "license"),
@@ -952,6 +949,8 @@ int main(int argc, char **argv)
952{ 949{
953 int pret = 1, opt_args = 0; 950 int pret = 1, opt_args = 0;
954 char *src = NULL, *dest = NULL, *eq; 951 char *src = NULL, *dest = NULL, *eq;
952 char *fonts_dir = NULL;
953 const char *chosen_fonts = NULL;
955 Eina_Bool show_on_screen = EINA_FALSE; 954 Eina_Bool show_on_screen = EINA_FALSE;
956 Eina_Bool want_quit = EINA_FALSE, external_injection = EINA_FALSE; 955 Eina_Bool want_quit = EINA_FALSE, external_injection = EINA_FALSE;
957 956
@@ -962,6 +961,7 @@ int main(int argc, char **argv)
962 ECORE_GETOPT_VALUE_BOOL(_scan_objects), 961 ECORE_GETOPT_VALUE_BOOL(_scan_objects),
963 ECORE_GETOPT_VALUE_BOOL(external_injection), 962 ECORE_GETOPT_VALUE_BOOL(external_injection),
964 ECORE_GETOPT_VALUE_BOOL(_disable_shots), 963 ECORE_GETOPT_VALUE_BOOL(_disable_shots),
964 ECORE_GETOPT_VALUE_STR(fonts_dir),
965 ECORE_GETOPT_VALUE_INT(_verbose), 965 ECORE_GETOPT_VALUE_INT(_verbose),
966 966
967 ECORE_GETOPT_VALUE_BOOL(want_quit), 967 ECORE_GETOPT_VALUE_BOOL(want_quit),
@@ -1067,7 +1067,6 @@ int main(int argc, char **argv)
1067 goto end; 1067 goto end;
1068 } 1068 }
1069 1069
1070 if (!show_on_screen) setenv("ELM_ENGINE", "buffer", 1);
1071 if (!argv[opt_args]) 1070 if (!argv[opt_args])
1072 { 1071 {
1073 fprintf(stderr, "no program specified\nUse -h for more information\n"); 1072 fprintf(stderr, "no program specified\nUse -h for more information\n");
@@ -1076,6 +1075,53 @@ int main(int argc, char **argv)
1076 1075
1077 if (_dest_type == FTYPE_EXU) _dest_unit = calloc(1, sizeof(*_dest_unit)); 1076 if (_dest_type == FTYPE_EXU) _dest_unit = calloc(1, sizeof(*_dest_unit));
1078 1077
1078 if (!_src_open())
1079 {
1080 fprintf(stderr, "Unable to read source file\n");
1081 goto end;
1082 }
1083
1084 if (!show_on_screen) setenv("ELM_ENGINE", "buffer", 1);
1085 if (_src_unit && _src_unit->fonts_path)
1086 {
1087 char buf[PATH_];
1088 if (!fonts_dir) fonts_dir = "./fonts";
1089 sprintf(buf, "%s/%s", fonts_dir, _src_unit->fonts_path);
1090 if (!ecore_file_exists(buf))
1091 {
1092 fprintf(stderr, "Unable to use the fonts path '%s' provided in %s\n",
1093 _src_unit->fonts_path, _src_filename);
1094 goto end;
1095 }
1096 chosen_fonts = _src_unit->fonts_path;
1097 }
1098 if (fonts_dir)
1099 {
1100 Eina_Tmpstr *fonts_conf_name = NULL;
1101 if (!ecore_file_exists(fonts_dir))
1102 {
1103 fprintf(stderr, "Unable to find fonts directory %s\n", fonts_dir);
1104 goto end;
1105 }
1106 if (!chosen_fonts)
1107 {
1108 Eina_List *dated_fonts = ecore_file_ls(fonts_dir);
1109 char *date_dir;
1110 chosen_fonts = eina_stringshare_add(eina_list_last_data_get(dated_fonts));
1111 EINA_LIST_FREE(dated_fonts, date_dir) free(date_dir);
1112 }
1113 if (chosen_fonts)
1114 {
1115 int tmp_fd = eina_file_mkstemp("/tmp/fonts_XXXXXX.conf", &fonts_conf_name);
1116 dprintf(tmp_fd,
1117 "<?xml version=\"1.0\"?>\n<!DOCTYPE fontconfig SYSTEM \"fonts.dtd\">\n<fontconfig>\n"
1118 "<dir prefix=\"default\">%s/%s</dir>\n</fontconfig>\n",
1119 fonts_dir, chosen_fonts);
1120 close(tmp_fd);
1121
1122 setenv("FONTCONFIG_FILE", fonts_conf_name, 1);
1123 }
1124 }
1079 efl_object_init(); 1125 efl_object_init();
1080 evas_init(); 1126 evas_init();
1081 1127
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 = {
362 1, 362 1,
363 { 363 {
364 ECORE_GETOPT_STORE_STR('t', "test", "Name of the filename where to store the test."), 364 ECORE_GETOPT_STORE_STR('t', "test", "Name of the filename where to store the test."),
365 ECORE_GETOPT_STORE_STR('f', "fonts-dir", "Specify a directory of the fonts that should be used."),
365 ECORE_GETOPT_COUNT('v', "verbose", "Turn verbose messages on."), 366 ECORE_GETOPT_COUNT('v', "verbose", "Turn verbose messages on."),
366 367
367 ECORE_GETOPT_LICENSE('L', "license"), 368 ECORE_GETOPT_LICENSE('L', "license"),
@@ -375,11 +376,13 @@ static const Ecore_Getopt optdesc = {
375int main(int argc, char **argv) 376int main(int argc, char **argv)
376{ 377{
377 char *dest = NULL, *eq; 378 char *dest = NULL, *eq;
379 char *fonts_dir = NULL;
378 int pret = 1, opt_args = 0; 380 int pret = 1, opt_args = 0;
379 Eina_Bool want_quit = EINA_FALSE; 381 Eina_Bool want_quit = EINA_FALSE;
380 382
381 Ecore_Getopt_Value values[] = { 383 Ecore_Getopt_Value values[] = {
382 ECORE_GETOPT_VALUE_STR(dest), 384 ECORE_GETOPT_VALUE_STR(dest),
385 ECORE_GETOPT_VALUE_STR(fonts_dir),
383 ECORE_GETOPT_VALUE_INT(_verbose), 386 ECORE_GETOPT_VALUE_INT(_verbose),
384 387
385 ECORE_GETOPT_VALUE_BOOL(want_quit), 388 ECORE_GETOPT_VALUE_BOOL(want_quit),
@@ -462,6 +465,36 @@ int main(int argc, char **argv)
462 efl_object_init(); 465 efl_object_init();
463 evas_init(); 466 evas_init();
464 467
468 if (!_unit)
469 {
470 _unit = calloc(1, sizeof(*_unit));
471 }
472
473 if (fonts_dir)
474 {
475 Eina_Tmpstr *fonts_conf_name = NULL;
476 if (!ecore_file_exists(fonts_dir))
477 {
478 fprintf(stderr, "Unable to find fonts directory %s\n", fonts_dir);
479 goto end;
480 }
481 Eina_List *dated_fonts = ecore_file_ls(fonts_dir);
482 char *date_dir;
483 _unit->fonts_path = strdup(eina_list_last_data_get(dated_fonts));
484 EINA_LIST_FREE(dated_fonts, date_dir) free(date_dir);
485 if (_unit->fonts_path)
486 {
487 int tmp_fd = eina_file_mkstemp("/tmp/fonts_XXXXXX.conf", &fonts_conf_name);
488 dprintf(tmp_fd,
489 "<?xml version=\"1.0\"?>\n<!DOCTYPE fontconfig SYSTEM \"fonts.dtd\">\n<fontconfig>\n"
490 "<dir prefix=\"default\">%s/%s</dir>\n</fontconfig>\n",
491 fonts_dir, _unit->fonts_path);
492 close(tmp_fd);
493
494 setenv("FONTCONFIG_FILE", fonts_conf_name, 1);
495 }
496 }
497
465 /* Replace the current command line to hide the Exactness part */ 498 /* Replace the current command line to hide the Exactness part */
466 int len = argv[argc - 1] + strlen(argv[argc - 1]) - argv[opt_args]; 499 int len = argv[argc - 1] + strlen(argv[argc - 1]) - argv[opt_args];
467 memcpy(argv[0], argv[opt_args], len); 500 memcpy(argv[0], argv[opt_args], len);
@@ -481,11 +514,6 @@ int main(int argc, char **argv)
481 if (!_shot_key) _shot_key = getenv("SHOT_KEY"); 514 if (!_shot_key) _shot_key = getenv("SHOT_KEY");
482 if (!_shot_key) _shot_key = SHOT_KEY_STR; 515 if (!_shot_key) _shot_key = SHOT_KEY_STR;
483 516
484 if (!_unit)
485 {
486 _unit = calloc(1, sizeof(*_unit));
487 }
488
489 ecore_evas_callback_new_set(_my_evas_new); 517 ecore_evas_callback_new_set(_my_evas_new);
490 _last_timestamp = ecore_time_get() * 1000; 518 _last_timestamp = ecore_time_get() * 1000;
491 pret = _prg_invoke(_prg_full_path_guess(argv[0]), argc - opt_args, argv); 519 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
192 /* imgs not in EET */ 192 /* imgs not in EET */
193 Eina_List *imgs; /**< List of Exactness_Image */ 193 Eina_List *imgs; /**< List of Exactness_Image */
194 Eina_List *objs; /**< List of Exactness_Objects */ 194 Eina_List *objs; /**< List of Exactness_Objects */
195 const char *fonts_path; /**< Path to the fonts to use, relative to the fonts dir given in parameter to the player/recorder */
195 int nb_shots; /**< The number of shots present in the unit */ 196 int nb_shots; /**< The number of shots present in the unit */
196} Exactness_Unit; 197} Exactness_Unit;
197 198
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)
243 unit_d = eet_data_descriptor_stream_new(&eddc); 243 unit_d = eet_data_descriptor_stream_new(&eddc);
244 EET_DATA_DESCRIPTOR_ADD_LIST(unit_d, Exactness_Unit, "actions", actions, action_d); 244 EET_DATA_DESCRIPTOR_ADD_LIST(unit_d, Exactness_Unit, "actions", actions, action_d);
245 EET_DATA_DESCRIPTOR_ADD_LIST(unit_d, Exactness_Unit, "objs", objs, objs_d); 245 EET_DATA_DESCRIPTOR_ADD_LIST(unit_d, Exactness_Unit, "objs", objs, objs_d);
246 EET_DATA_DESCRIPTOR_ADD_BASIC(unit_d, Exactness_Unit, "fonts_path", fonts_path, EET_T_STRING);
246 EET_DATA_DESCRIPTOR_ADD_BASIC(unit_d, Exactness_Unit, "nb_shots", nb_shots, EET_T_UINT); 247 EET_DATA_DESCRIPTOR_ADD_BASIC(unit_d, Exactness_Unit, "nb_shots", nb_shots, EET_T_UINT);
247 } 248 }
248 249