10
#define EDJE_EDIT_IS_UNSTABLE_AND_I_KNOW_ABOUT_IT 1
14
#include <Ecore_Evas.h>
15
#include <Ecore_Getopt.h>
18
#define DBG(...) EINA_LOG_DOM_DBG(_log_dom, __VA_ARGS__)
19
#define INF(...) EINA_LOG_DOM_INFO(_log_dom, __VA_ARGS__)
20
#define WRN(...) EINA_LOG_DOM_WARN(_log_dom, __VA_ARGS__)
21
#define ERR(...) EINA_LOG_DOM_ERR(_log_dom, __VA_ARGS__)
22
#define CRI(...) EINA_LOG_DOM_CRIT(_log_dom, __VA_ARGS__)
25
#define INDENT2 INDENT INDENT
26
#define INDENT3 INDENT2 INDENT
27
#define INDENT4 INDENT3 INDENT
28
#define INDENT5 INDENT4 INDENT
29
#define INDENT6 INDENT5 INDENT
30
#define INDENT7 INDENT6 INDENT
32
#define FLOAT_PRECISION 0.0001
33
#define FDIFF(a, b) (fabs((a) - (b)) > FLOAT_PRECISION)
36
static Eina_List *groups;
40
static const char *file;
41
static char *group = NULL;
42
static char *part = NULL;
43
static char *program = NULL;
45
static Eina_Bool api_only = EINA_FALSE;
46
static Eina_Bool api_fix = EINA_FALSE;
47
static Eina_Bool machine = EINA_FALSE;
49
static const char *mode_choices[] = {
62
static const char *detail_choices[] = {
69
const Ecore_Getopt optdesc = {
71
"%prog [options] <file.edj>",
73
"(C) 2010 - The Enlightenment Project",
75
"Edje file inspector, let one see groups, parts, programs and other details "
76
"of a compiled (binary) edje file.\n",
79
ECORE_GETOPT_CHOICE('m', "mode", "Choose which mode to operate on file.",
81
ECORE_GETOPT_CHOICE('d', "detail", "Choose detail level (default=terse)",
83
ECORE_GETOPT_STORE_STR('g', "group", "Limit output to group (or glob)."),
84
ECORE_GETOPT_STORE_STR('p', "part", "Limit output to part (or glob)."),
85
ECORE_GETOPT_STORE_STR('r', "program",
86
"Limit output to program (or glob)."),
87
ECORE_GETOPT_STORE_TRUE('a', "api-only", "Limit to just api parts or "
89
ECORE_GETOPT_STORE_TRUE('A', "api-fix", "Fix API names to be C compliant."),
90
ECORE_GETOPT_STORE_TRUE('M', "machine", "Produce machine readable output."),
91
ECORE_GETOPT_LICENSE('L', "license"),
92
ECORE_GETOPT_COPYRIGHT('C', "copyright"),
93
ECORE_GETOPT_VERSION('V', "version"),
94
ECORE_GETOPT_HELP('h', "help"),
99
static inline Eina_Bool
100
matches(const char *name, const char *pattern)
102
if (!pattern) return EINA_TRUE;
103
return eina_fnmatch(pattern, name, 0);
107
group_begin(const char *name)
109
if (machine) printf("GROUP-BEGIN\nNAME: %s\n", name);
110
else printf("group { name: '%s';\n", name);
116
if (machine) puts("GROUP-END");
121
group_details(Evas_Object *ed)
125
if (detail < 1) return;
127
if (machine) puts("GROUP-DETAILS-BEGIN");
129
w = edje_edit_group_min_w_get(ed);
130
h = edje_edit_group_min_h_get(ed);
131
if (machine) printf("MIN-W: %d\nMIN-H: %d\n", w, h);
132
else if ((w > 0) || (h > 0))
133
printf(INDENT "min: %d %d;\n", w, h);
135
w = edje_edit_group_max_w_get(ed);
136
h = edje_edit_group_max_h_get(ed);
137
if (machine) printf("MAX-W: %d\nMAX-H: %d\n", w, h);
138
else if ((w > 0) || (h > 0))
139
printf(INDENT "max: %d %d;\n", w, h);
144
dl = edje_edit_group_data_list_get(ed);
149
if (machine) puts(INDENT "GROUP-DETAILS-DATA-BEGIN");
150
else puts(INDENT "data {");
152
EINA_LIST_FOREACH(dl, l, k)
154
const char *v = edje_edit_group_data_value_get(ed, k);
155
if (machine) printf("ITEM: \"%s\" \"%s\"\n", k, v);
156
else printf(INDENT2 "item: \"%s\" \"%s\";\n", k, v);
159
edje_edit_string_list_free(dl);
161
if (machine) puts(INDENT "GROUP-DETAILS-DATA-END");
162
else puts(INDENT "}");
166
if (machine) puts("GROUP-DETAILS-END");
172
if (machine) puts("PARTS-BEGIN");
173
else puts(INDENT "parts {");
179
if (machine) puts("PARTS-END");
180
else puts(INDENT "}");
184
part_type_name_get(Edje_Part_Type t)
188
case EDJE_PART_TYPE_RECTANGLE:
191
case EDJE_PART_TYPE_TEXT:
194
case EDJE_PART_TYPE_IMAGE:
197
case EDJE_PART_TYPE_PROXY:
200
case EDJE_PART_TYPE_SWALLOW:
203
case EDJE_PART_TYPE_TEXTBLOCK:
206
case EDJE_PART_TYPE_GRADIENT:
209
case EDJE_PART_TYPE_GROUP:
212
case EDJE_PART_TYPE_BOX:
215
case EDJE_PART_TYPE_TABLE:
218
case EDJE_PART_TYPE_EXTERNAL:
221
case EDJE_PART_TYPE_SPACER:
224
case EDJE_PART_TYPE_VECTOR:
227
case EDJE_PART_TYPE_NONE:
228
case EDJE_PART_TYPE_LAST:
229
ERR("Invalid part type %d", t);
233
ERR("Unknown part type %d", t);
239
state_begin(const char *state, double value)
242
printf("PART-STATE-BEGIN\nNAME: %s\nVALUE: %2.1f\n", state, value);
245
printf(INDENT3 "description { state: \"%s\" %2.1f;", state, value);
246
if (detail > 0) putchar('\n');
251
aspect_pref_name_get(int id)
255
case 0: return "NONE";
257
case 1: return "VERTICAL";
259
case 2: return "HORIZONTAL";
261
case 3: return "BOTH";
264
ERR("Unknown aspect preference %d", id);
270
border_fill_name_get(int id)
274
case 0: return "NONE";
276
case 1: return "DEFAULT";
278
case 2: return "SOLID";
281
ERR("Unknown border fill %d", id);
287
state_details(Evas_Object *ed, const char *ppart, const char *state, double value)
289
Edje_Part_Type t = edje_edit_part_type_get(ed, ppart);
291
const char *str, *str2;
292
int x, y, r, g, b, a;
294
if (detail < 1) return;
296
b = edje_edit_state_visible_get(ed, ppart, state, value);
297
if (machine) printf("VISIBLE: %d\n", b);
299
puts(INDENT4 "visible: 0;");
301
edje_edit_state_color_get(ed, ppart, state, value, &r, &g, &b, &a);
303
printf("COLOR-R: %d\nCOLOR-G: %d\nCOLOR-B: %d\nCOLOR-A: %d\n", r, g, b, a);
304
else if ((r != 255) || (g != 255) || (b != 255) || (a != 255))
305
printf(INDENT4 "color: %d %d %d %d;\n", r, g, b, a);
309
edje_edit_state_color2_get(ed, ppart, state, value, &r, &g, &b, &a);
311
printf("COLOR2-R: %d\nCOLOR2-G: %d\nCOLOR2-B: %d\nCOLOR2-A: %d\n",
313
else if ((r != 255) || (g != 255) || (b != 255) || (a != 255))
314
printf(INDENT4 "color2: %d %d %d %d;\n", r, g, b, a);
316
edje_edit_state_color3_get(ed, ppart, state, value, &r, &g, &b, &a);
318
printf("COLOR3-R: %d\nCOLOR3-G: %d\nCOLOR3-B: %d\nCOLOR3-A: %d\n",
320
else if ((r != 255) || (g != 255) || (b != 255) || (a != 255))
321
printf(INDENT4 "color3: %d %d %d %d;\n", r, g, b, a);
324
dx = edje_edit_state_align_x_get(ed, ppart, state, value);
325
dy = edje_edit_state_align_y_get(ed, ppart, state, value);
326
if (machine) printf("ALIGN-X: %g\nALIGN-Y: %g\n", dx, dy);
327
else if (FDIFF(dx, 0.5) || FDIFF(dy, 0.5))
328
printf(INDENT4 "align: %g %g;\n", dx, dy);
330
x = edje_edit_state_min_w_get(ed, ppart, state, value);
331
y = edje_edit_state_min_h_get(ed, ppart, state, value);
332
if (machine) printf("MIN-W: %d\nMIN-H: %d\n", x, y);
334
printf(INDENT4 "min: %d %d;\n", x, y);
336
x = edje_edit_state_max_w_get(ed, ppart, state, value);
337
y = edje_edit_state_max_h_get(ed, ppart, state, value);
338
if (machine) printf("MAX-W: %d\nMAX-H: %d\n", x, y);
339
else if ((x != -1) || (y != -1))
340
printf(INDENT4 "max: %d %d;\n", x, y);
347
dx = edje_edit_state_aspect_min_get(ed, ppart, state, value);
348
dy = edje_edit_state_aspect_max_get(ed, ppart, state, value);
349
if (machine) printf("ASPECT-MIN: %g\nASPECT-MAX: %g\n", dx, dy);
350
else if (FDIFF(dx, 0.0) || FDIFF(dy, 0.0))
351
printf(INDENT4 "aspect: %g %g;\n", dx, dy);
353
x = edje_edit_state_aspect_pref_get(ed, ppart, state, value);
354
str = aspect_pref_name_get(x);
355
if (machine) printf("ASPECT-PREFERENCE: %s\n", str);
357
printf(INDENT4 "aspect_preference: %s;\n", str);
360
str = edje_edit_state_color_class_get(ed, ppart, state, value);
361
if (machine) printf("COLOR_CLASS: %s\n", str ? str : "");
363
printf(INDENT4 "color_class: \"%s\";\n", str);
364
edje_edit_string_free(str);
367
dx = edje_edit_state_rel1_relative_x_get(ed, ppart, state, value);
368
dy = edje_edit_state_rel1_relative_y_get(ed, ppart, state, value);
369
x = edje_edit_state_rel1_offset_x_get(ed, ppart, state, value);
370
y = edje_edit_state_rel1_offset_y_get(ed, ppart, state, value);
371
str = edje_edit_state_rel1_to_x_get(ed, ppart, state, value);
372
str2 = edje_edit_state_rel1_to_y_get(ed, ppart, state, value);
373
if (FDIFF(dx, 0.0) || FDIFF(dy, 0.0) || (x) || (y) || (str) || (str2))
375
if (machine) puts("REL1-BEGIN");
376
else puts(INDENT4 "rel1 {");
378
if (machine) printf("RELATIVE-X: %g\nRELATIVE-Y: %g\n", dx, dy);
379
else if (FDIFF(dx, 0.0) || FDIFF(dy, 0.0))
380
printf(INDENT5 "relative: %g %g;\n", dx, dy);
382
if (machine) printf("OFFSET-X: %d\nOFFSET-Y: %d\n", x, y);
384
printf(INDENT5 "offset: %d %d;\n", x, y);
387
printf("TO-X: %s\nTO-Y: %s\n", str ? str : "", str2 ? str2 : "");
388
else if (((str) && (str2)) && (!strcmp(str, str2)))
389
printf(INDENT5 "to: \"%s\";\n", str);
392
if (str) printf(INDENT5 "to_x: \"%s\";\n", str);
393
if (str2) printf(INDENT5 "to_y: \"%s\";\n", str2);
396
if (machine) puts("REL1-END");
397
else puts(INDENT4 "}");
399
edje_edit_string_free(str);
400
edje_edit_string_free(str2);
402
dx = edje_edit_state_rel2_relative_x_get(ed, ppart, state, value);
403
dy = edje_edit_state_rel2_relative_y_get(ed, ppart, state, value);
404
x = edje_edit_state_rel2_offset_x_get(ed, ppart, state, value);
405
y = edje_edit_state_rel2_offset_y_get(ed, ppart, state, value);
406
str = edje_edit_state_rel2_to_x_get(ed, ppart, state, value);
407
str2 = edje_edit_state_rel2_to_y_get(ed, ppart, state, value);
408
if (FDIFF(dx, 1.0) || FDIFF(dy, 1.0) || (x != -1) || (y != -1) ||
411
if (machine) puts("REL2-BEGIN");
412
else puts(INDENT4 "rel2 {");
414
if (machine) printf("RELATIVE-X: %g\nRELATIVE-Y: %g\n", dx, dy);
415
else if (FDIFF(dx, 1.0) || FDIFF(dy, 1.0))
416
printf(INDENT5 "relative: %g %g;\n", dx, dy);
418
if (machine) printf("OFFSET-X: %d\nOFFSET-Y: %d\n", x, y);
419
else if ((x != -1) || (y != -1))
420
printf(INDENT5 "offset: %d %d;\n", x, y);
423
printf("TO-X: %s\nTO-Y: %s\n", str ? str : "", str2 ? str2 : "");
424
else if (((str) && (str2)) && (!strcmp(str, str2)))
425
printf(INDENT5 "to: \"%s\";\n", str);
428
if (str) printf(INDENT5 "to_x: \"%s\";\n", str);
429
if (str2) printf(INDENT5 "to_y: \"%s\";\n", str2);
432
if (machine) puts("REL2-END");
433
else puts(INDENT4 "}");
435
edje_edit_string_free(str);
436
edje_edit_string_free(str2);
438
if (t == EDJE_PART_TYPE_IMAGE)
440
str = edje_edit_state_image_get(ed, ppart, state, value);
442
if (machine) printf("IMAGE-BEGIN\nNORMAL: %s\n", str ? str : "");
445
puts(INDENT4 "image {");
446
if (str) printf(INDENT5 "normal: \"%s\";\n", str);
449
printf(INDENT4 "image.normal: \"%s\";\n", str);
451
edje_edit_string_free(str);
455
Eina_List *tweens, *l;
456
int bl, br, bt, bb, x2, y2;
458
Eina_Bool has_orgin, has_size;
460
tweens = edje_edit_state_tweens_list_get(ed, ppart, state, value);
461
EINA_LIST_FOREACH(tweens, l, str)
463
if (machine) printf("TWEEN: %s\n", str);
464
else printf(INDENT5 "tween: \"%s\";\n", str);
466
edje_edit_string_list_free(tweens);
468
edje_edit_state_image_border_get
469
(ed, ppart, state, value, &bl, &br, &bt, &bb);
471
printf("BORDER-LEFT: %d\nBORDER-RIGHT: %d\n"
472
"BORDER-TOP: %d\nBORDER-BOTTOM: %d\n", bl, br, bt, bb);
473
else if ((bl) || (br) || (bt) || (bb))
474
printf(INDENT5 "border: %d %d %d %d;\n", bl, br, bt, bb);
476
x = edje_edit_state_image_border_fill_get(ed, ppart, state, value);
477
str = border_fill_name_get(x);
478
if (machine) printf("BORDER-FILL: %s\n", str);
480
printf(INDENT5 "middle: %s;\n", str);
485
dx = edje_edit_state_fill_origin_relative_x_get
486
(ed, ppart, state, value);
487
dy = edje_edit_state_fill_origin_relative_y_get
488
(ed, ppart, state, value);
489
x = edje_edit_state_fill_origin_offset_x_get
490
(ed, ppart, state, value);
491
y = edje_edit_state_fill_origin_offset_y_get
492
(ed, ppart, state, value);
494
dx2 = edje_edit_state_fill_size_relative_x_get
495
(ed, ppart, state, value);
496
dy2 = edje_edit_state_fill_size_relative_y_get
497
(ed, ppart, state, value);
498
x2 = edje_edit_state_fill_size_offset_x_get
499
(ed, ppart, state, value);
500
y2 = edje_edit_state_fill_size_offset_y_get
501
(ed, ppart, state, value);
503
has_orgin = (FDIFF(dx, 0.0) || FDIFF(dy, 0.0) || (x) || (y));
504
has_size = (FDIFF(dx2, 1.0) || FDIFF(dy2, 1.0) || (x2) || (y2));
506
if ((has_orgin) || (has_size))
508
if (machine) puts("IMAGE-FILL-BEGIN");
509
else puts(INDENT5 "fill {");
514
printf("ORIGIN-RELATIVE-X: %g\n"
515
"ORIGIN-RELATIVE-Y: %g\n"
516
"ORIGIN-OFFSET-X: %d\n"
517
"ORIGIN-OFFSET-Y: %d\n",
520
printf(INDENT6 "origin {\n"
521
INDENT7 "relative: %g %g;\n"
522
INDENT7 "offset: %d %d;\n"
530
printf("SIZE-RELATIVE-X: %g\n"
531
"SIZE-RELATIVE-Y: %g\n"
532
"SIZE-OFFSET-X: %d\n"
533
"SIZE-OFFSET-Y: %d\n",
536
printf(INDENT6 "size {\n"
537
INDENT7 "relative: %g %g;\n"
538
INDENT7 "offset: %d %d;\n"
543
if (machine) puts("IMAGE-FILL-END");
544
else puts(INDENT5 "}");
548
if (machine) puts("IMAGE-END");
552
else if (t == EDJE_PART_TYPE_PROXY)
556
Eina_Bool has_orgin, has_size;
558
if (machine) puts("PROXY-BEGIN");
559
else puts(INDENT4 "proxy {");
563
dx = edje_edit_state_fill_origin_relative_x_get
564
(ed, ppart, state, value);
565
dy = edje_edit_state_fill_origin_relative_y_get
566
(ed, ppart, state, value);
567
x = edje_edit_state_fill_origin_offset_x_get
568
(ed, ppart, state, value);
569
y = edje_edit_state_fill_origin_offset_y_get
570
(ed, ppart, state, value);
572
dx2 = edje_edit_state_fill_size_relative_x_get
573
(ed, ppart, state, value);
574
dy2 = edje_edit_state_fill_size_relative_y_get
575
(ed, ppart, state, value);
576
x2 = edje_edit_state_fill_size_offset_x_get
577
(ed, ppart, state, value);
578
y2 = edje_edit_state_fill_size_offset_y_get
579
(ed, ppart, state, value);
581
has_orgin = (FDIFF(dx, 0.0) || FDIFF(dy, 0.0) || (x) || (y));
582
has_size = (FDIFF(dx2, 1.0) || FDIFF(dy2, 1.0) || (x2) || (y2));
584
if ((has_orgin) || (has_size))
586
if (machine) puts("PROXY-FILL-BEGIN");
587
else puts(INDENT5 "fill {");
592
printf("ORIGIN-RELATIVE-X: %g\n"
593
"ORIGIN-RELATIVE-Y: %g\n"
594
"ORIGIN-OFFSET-X: %d\n"
595
"ORIGIN-OFFSET-Y: %d\n",
598
printf(INDENT6 "origin {\n"
599
INDENT7 "relative: %g %g;\n"
600
INDENT7 "offset: %d %d;\n"
608
printf("SIZE-RELATIVE-X: %g\n"
609
"SIZE-RELATIVE-Y: %g\n"
610
"SIZE-OFFSET-X: %d\n"
611
"SIZE-OFFSET-Y: %d\n",
614
printf(INDENT6 "size {\n"
615
INDENT7 "relative: %g %g;\n"
616
INDENT7 "offset: %d %d;\n"
621
if (machine) puts("PROXY-FILL-END");
622
else puts(INDENT5 "}");
625
if (machine) puts("PROXY-END");
626
else puts(INDENT4 "}");
628
else if ((t == EDJE_PART_TYPE_TEXTBLOCK) || (t == EDJE_PART_TYPE_TEXT))
630
if (machine) puts("TEXT-BEGIN");
631
else puts(INDENT4 "text {");
633
str = edje_edit_state_text_get(ed, ppart, state, value);
634
if (machine) printf("TEXT: %s\n", str ? str : "");
636
printf(INDENT5 "text: \"%s\";\n", str);
637
edje_edit_string_free(str);
639
str = edje_edit_state_font_get(ed, ppart, state, value);
640
if (machine) printf("FONT: %s\n", str ? str : "");
642
printf(INDENT5 "font: \"%s\";\n", str);
643
edje_edit_string_free(str);
645
x = edje_edit_state_text_size_get(ed, ppart, state, value);
646
if (machine) printf("SIZE: %d\n", x);
648
printf(INDENT5 "size: %d;\n", x);
652
dx = edje_edit_state_text_align_x_get(ed, ppart, state, value);
653
dy = edje_edit_state_text_align_y_get(ed, ppart, state, value);
654
if (machine) printf("TEXT-ALIGN-X: %g\nTEXT-ALIGN-Y: %g\n", dx, dy);
655
else if (FDIFF(dx, 0.5) || FDIFF(dy, 0.5))
656
printf(INDENT5 "align: %g %g;\n", dx, dy);
658
x = edje_edit_state_text_fit_x_get(ed, ppart, state, value);
659
y = edje_edit_state_text_fit_y_get(ed, ppart, state, value);
660
if (machine) printf("TEXT-FIT-X: %d\nTEXT-FIT-Y: %d\n", x, y);
662
printf(INDENT5 "fit: %d %d;\n", x, y);
664
dx = edje_edit_state_text_elipsis_get(ed, ppart, state, value);
665
if (machine) printf("TEXT-ELLIPSIS: %g\n", dx);
666
else if (FDIFF(dx, 0.5))
667
printf(INDENT5 "ellipsis: %g;\n", dx);
669
if (machine) puts("TEXT-END");
670
else puts(INDENT4 "}");
672
else if (t == EDJE_PART_TYPE_EXTERNAL)
674
const Eina_List *params, *l;
675
const Edje_External_Param *p;
677
params = edje_edit_state_external_params_list_get
678
(ed, ppart, state, value);
682
if (machine) puts("PARAMS-BEGIN");
683
else puts(INDENT4 "params {");
685
EINA_LIST_FOREACH(params, l, p)
688
case EDJE_EXTERNAL_PARAM_TYPE_INT:
689
printf(INDENT5 "int: \"%s\" \"%d\";\n", p->name, p->i);
692
case EDJE_EXTERNAL_PARAM_TYPE_DOUBLE:
693
printf(INDENT5 "double: \"%s\" \"%g\";\n", p->name, p->d);
696
case EDJE_EXTERNAL_PARAM_TYPE_STRING:
698
printf(INDENT5 "string: \"%s\" \"%s\";\n",
702
case EDJE_EXTERNAL_PARAM_TYPE_BOOL:
703
printf(INDENT5 "bool: \"%s\" \"%d\";\n", p->name, p->i);
706
case EDJE_EXTERNAL_PARAM_TYPE_CHOICE:
708
printf(INDENT5 "choice: \"%s\" \"%s\";\n",
716
if (machine) puts("PARAMS-END");
717
else puts(INDENT4 "}");
725
if (machine) puts("PART-STATE-END");
732
part_begin(Evas_Object *ed, const char *name)
734
const char *type = part_type_name_get(edje_edit_part_type_get(ed, name));
735
if (machine) printf("PART-BEGIN\nNAME: %s\nTYPE: %s\n", name, type);
738
printf(INDENT2 "part { name: '%s'; type: %s;", name, type);
739
if (detail > 0) putchar('\n');
744
text_effect_name_get(Edje_Text_Effect effect)
748
case EDJE_TEXT_EFFECT_NONE:
751
case EDJE_TEXT_EFFECT_PLAIN:
754
case EDJE_TEXT_EFFECT_OUTLINE:
757
case EDJE_TEXT_EFFECT_SOFT_OUTLINE:
758
return "SOFT_OUTLINE";
760
case EDJE_TEXT_EFFECT_SHADOW:
763
case EDJE_TEXT_EFFECT_SOFT_SHADOW:
764
return "SOFT_SHADOW";
766
case EDJE_TEXT_EFFECT_OUTLINE_SHADOW:
767
return "OUTLINE_SHADOW";
769
case EDJE_TEXT_EFFECT_OUTLINE_SOFT_SHADOW:
770
return "OUTLINE_SOFT_SHADOW";
772
case EDJE_TEXT_EFFECT_FAR_SHADOW:
775
case EDJE_TEXT_EFFECT_FAR_SOFT_SHADOW:
776
return "FAR_SOFT_SHADOW";
778
case EDJE_TEXT_EFFECT_GLOW:
781
case EDJE_TEXT_EFFECT_LAST:
782
ERR("Invalid part type %d", effect);
786
ERR("Unknown effect type %d", effect);
791
static inline Eina_Bool
794
if ((c >= '0') && (c <= '9')) return EINA_TRUE;
795
if ((c >= 'a') && (c <= 'z')) return EINA_TRUE;
796
if ((c >= 'A') && (c <= 'Z')) return EINA_TRUE;
801
_api_name_fix(const char *orig)
803
char *d, *d_end, buf[256];
806
if (!orig) return NULL;
807
if (!api_fix) return strdup(orig);
811
d_end = d + sizeof(buf) - 1;
812
for (; (*s != '\0') && (d < d_end); s++, d++)
813
if (_c_id_allowed(*s)) *d = *s;
821
_part_api_name_get(Evas_Object *ed, const char *ppart)
823
const char *orig = edje_edit_part_api_name_get(ed, ppart);
824
char *fix = _api_name_fix(orig);
825
edje_edit_string_free(orig);
830
part_details(Evas_Object *ed, const char *ppart)
832
Eina_List *states, *l;
834
const char *str, *str2;
837
if (detail < 1) return;
839
if (machine) puts("PART-DETAILS-BEGIN");
841
str = api = _part_api_name_get(ed, ppart);
842
str2 = edje_edit_part_api_description_get(ed, ppart);
845
printf("API-NAME: %s\n", str ? str : "");
846
printf("API-DESCRIPTION: %s\n", str2 ? str2 : "");
848
else if ((str) || (str2))
849
printf(INDENT3 "api: \"%s\" \"%s\";\n", str ? str : "", str2 ? str2 : "");
851
edje_edit_string_free(str2);
853
b = edje_edit_part_mouse_events_get(ed, ppart);
854
if (machine) printf("MOUSE_EVENTS: %d\n", b);
856
puts(INDENT3 "mouse_events: 0;");
860
b = edje_edit_part_repeat_events_get(ed, ppart);
861
if (machine) printf("REPEAT_EVENTS: %d\n", b);
863
puts(INDENT3 "repeat_events: 1;");
865
b = edje_edit_part_scale_get(ed, ppart);
866
if (machine) printf("SCALE: %d\n", b);
868
puts(INDENT3 "scale: 1;");
871
str = edje_edit_part_clip_to_get(ed, ppart);
872
if (machine) printf("CLIP_TO: %s\n", str ? str : "");
874
printf(INDENT3 "clip_to: \"%s\";\n", str);
875
edje_edit_string_free(str);
877
str = edje_edit_part_source_get(ed, ppart);
878
if (machine) printf("SOURCE: %s\n", str ? str : "");
880
printf(INDENT3 "source: \"%s\";\n", str);
881
edje_edit_string_free(str);
885
if (edje_edit_part_type_get(ed, ppart) == EDJE_PART_TYPE_TEXT)
887
str = text_effect_name_get(edje_edit_part_effect_get(ed, ppart));
888
if (machine) printf("EFFECT: %s\n", str ? str : "");
890
printf(INDENT3 "effect: %s;\n", str);
894
if (edje_edit_part_drag_x_get(ed, ppart) ||
895
edje_edit_part_drag_y_get(ed, ppart))
897
int dir, step, count;
899
if (machine) puts("DRAGABLE-BEGIN");
900
else puts(INDENT3 "dragable {");
902
dir = edje_edit_part_drag_x_get(ed, ppart);
903
step = edje_edit_part_drag_step_x_get(ed, ppart);
904
count = edje_edit_part_drag_count_x_get(ed, ppart);
905
if (machine) printf("DRAG-X: %d %d %d\n", dir, step, count);
906
else printf(INDENT4 "x: %d %d %d;\n", dir, step, count);
908
dir = edje_edit_part_drag_y_get(ed, ppart);
909
step = edje_edit_part_drag_step_y_get(ed, ppart);
910
count = edje_edit_part_drag_count_y_get(ed, ppart);
911
if (machine) printf("DRAG-Y: %d %d %d\n", dir, step, count);
912
else printf(INDENT4 "y: %d %d %d;\n", dir, step, count);
914
str = edje_edit_part_drag_confine_get(ed, ppart);
915
if (machine) printf("DRAG-CONFINE: %s\n", str ? str : "");
917
printf(INDENT4 "confine: \"%s\";\n", str);
918
edje_edit_string_free(str);
920
str = edje_edit_part_drag_event_get(ed, ppart);
921
if (machine) printf("DRAG-EVENTS: %s\n", str ? str : "");
923
printf(INDENT4 "events: \"%s\";\n", str);
924
edje_edit_string_free(str);
926
if (machine) puts("DRAGABLE-END");
927
else puts(INDENT3 "}");
931
states = edje_edit_part_states_list_get(ed, ppart);
932
EINA_LIST_FOREACH(states, l, str)
934
char state[512], *delim;
936
eina_strlcpy(state, str, sizeof(state));
937
delim = strchr(state, ' ');
938
if (!delim) continue;
941
value = strtod(delim, NULL);
942
state_begin(state, value);
943
state_details(ed, ppart, state, value);
946
edje_edit_string_list_free(states);
948
if (machine) puts("PART-DETAILS-END");
954
if (machine) puts("PART-END");
961
_groups_names_list(void)
965
Eina_Bool found = EINA_FALSE;
967
EINA_LIST_FOREACH(groups, l, name)
969
if (!matches(name, group))
971
DBG("filter out group '%s': does not match '%s'", name, group);
978
if (!found) WRN("no groups match '%s'", group);
983
_parts_names_list(void)
985
Eina_List *gl, *pl, *parts;
986
const char *gname, *pname;
987
Eina_Bool found_group = EINA_FALSE, found_part = EINA_FALSE;
989
EINA_LIST_FOREACH(groups, gl, gname)
993
if (!matches(gname, group))
995
DBG("filter out group '%s': does not match '%s'", gname, group);
999
ed = edje_edit_object_add(ecore_evas_get(ee));
1000
if (!edje_object_file_set(ed, file, gname))
1002
Edje_Load_Error err = edje_object_load_error_get(ed);
1003
const char *errmsg = edje_load_error_str(err);
1004
ERR("could not load group '%s' from file '%s': %s",
1005
gname, file, errmsg);
1006
evas_object_del(ed);
1010
found_group = EINA_TRUE;
1013
parts = edje_edit_parts_list_get(ed);
1014
EINA_LIST_FOREACH(parts, pl, pname)
1016
if (!matches(pname, part))
1018
DBG("filter out part '%s': does not match '%s'", pname, part);
1023
if (!edje_edit_part_api_name_get(ed, pname))
1025
DBG("filter out part '%s': not API.", pname);
1029
if (machine) printf("PART: %s\n", pname);
1030
else printf(INDENT "part: %s\n", pname);
1032
edje_edit_string_list_free(parts);
1035
evas_object_del(ed);
1038
if (!found_group) WRN("no groups match '%s'", group);
1039
if (!found_part) WRN("no parts match '%s'", part);
1040
return (!found_group) || (!found_part);
1044
_group_parts_list(Evas_Object *ed)
1046
Eina_Bool found = EINA_FALSE;
1047
Eina_List *parts, *l;
1052
parts = edje_edit_parts_list_get(ed);
1053
EINA_LIST_FOREACH(parts, l, name)
1055
if (!matches(name, part))
1057
DBG("filter out part '%s': does not match '%s'", name, part);
1062
if (!edje_edit_part_api_name_get(ed, name))
1064
DBG("filter out part '%s': not API.", name);
1070
part_begin(ed, name);
1071
part_details(ed, name);
1082
if (machine) puts("PROGRAMS-BEGIN");
1083
else puts(INDENT "programs {");
1089
if (machine) puts("PROGRAMS-END");
1090
else puts(INDENT "}");
1094
program_begin(const char *name)
1096
if (machine) printf("PROGRAM-BEGIN\nNAME: %s\n", name ? name : "");
1099
printf(INDENT2 "program { name: '%s';\n", name ? name : "");
1106
if (machine) puts("PROGRAM-END");
1107
else puts(INDENT2 "}");
1111
_program_api_name_get(Evas_Object *ed, const char *pprogram)
1113
const char *orig = edje_edit_program_api_name_get(ed, pprogram);
1114
char *fix = _api_name_fix(orig);
1115
edje_edit_string_free(orig);
1120
_transition_name_get(Edje_Tween_Mode mode)
1124
case EDJE_TWEEN_MODE_LINEAR: return "LINEAR";
1126
case EDJE_TWEEN_MODE_ACCELERATE: return "ACCELERATE";
1128
case EDJE_TWEEN_MODE_DECELERATE: return "DECELERATE";
1130
case EDJE_TWEEN_MODE_SINUSOIDAL: return "SINUSOIDAL";
1132
case EDJE_TWEEN_MODE_CUBIC_BEZIER: return "CUBIC_BEZIER";
1135
ERR("Unknown transition mode %d", mode);
1141
program_details(Evas_Object *ed, const char *pprogram)
1143
const char *str, *str2;
1146
if (detail < 1) return;
1148
if (machine) puts("PROGRAM-DETAILS-BEGIN");
1150
str = api = _program_api_name_get(ed, pprogram);
1151
str2 = edje_edit_program_api_description_get(ed, pprogram);
1154
printf("API-NAME: %s\n", str ? str : "");
1155
printf("API-DESCRIPTION: %s\n", str2 ? str2 : "");
1157
else if ((str) || (str2))
1158
printf(INDENT3 "api: \"%s\" \"%s\";\n", str ? str : "", str2 ? str2 : "");
1160
edje_edit_string_free(str2);
1162
str = edje_edit_program_signal_get(ed, pprogram);
1163
if (machine) printf("SIGNAL: %s\n", str ? str : "");
1165
printf(INDENT3 "signal: \"%s\";\n", str);
1166
edje_edit_string_free(str);
1168
str = edje_edit_program_source_get(ed, pprogram);
1169
if (machine) printf("SOURCE: %s\n", str ? str : "");
1171
printf(INDENT3 "source: \"%s\";\n", str);
1172
edje_edit_string_free(str);
1177
Edje_Action_Type type = edje_edit_program_action_get(ed, pprogram);
1180
case EDJE_ACTION_TYPE_ACTION_STOP:
1181
if (machine) puts("ACTION: ACTION_STOP");
1182
else puts(INDENT3 "action: ACTION_STOP;");
1185
case EDJE_ACTION_TYPE_STATE_SET:
1186
str = edje_edit_program_state_get(ed, pprogram);
1188
printf("ACTION: STATE_SET\nACTION-STATE: %s %g\n",
1189
str, edje_edit_program_value_get(ed, pprogram));
1191
printf(INDENT3 "action: STATE_SET \"%s\" %2.1f;\n",
1192
str, edje_edit_program_value_get(ed, pprogram));
1193
edje_edit_string_free(str);
1196
case EDJE_ACTION_TYPE_SIGNAL_EMIT:
1197
str = edje_edit_program_state_get(ed, pprogram);
1198
str2 = edje_edit_program_state2_get(ed, pprogram);
1200
printf("ACTION: SIGNAL_EMIT\nACTION-SIGNAL: %s\n"
1201
"ACTION-SOURCE: %s\n",
1202
str ? str : "", str2 ? str2 : "");
1203
else if ((str) || (str2))
1204
printf(INDENT3 "action: SIGNAL_EMIT \"%s\" \"%s\";\n",
1205
str ? str : "", str2 ? str2 : "");
1206
edje_edit_string_free(str);
1207
edje_edit_string_free(str2);
1221
ERR("Unhandled pprogram action type %d", type);
1229
from = edje_edit_program_transition_time_get(ed, pprogram);
1232
str = _transition_name_get
1233
(edje_edit_program_transition_get(ed, pprogram));
1235
printf("TRANSITION-NAME: %s\nTRANSITION-DURATION: %g\n",
1237
else printf(INDENT3 "transition: %s %g;\n", str, from);
1241
from = edje_edit_program_in_from_get(ed, pprogram);
1242
range = edje_edit_program_in_range_get(ed, pprogram);
1243
if (FDIFF(from, 0.0) || FDIFF(range, 0.0))
1246
printf("IN-FROM: %g\nIN-RANGE: %g\n", from, range);
1247
else printf(INDENT3 "in: %g %g;\n", from, range);
1251
lst = edje_edit_program_targets_get(ed, pprogram);
1252
EINA_LIST_FOREACH(lst, l, str)
1253
if (machine) printf("TARGET: %s\n", str);
1254
else printf(INDENT3 "target: \"%s\";\n", str);
1255
edje_edit_string_list_free(lst);
1257
lst = edje_edit_program_afters_get(ed, pprogram);
1258
EINA_LIST_FOREACH(lst, l, str)
1259
if (machine) printf("AFTER: %s\n", str);
1260
else printf(INDENT3 "after: \"%s\";\n", str);
1261
edje_edit_string_list_free(lst);
1266
if (machine) puts("PROGRAM-DETAILS-END");
1270
_group_programs_list(Evas_Object *ed)
1272
Eina_Bool found = EINA_FALSE;
1273
Eina_List *programs, *l;
1281
WRN("listing only programs with names!");
1282
programs = edje_edit_programs_list_get(ed);
1283
EINA_LIST_FOREACH(programs, l, name)
1285
if (!matches(name, program))
1287
DBG("filter out program '%s': does not match '%s'", name, program);
1292
if (!edje_edit_program_api_name_get(ed, name))
1294
DBG("filter out program '%s': not API.", name);
1300
program_begin(name);
1301
program_details(ed, name);
1310
_list(const char *mode)
1315
Eina_Bool found_group = EINA_FALSE;
1316
Eina_Bool req_part, found_part, req_prog, found_prog;
1318
if ((!strcmp(mode, "parts")) || (!strcmp(mode, "groups")))
1320
req_part = EINA_TRUE;
1321
found_part = EINA_FALSE;
1325
req_part = EINA_FALSE;
1326
found_part = EINA_TRUE;
1329
if ((!strcmp(mode, "programs")) || (!strcmp(mode, "groups")))
1331
req_prog = EINA_TRUE;
1332
found_prog = EINA_FALSE;
1336
req_prog = EINA_FALSE;
1337
found_prog = EINA_TRUE;
1340
EINA_LIST_FOREACH(groups, l, name)
1344
if (!matches(name, group))
1346
DBG("filter out group '%s': does not match '%s'", name, group);
1350
ed = edje_edit_object_add(ecore_evas_get(ee));
1351
if (!edje_object_file_set(ed, file, name))
1353
Edje_Load_Error err = edje_object_load_error_get(ed);
1354
const char *errmsg = edje_load_error_str(err);
1355
ERR("could not load group '%s' from file '%s': %s",
1356
name, file, errmsg);
1357
evas_object_del(ed);
1361
found_group = EINA_TRUE;
1365
if (req_part) found_part |= _group_parts_list(ed);
1366
if (req_prog) found_prog |= _group_programs_list(ed);
1369
evas_object_del(ed);
1373
if (!strcmp(mode, "groups")) req_part = req_prog = EINA_FALSE;
1377
WRN("no groups match '%s'", group);
1380
if ((req_part) && (!found_part))
1382
WRN("no parts match '%s'", part);
1385
if ((req_prog) && (!found_prog))
1387
WRN("no programs match '%s'", program);
1394
_edje_object_any_get(void)
1396
Evas_Object *ed = edje_edit_object_add(ecore_evas_get(ee));
1399
if (!ed) return NULL;
1400
EINA_LIST_FOREACH(groups, l, name)
1401
if (edje_object_file_set(ed, file, name)) return ed;
1402
evas_object_del(ed);
1409
Evas_Object *ed = _edje_object_any_get();
1410
Eina_List *l, *data;
1413
if (!ed) return EINA_FALSE;
1415
data = edje_edit_data_list_get(ed);
1417
if (machine) puts("DATA-BEGIN");
1418
else puts("data {");
1420
EINA_LIST_FOREACH(data, l, key)
1422
const char *value = edje_edit_data_value_get(ed, key);
1423
if (machine) printf("ITEM: \"%s\" \"%s\"\n", key, value);
1424
else printf(INDENT "item: \"%s\" \"%s\";\n", key, value);
1427
if (machine) puts("DATA-END");
1430
edje_edit_string_list_free(data);
1431
evas_object_del(ed);
1436
_comp_str_get(Evas_Object *ed, const char *img)
1438
static char buf[128];
1439
Edje_Edit_Image_Comp type = edje_edit_image_compression_type_get(ed, img);
1444
case EDJE_EDIT_IMAGE_COMP_RAW:
1447
case EDJE_EDIT_IMAGE_COMP_USER:
1450
case EDJE_EDIT_IMAGE_COMP_COMP:
1453
case EDJE_EDIT_IMAGE_COMP_LOSSY:
1454
rate = edje_edit_image_compression_rate_get(ed, img);
1455
snprintf(buf, sizeof(buf), "LOSSY %d", rate);
1458
case EDJE_EDIT_IMAGE_COMP_LOSSY_ETC1:
1459
rate = edje_edit_image_compression_rate_get(ed, img);
1460
snprintf(buf, sizeof(buf), "LOSSY_ETC1 %d", rate);
1463
case EDJE_EDIT_IMAGE_COMP_LOSSY_ETC2:
1464
rate = edje_edit_image_compression_rate_get(ed, img);
1465
snprintf(buf, sizeof(buf), "LOSSY_ETC2 %d", rate);
1469
ERR("Unknown compression type %d", type);
1477
Evas_Object *ed = _edje_object_any_get();
1478
Eina_List *l, *images;
1481
if (!ed) return EINA_FALSE;
1483
images = edje_edit_images_list_get(ed);
1485
if (machine) puts("IMAGES-BEGIN");
1486
else puts("images {");
1488
EINA_LIST_FOREACH(images, l, img)
1490
int id = edje_edit_image_id_get(ed, img);
1491
const char *comp = _comp_str_get(ed, img);
1495
if (machine) printf("IMAGE: %s\n", img);
1496
else printf(INDENT "image: \"%s\" %s;\n", img, comp);
1498
else if (detail == 1)
1500
if (machine) printf("IMAGE: \"%s\" \"%s\"\n", img, comp);
1501
else printf(INDENT "image: \"%s\" %s;\n", img, comp);
1506
printf("IMAGE: \"edje/images/%d\" \"%s\" \"%s\"\n",
1509
printf(INDENT "image: \"%s\" %s; /* id: \"edje/images/%d\" */\n",
1514
if (machine) puts("IMAGES-END");
1517
edje_edit_string_list_free(images);
1518
evas_object_del(ed);
1525
Evas_Object *ed = _edje_object_any_get();
1526
Eina_List *l, *fonts;
1529
if (!ed) return EINA_FALSE;
1531
fonts = edje_edit_fonts_list_get(ed);
1533
if (machine) puts("FONTS-BEGIN");
1534
else puts("fonts {");
1536
EINA_LIST_FOREACH(fonts, l, alias)
1538
const char *path = edje_edit_font_path_get(ed, alias);
1542
if (machine) printf("FONT: %s\n", alias);
1543
else printf(INDENT "font: \"%s\" \"%s\";\n", path, alias);
1545
else if (detail == 1)
1547
if (machine) printf("FONT: \"%s\" \"%s\"\n", path, alias);
1548
else printf(INDENT "font: \"%s\" \"%s\";\n", path, alias);
1553
printf("FONT: \"edje/fonts/%s\" \"%s\" \"%s\"\n",
1554
alias, path, alias);
1557
"font: \"%s\" \"%s\"; /* id: \"edje/fonts/%s\" */\n",
1558
path, alias, alias);
1561
edje_edit_string_free(path);
1564
if (machine) puts("FONTS-END");
1567
edje_edit_string_list_free(fonts);
1568
evas_object_del(ed);
1573
_externals_list(void)
1575
Evas_Object *ed = _edje_object_any_get();
1576
Eina_List *l, *externals;
1579
if (!ed) return EINA_FALSE;
1581
externals = edje_edit_externals_list_get(ed);
1583
if (machine) puts("EXTERNALS-BEGIN");
1584
else puts("externals {");
1586
EINA_LIST_FOREACH(externals, l, key)
1588
if (machine) printf("EXTERNAL: %s\n", key);
1589
else printf(INDENT "external: \"%s\";\n", key);
1592
if (machine) puts("EXTERNALS-END");
1595
edje_edit_string_list_free(externals);
1596
evas_object_del(ed);
1601
main(int argc, char **argv)
1603
Eina_Bool quit_option = EINA_FALSE;
1605
char *detail_name = NULL;
1608
Ecore_Getopt_Value values[] = {
1609
ECORE_GETOPT_VALUE_STR(mode),
1610
ECORE_GETOPT_VALUE_STR(detail_name),
1611
ECORE_GETOPT_VALUE_STR(group),
1612
ECORE_GETOPT_VALUE_STR(part),
1613
ECORE_GETOPT_VALUE_STR(program),
1614
ECORE_GETOPT_VALUE_BOOL(api_only),
1615
ECORE_GETOPT_VALUE_BOOL(api_fix),
1616
ECORE_GETOPT_VALUE_BOOL(machine),
1617
ECORE_GETOPT_VALUE_BOOL(quit_option),
1618
ECORE_GETOPT_VALUE_BOOL(quit_option),
1619
ECORE_GETOPT_VALUE_BOOL(quit_option),
1620
ECORE_GETOPT_VALUE_BOOL(quit_option),
1621
ECORE_GETOPT_VALUE_NONE
1624
setlocale(LC_NUMERIC, "C");
1626
ecore_app_no_system_modules();
1633
_log_dom = eina_log_domain_register("edje_inspector", EINA_COLOR_YELLOW);
1636
EINA_LOG_CRIT("could not register log domain 'edje_inspector'");
1641
arg_index = ecore_getopt_parse(&optdesc, values, argc, argv);
1644
ERR("could not parse arguments.");
1648
else if (quit_option)
1650
else if (arg_index != argc - 1)
1652
ERR("incorrect number of parameters. Requires one single file.");
1657
if (!mode) mode = (char *)mode_choices[0];
1661
if (!strcmp(detail_name, "none")) detail = 0;
1662
else if (!strcmp(detail_name, "terse"))
1664
else if (!strcmp(detail_name, "all"))
1666
else ERR("Unknown detail level: '%s'", detail_name);
1669
file = argv[arg_index];
1672
if (access(file, R_OK) == -1)
1675
ERR("File '%s' not accessible, error %d (%s).\n",
1676
file, e, strerror(e));
1681
DBG("mode=%s, detail=%d(%s), group=%s, part=%s, program=%s, api-only=%hhu"
1682
", api-fix=%hhu, machine=%hhu, file=%s",
1683
mode, detail, detail_name,
1686
program ? program : "",
1687
api_only, api_fix, machine, file);
1689
groups = edje_file_collection_list(file);
1692
ERR("no groups in edje file '%s'", file);
1697
if (!strcmp(mode, "groups-names")) ret = _groups_names_list();
1700
ee = ecore_evas_buffer_new(1, 1);
1703
ERR("could not create ecore_evas_buffer");
1708
if (!strcmp(mode, "parts-names")) ret = _parts_names_list();
1709
else if (!strcmp(mode, "global-data"))
1710
ret = _gdata_list();
1711
else if (!strcmp(mode, "images"))
1712
ret = _images_list();
1713
else if (!strcmp(mode, "fonts"))
1714
ret = _fonts_list();
1715
else if (!strcmp(mode, "externals"))
1716
ret = _externals_list();
1717
else ret = _list(mode);
1718
ecore_evas_free(ee);
1722
edje_file_collection_list_free(groups);
1724
eina_log_domain_unregister(_log_dom);
1727
ecore_evas_shutdown();