1 #include "private.h"
2 #include <assert.h>
3 #include <Elementary.h>
4 #include "config.h"
5 #include "colors.h"
6 
7 #define COLORSCHEMES_FILENAME "colorschemes.eet"
8 #define COLORSCHEMES_VERSION  1
9 
10 #define CS(R,G,B) {.r = R, .g = G, .b = B, .a = 255}
11 static Color_Scheme default_colorscheme =
12 {
13    .version = COLORSCHEMES_VERSION,
14    .md = {
15         .version = 1,
16         .name = "Default",
17         .author = gettext_noop("Terminology's developers"),
18         .website = "https://www.enlightenment.org/about-terminology",
19         .license = "BSD-2-Clause",
20    },
21    .bg = CS(32, 32, 32), /* #202020 */
22    .main = CS(53, 153, 255), /* #3599ff */
23    .hl = CS(255,255,255), /* #ffffff */
24    .end_sel = CS(255,51,0), /* #ff3300 */
25    .tab_missed_1 = CS(255,153,51), /* #ff9933 */
26    .tab_missed_2 = CS(255,51,0), /* #ff3300 */
27    .tab_missed_3 = CS(255,0,0), /* #ff0000 */
28    .tab_missed_over_1 = CS(255,255,64), /* #ffff40 */
29    .tab_missed_over_2 = CS(255,153,51), /* #ff9933 */
30    .tab_missed_over_3 = CS(255,0,0), /* #ff0000 */
31    .tab_title_2 = CS(0,0,0), /* #000000 */
32    .normal = {
33         .def        = CS(170, 170, 170), /* #aaaaaa */
34         .black      = CS(  0,   0,   0), /* #000000 */
35         .red        = CS(204,  51,  51), /* #cc3333 */
36         .green      = CS( 51, 204,  51), /* #33cc33 */
37         .yellow     = CS(204, 136,  51), /* #cc8833 */
38         .blue       = CS( 51,  51, 204), /* #3333cc */
39         .magenta    = CS(204,  51, 204), /* #cc33cc */
40         .cyan       = CS( 51, 204, 204), /* #33cccc */
41         .white      = CS(204, 204, 204), /* #cccccc */
42         .inverse_fg = CS( 34,  34,  34), /* #222222 */
43         .inverse_bg = CS(170, 170, 170), /* #aaaaaa */
44    },
45    .bright = {
46         .def        = CS(238, 238, 238), /* #eeeeee */
47         .black      = CS(102, 102, 102), /* #666666 */
48         .red        = CS(255, 102, 102), /* #ff6666 */
49         .green      = CS(102, 255, 102), /* #66ff66 */
50         .yellow     = CS(255, 255, 102), /* #ffff66 */
51         .blue       = CS(102, 102, 255), /* #6666ff */
52         .magenta    = CS(255, 102, 255), /* #ff66ff */
53         .cyan       = CS(102, 255, 255), /* #66ffff */
54         .white      = CS(255, 255, 255), /* #ffffff */
55         .inverse_fg = CS( 17,  17,  17), /* #111111 */
56         .inverse_bg = CS(238, 238, 238), /* #eeeeee */
57    },
58    .faint = {
59         .def        = CS(135, 135, 135), /* #878787 */
60         .black      = CS(  8,   8,   8), /* #080808 */
61         .red        = CS(152,   8,   8), /* #980808 */
62         .green      = CS(  8, 152,   8), /* #089808 */
63         .yellow     = CS(152, 152,   8), /* #989808 */
64         .blue       = CS(  8,   8, 152), /* #080898 */
65         .magenta    = CS(152,   8, 152), /* #980898 */
66         .cyan       = CS(  8, 152, 152), /* #089898 */
67         .white      = CS(152, 152, 152), /* #989898 */
68         .inverse_fg = CS( 33,  33,  33), /* #212121 */
69         .inverse_bg = CS(135, 135, 135), /* #878787 */
70    },
71    .brightfaint = {
72         .def        = CS(186, 186, 186), /* #bababa */
73         .black      = CS( 84,  84,  84), /* #545454 */
74         .red        = CS(199,  84,  84), /* #c75454 */
75         .green      = CS( 84, 199,  84), /* #54c754 */
76         .yellow     = CS(199, 199,  84), /* #c7c754 */
77         .blue       = CS( 84,  84, 199), /* #5454c7 */
78         .magenta    = CS(199,  84, 199), /* #c754c7 */
79         .cyan       = CS( 84, 199, 199), /* #54c7c7 */
80         .white      = CS(199, 199, 199), /* #c7c7c7 */
81         .inverse_fg = CS( 20,  20,  20), /* #141414 */
82         .inverse_bg = CS(186, 186, 186), /* #bababa */
83    }
84 };
85 #undef CS
86 
87 static const Color default_colors[4][12] =
88 {
89      { // normal
90           { 0xaa, 0xaa, 0xaa, 0xff }, // COL_DEF
91           { 0x00, 0x00, 0x00, 0xff }, // COL_BLACK
92           { 0xc0, 0x00, 0x00, 0xff }, // COL_RED
93           { 0x00, 0xc0, 0x00, 0xff }, // COL_GREEN
94           { 0xc0, 0xc0, 0x00, 0xff }, // COL_YELLOW
95           { 0x00, 0x00, 0xc0, 0xff }, // COL_BLUE
96           { 0xc0, 0x00, 0xc0, 0xff }, // COL_MAGENTA
97           { 0x00, 0xc0, 0xc0, 0xff }, // COL_CYAN
98           { 0xc0, 0xc0, 0xc0, 0xff }, // COL_WHITE
99           { 0x00, 0x00, 0x00, 0x00 }, // COL_INVIS
100           { 0x22, 0x22, 0x22, 0xff }, // COL_INVERSE
101           { 0xaa, 0xaa, 0xaa, 0xff }, // COL_INVERSEBG
102      },
103      { // bright/bold
104           { 0xee, 0xee, 0xee, 0xff }, // COL_DEF
105           { 0xcc, 0xcc, 0xcc, 0xff }, // COL_BLACK
106           { 0xcc, 0x88, 0x88, 0xff }, // COL_RED
107           { 0x88, 0xcc, 0x88, 0xff }, // COL_GREEN
108           { 0xcc, 0xaa, 0x88, 0xff }, // COL_YELLOW
109           { 0x88, 0x88, 0xcc, 0xff }, // COL_BLUE
110           { 0xcc, 0x88, 0xcc, 0xff }, // COL_MAGENTA
111           { 0x88, 0xcc, 0xcc, 0xff }, // COL_CYAN
112           { 0xcc, 0xcc, 0xcc, 0xff }, // COL_WHITE
113           { 0x00, 0x00, 0x00, 0x00 }, // COL_INVIS
114           { 0x11, 0x11, 0x11, 0xff }, // COL_INVERSE
115           { 0xee, 0xee, 0xee, 0xff }, // COL_INVERSEBG
116      },
117      { // faint
118           { 0x80, 0x80, 0x80, 0xff }, // COL_DEF
119           { 0x08, 0x08, 0x08, 0xff }, // COL_BLACK
120           { 0x98, 0x08, 0x08, 0xff }, // COL_RED
121           { 0x08, 0x98, 0x08, 0x98 }, // COL_GREEN
122           { 0x98, 0x98, 0x08, 0x98 }, // COL_YELLOW
123           { 0x08, 0x08, 0x98, 0x98 }, // COL_BLUE
124           { 0x98, 0x08, 0x98, 0x98 }, // COL_MAGENTA
125           { 0x08, 0x98, 0x98, 0x98 }, // COL_CYAN
126           { 0x98, 0x98, 0x98, 0x98 }, // COL_WHITE
127           { 0x00, 0x00, 0x00, 0x00 }, // COL_INVIS
128           { 0x21, 0x21, 0x21, 0xff }, // COL_INVERSE
129           { 0x87, 0x87, 0x87, 0xff }, // COL_INVERSEBG
130      },
131      { // bright + faint
132           { 0xba, 0xba, 0xba, 0xff }, // COL_DEF
133           { 0x54, 0x54, 0x54, 0xff }, // COL_BLACK
134           { 0xc7, 0x54, 0x54, 0xff }, // COL_RED
135           { 0x54, 0xc7, 0x54, 0xc7 }, // COL_GREEN
136           { 0xc7, 0xc7, 0x54, 0xc7 }, // COL_YELLOW
137           { 0x54, 0x54, 0xc7, 0xc7 }, // COL_BLUE
138           { 0xc7, 0x54, 0xc7, 0xc7 }, // COL_MAGENTA
139           { 0x54, 0xc7, 0xc7, 0xc7 }, // COL_CYAN
140           { 0xc7, 0xc7, 0xc7, 0xc7 }, // COL_WHITE
141           { 0x00, 0x00, 0x00, 0x00 }, // COL_INVIS
142           { 0x14, 0x14, 0x14, 0xff }, // COL_INVERSE
143           { 0xba, 0xba, 0xba, 0xff }, // COL_INVERSEBG
144      }
145 };
146 
147 static const Color default_colors256[256] =
148 {
149    // basic 16 repeated
150    { 0x00, 0x00, 0x00, 0xff }, // COL_BLACK
151    { 0xc0, 0x00, 0x00, 0xff }, // COL_RED
152    { 0x00, 0xc0, 0x00, 0xff }, // COL_GREEN
153    { 0xc0, 0xc0, 0x00, 0xff }, // COL_YELLOW
154    { 0x00, 0x00, 0xc0, 0xff }, // COL_BLUE
155    { 0xc0, 0x00, 0xc0, 0xff }, // COL_MAGENTA
156    { 0x00, 0xc0, 0xc0, 0xff }, // COL_CYAN
157    { 0xc0, 0xc0, 0xc0, 0xff }, // COL_WHITE
158 
159    { 0x80, 0x80, 0x80, 0xff }, // COL_BLACK
160    { 0xff, 0x80, 0x80, 0xff }, // COL_RED
161    { 0x80, 0xff, 0x80, 0xff }, // COL_GREEN
162    { 0xff, 0xff, 0x80, 0xff }, // COL_YELLOW
163    { 0x80, 0x80, 0xff, 0xff }, // COL_BLUE
164    { 0xff, 0x80, 0xff, 0xff }, // COL_MAGENTA
165    { 0x80, 0xff, 0xff, 0xff }, // COL_CYAN
166    { 0xff, 0xff, 0xff, 0xff }, // COL_WHITE
167 
168    // pure 6x6x6 colorcube
169    { 0x00, 0x00, 0x00, 0xff },
170    { 0x00, 0x00, 0x5f, 0xff },
171    { 0x00, 0x00, 0x87, 0xff },
172    { 0x00, 0x00, 0xaf, 0xff },
173    { 0x00, 0x00, 0xd7, 0xff },
174    { 0x00, 0x00, 0xff, 0xff },
175 
176    { 0x00, 0x5f, 0x00, 0xff },
177    { 0x00, 0x5f, 0x5f, 0xff },
178    { 0x00, 0x5f, 0x87, 0xff },
179    { 0x00, 0x5f, 0xaf, 0xff },
180    { 0x00, 0x5f, 0xd7, 0xff },
181    { 0x00, 0x5f, 0xff, 0xff },
182 
183    { 0x00, 0x87, 0x00, 0xff },
184    { 0x00, 0x87, 0x5f, 0xff },
185    { 0x00, 0x87, 0x87, 0xff },
186    { 0x00, 0x87, 0xaf, 0xff },
187    { 0x00, 0x87, 0xd7, 0xff },
188    { 0x00, 0x87, 0xff, 0xff },
189 
190    { 0x00, 0xaf, 0x00, 0xff },
191    { 0x00, 0xaf, 0x5f, 0xff },
192    { 0x00, 0xaf, 0x87, 0xff },
193    { 0x00, 0xaf, 0xaf, 0xff },
194    { 0x00, 0xaf, 0xd7, 0xff },
195    { 0x00, 0xaf, 0xff, 0xff },
196 
197    { 0x00, 0xd7, 0x00, 0xff },
198    { 0x00, 0xd7, 0x5f, 0xff },
199    { 0x00, 0xd7, 0x87, 0xff },
200    { 0x00, 0xd7, 0xaf, 0xff },
201    { 0x00, 0xd7, 0xd7, 0xff },
202    { 0x00, 0xd7, 0xff, 0xff },
203 
204    { 0x00, 0xff, 0x00, 0xff },
205    { 0x00, 0xff, 0x5f, 0xff },
206    { 0x00, 0xff, 0x87, 0xff },
207    { 0x00, 0xff, 0xaf, 0xff },
208    { 0x00, 0xff, 0xd7, 0xff },
209    { 0x00, 0xff, 0xff, 0xff },
210 
211    { 0x5f, 0x00, 0x00, 0xff },
212    { 0x5f, 0x00, 0x5f, 0xff },
213    { 0x5f, 0x00, 0x87, 0xff },
214    { 0x5f, 0x00, 0xaf, 0xff },
215    { 0x5f, 0x00, 0xd7, 0xff },
216    { 0x5f, 0x00, 0xff, 0xff },
217 
218    { 0x5f, 0x5f, 0x00, 0xff },
219    { 0x5f, 0x5f, 0x5f, 0xff },
220    { 0x5f, 0x5f, 0x87, 0xff },
221    { 0x5f, 0x5f, 0xaf, 0xff },
222    { 0x5f, 0x5f, 0xd7, 0xff },
223    { 0x5f, 0x5f, 0xff, 0xff },
224 
225    { 0x5f, 0x87, 0x00, 0xff },
226    { 0x5f, 0x87, 0x5f, 0xff },
227    { 0x5f, 0x87, 0x87, 0xff },
228    { 0x5f, 0x87, 0xaf, 0xff },
229    { 0x5f, 0x87, 0xd7, 0xff },
230    { 0x5f, 0x87, 0xff, 0xff },
231 
232    { 0x5f, 0xaf, 0x00, 0xff },
233    { 0x5f, 0xaf, 0x5f, 0xff },
234    { 0x5f, 0xaf, 0x87, 0xff },
235    { 0x5f, 0xaf, 0xaf, 0xff },
236    { 0x5f, 0xaf, 0xd7, 0xff },
237    { 0x5f, 0xaf, 0xff, 0xff },
238 
239    { 0x5f, 0xd7, 0x00, 0xff },
240    { 0x5f, 0xd7, 0x5f, 0xff },
241    { 0x5f, 0xd7, 0x87, 0xff },
242    { 0x5f, 0xd7, 0xaf, 0xff },
243    { 0x5f, 0xd7, 0xd7, 0xff },
244    { 0x5f, 0xd7, 0xff, 0xff },
245 
246    { 0x5f, 0xff, 0x00, 0xff },
247    { 0x5f, 0xff, 0x5f, 0xff },
248    { 0x5f, 0xff, 0x87, 0xff },
249    { 0x5f, 0xff, 0xaf, 0xff },
250    { 0x5f, 0xff, 0xd7, 0xff },
251    { 0x5f, 0xff, 0xff, 0xff },
252 
253    { 0x87, 0x00, 0x00, 0xff },
254    { 0x87, 0x00, 0x5f, 0xff },
255    { 0x87, 0x00, 0x87, 0xff },
256    { 0x87, 0x00, 0xaf, 0xff },
257    { 0x87, 0x00, 0xd7, 0xff },
258    { 0x87, 0x00, 0xff, 0xff },
259 
260    { 0x87, 0x5f, 0x00, 0xff },
261    { 0x87, 0x5f, 0x5f, 0xff },
262    { 0x87, 0x5f, 0x87, 0xff },
263    { 0x87, 0x5f, 0xaf, 0xff },
264    { 0x87, 0x5f, 0xd7, 0xff },
265    { 0x87, 0x5f, 0xff, 0xff },
266 
267    { 0x87, 0x87, 0x00, 0xff },
268    { 0x87, 0x87, 0x5f, 0xff },
269    { 0x87, 0x87, 0x87, 0xff },
270    { 0x87, 0x87, 0xaf, 0xff },
271    { 0x87, 0x87, 0xd7, 0xff },
272    { 0x87, 0x87, 0xff, 0xff },
273 
274    { 0x87, 0xaf, 0x00, 0xff },
275    { 0x87, 0xaf, 0x5f, 0xff },
276    { 0x87, 0xaf, 0x87, 0xff },
277    { 0x87, 0xaf, 0xaf, 0xff },
278    { 0x87, 0xaf, 0xd7, 0xff },
279    { 0x87, 0xaf, 0xff, 0xff },
280 
281    { 0x87, 0xd7, 0x00, 0xff },
282    { 0x87, 0xd7, 0x5f, 0xff },
283    { 0x87, 0xd7, 0x87, 0xff },
284    { 0x87, 0xd7, 0xaf, 0xff },
285    { 0x87, 0xd7, 0xd7, 0xff },
286    { 0x87, 0xd7, 0xff, 0xff },
287 
288    { 0x87, 0xff, 0x00, 0xff },
289    { 0x87, 0xff, 0x5f, 0xff },
290    { 0x87, 0xff, 0x87, 0xff },
291    { 0x87, 0xff, 0xaf, 0xff },
292    { 0x87, 0xff, 0xd7, 0xff },
293    { 0x87, 0xff, 0xff, 0xff },
294 
295    { 0xaf, 0x00, 0x00, 0xff },
296    { 0xaf, 0x00, 0x5f, 0xff },
297    { 0xaf, 0x00, 0x87, 0xff },
298    { 0xaf, 0x00, 0xaf, 0xff },
299    { 0xaf, 0x00, 0xd7, 0xff },
300    { 0xaf, 0x00, 0xff, 0xff },
301 
302    { 0xaf, 0x5f, 0x00, 0xff },
303    { 0xaf, 0x5f, 0x5f, 0xff },
304    { 0xaf, 0x5f, 0x87, 0xff },
305    { 0xaf, 0x5f, 0xaf, 0xff },
306    { 0xaf, 0x5f, 0xd7, 0xff },
307    { 0xaf, 0x5f, 0xff, 0xff },
308 
309    { 0xaf, 0x87, 0x00, 0xff },
310    { 0xaf, 0x87, 0x5f, 0xff },
311    { 0xaf, 0x87, 0x87, 0xff },
312    { 0xaf, 0x87, 0xaf, 0xff },
313    { 0xaf, 0x87, 0xd7, 0xff },
314    { 0xaf, 0x87, 0xff, 0xff },
315 
316    { 0xaf, 0xaf, 0x00, 0xff },
317    { 0xaf, 0xaf, 0x5f, 0xff },
318    { 0xaf, 0xaf, 0x87, 0xff },
319    { 0xaf, 0xaf, 0xaf, 0xff },
320    { 0xaf, 0xaf, 0xd7, 0xff },
321    { 0xaf, 0xaf, 0xff, 0xff },
322 
323    { 0xaf, 0xd7, 0x00, 0xff },
324    { 0xaf, 0xd7, 0x5f, 0xff },
325    { 0xaf, 0xd7, 0x87, 0xff },
326    { 0xaf, 0xd7, 0xaf, 0xff },
327    { 0xaf, 0xd7, 0xd7, 0xff },
328    { 0xaf, 0xd7, 0xff, 0xff },
329 
330    { 0xaf, 0xff, 0x00, 0xff },
331    { 0xaf, 0xff, 0x5f, 0xff },
332    { 0xaf, 0xff, 0x87, 0xff },
333    { 0xaf, 0xff, 0xaf, 0xff },
334    { 0xaf, 0xff, 0xd7, 0xff },
335    { 0xaf, 0xff, 0xff, 0xff },
336 
337    { 0xd7, 0x00, 0x00, 0xff },
338    { 0xd7, 0x00, 0x5f, 0xff },
339    { 0xd7, 0x00, 0x87, 0xff },
340    { 0xd7, 0x00, 0xaf, 0xff },
341    { 0xd7, 0x00, 0xd7, 0xff },
342    { 0xd7, 0x00, 0xff, 0xff },
343 
344    { 0xd7, 0x5f, 0x00, 0xff },
345    { 0xd7, 0x5f, 0x5f, 0xff },
346    { 0xd7, 0x5f, 0x87, 0xff },
347    { 0xd7, 0x5f, 0xaf, 0xff },
348    { 0xd7, 0x5f, 0xd7, 0xff },
349    { 0xd7, 0x5f, 0xff, 0xff },
350 
351    { 0xd7, 0x87, 0x00, 0xff },
352    { 0xd7, 0x87, 0x5f, 0xff },
353    { 0xd7, 0x87, 0x87, 0xff },
354    { 0xd7, 0x87, 0xaf, 0xff },
355    { 0xd7, 0x87, 0xd7, 0xff },
356    { 0xd7, 0x87, 0xff, 0xff },
357 
358    { 0xd7, 0xaf, 0x00, 0xff },
359    { 0xd7, 0xaf, 0x5f, 0xff },
360    { 0xd7, 0xaf, 0x87, 0xff },
361    { 0xd7, 0xaf, 0xaf, 0xff },
362    { 0xd7, 0xaf, 0xd7, 0xff },
363    { 0xd7, 0xaf, 0xff, 0xff },
364 
365    { 0xd7, 0xd7, 0x00, 0xff },
366    { 0xd7, 0xd7, 0x5f, 0xff },
367    { 0xd7, 0xd7, 0x87, 0xff },
368    { 0xd7, 0xd7, 0xaf, 0xff },
369    { 0xd7, 0xd7, 0xd7, 0xff },
370    { 0xd7, 0xd7, 0xff, 0xff },
371 
372    { 0xd7, 0xff, 0x00, 0xff },
373    { 0xd7, 0xff, 0x5f, 0xff },
374    { 0xd7, 0xff, 0x87, 0xff },
375    { 0xd7, 0xff, 0xaf, 0xff },
376    { 0xd7, 0xff, 0xd7, 0xff },
377    { 0xd7, 0xff, 0xff, 0xff },
378 
379 
380    { 0xff, 0x00, 0x00, 0xff },
381    { 0xff, 0x00, 0x5f, 0xff },
382    { 0xff, 0x00, 0x87, 0xff },
383    { 0xff, 0x00, 0xaf, 0xff },
384    { 0xff, 0x00, 0xd7, 0xff },
385    { 0xff, 0x00, 0xff, 0xff },
386 
387    { 0xff, 0x5f, 0x00, 0xff },
388    { 0xff, 0x5f, 0x5f, 0xff },
389    { 0xff, 0x5f, 0x87, 0xff },
390    { 0xff, 0x5f, 0xaf, 0xff },
391    { 0xff, 0x5f, 0xd7, 0xff },
392    { 0xff, 0x5f, 0xff, 0xff },
393 
394    { 0xff, 0x87, 0x00, 0xff },
395    { 0xff, 0x87, 0x5f, 0xff },
396    { 0xff, 0x87, 0x87, 0xff },
397    { 0xff, 0x87, 0xaf, 0xff },
398    { 0xff, 0x87, 0xd7, 0xff },
399    { 0xff, 0x87, 0xff, 0xff },
400 
401    { 0xff, 0xaf, 0x00, 0xff },
402    { 0xff, 0xaf, 0x5f, 0xff },
403    { 0xff, 0xaf, 0x87, 0xff },
404    { 0xff, 0xaf, 0xaf, 0xff },
405    { 0xff, 0xaf, 0xd7, 0xff },
406    { 0xff, 0xaf, 0xff, 0xff },
407 
408    { 0xff, 0xd7, 0x00, 0xff },
409    { 0xff, 0xd7, 0x5f, 0xff },
410    { 0xff, 0xd7, 0x87, 0xff },
411    { 0xff, 0xd7, 0xaf, 0xff },
412    { 0xff, 0xd7, 0xd7, 0xff },
413    { 0xff, 0xd7, 0xff, 0xff },
414 
415    { 0xff, 0xff, 0x00, 0xff },
416    { 0xff, 0xff, 0x5f, 0xff },
417    { 0xff, 0xff, 0x87, 0xff },
418    { 0xff, 0xff, 0xaf, 0xff },
419    { 0xff, 0xff, 0xd7, 0xff },
420    { 0xff, 0xff, 0xff, 0xff },
421 
422    // greyscale ramp (24 not including black and white, so 26 if included)
423    { 0x08, 0x08, 0x08, 0xff },
424    { 0x12, 0x12, 0x12, 0xff },
425    { 0x1c, 0x1c, 0x1c, 0xff },
426    { 0x26, 0x26, 0x26, 0xff },
427    { 0x30, 0x30, 0x30, 0xff },
428    { 0x3a, 0x3a, 0x3a, 0xff },
429    { 0x44, 0x44, 0x44, 0xff },
430    { 0x4e, 0x4e, 0x4e, 0xff },
431    { 0x58, 0x58, 0x58, 0xff },
432    { 0x62, 0x62, 0x62, 0xff },
433    { 0x6c, 0x6c, 0x6c, 0xff },
434    { 0x76, 0x76, 0x76, 0xff },
435    { 0x80, 0x80, 0x80, 0xff },
436    { 0x8a, 0x8a, 0x8a, 0xff },
437    { 0x94, 0x94, 0x94, 0xff },
438    { 0x9e, 0x9e, 0x9e, 0xff },
439    { 0xa8, 0xa8, 0xa8, 0xff },
440    { 0xb2, 0xb2, 0xb2, 0xff },
441    { 0xbc, 0xbc, 0xbc, 0xff },
442    { 0xc6, 0xc6, 0xc6, 0xff },
443    { 0xd0, 0xd0, 0xd0, 0xff },
444    { 0xda, 0xda, 0xda, 0xff },
445    { 0xe4, 0xe4, 0xe4, 0xff },
446    { 0xee, 0xee, 0xee, 0xff },
447 };
448 
449 static Eet_Data_Descriptor *edd_cs = NULL;
450 static Eet_Data_Descriptor *edd_cb = NULL;
451 static Eet_Data_Descriptor *edd_color = NULL;
452 
453 void
colors_term_init(Evas_Object * textgrid,const Color_Scheme * cs)454 colors_term_init(Evas_Object *textgrid,
455                  const Color_Scheme *cs)
456 {
457    int c;
458    int r, g , b, a;
459 
460    if (!cs)
461      cs = &default_colorscheme;
462 
463 #define CS_SET_INVISIBLE(_c)  do {                         \
464         evas_object_textgrid_palette_set(                  \
465            textgrid, EVAS_TEXTGRID_PALETTE_STANDARD, _c,   \
466            0, 0, 0, 0);                                    \
467 } while(0)
468 #define CS_SET(_c, _F) do {                                \
469         r = cs->_F.r;                                      \
470         g = cs->_F.g;                                      \
471         b = cs->_F.b;                                      \
472         a = cs->_F.a;                                      \
473         evas_object_textgrid_palette_set(                  \
474            textgrid, EVAS_TEXTGRID_PALETTE_STANDARD, _c,   \
475            r, g, b, a);                                    \
476 } while (0)
477 
478    /* Normal */
479    CS_SET(0 /* def */,     normal.def);
480    CS_SET(1 /* black */,   normal.black);
481    CS_SET(2 /* red */,     normal.red);
482    CS_SET(3 /* green */,   normal.green);
483    CS_SET(4 /* yellow */,  normal.yellow);
484    CS_SET(5 /* blue */,    normal.blue);
485    CS_SET(6 /* magenta */, normal.magenta);
486    CS_SET(7 /* cyan */,    normal.cyan);
487    CS_SET(8 /* white */,   normal.white);
488    CS_SET_INVISIBLE(9);
489    CS_SET(10 /* inverse fg */, normal.inverse_fg);
490    CS_SET(11 /* inverse bg */, normal.inverse_bg);
491 
492    /* Bold */
493    CS_SET(12 /* def */,     bright.def);
494    CS_SET(13 /* black */,   bright.black);
495    CS_SET(14 /* red */,     bright.red);
496    CS_SET(15 /* green */,   bright.green);
497    CS_SET(16 /* yellow */,  bright.yellow);
498    CS_SET(17 /* blue */,    bright.blue);
499    CS_SET(18 /* magenta */, bright.magenta);
500    CS_SET(19 /* cyan */,    bright.cyan);
501    CS_SET(20 /* white */,   bright.white);
502    CS_SET_INVISIBLE(21);
503    CS_SET(22 /* inverse fg */, bright.inverse_fg);
504    CS_SET(23 /* inverse bg */, bright.inverse_bg);
505 
506    /* Faint */
507    CS_SET(24 /* def */,     faint.def);
508    CS_SET(25 /* black */,   faint.black);
509    CS_SET(26 /* red */,     faint.red);
510    CS_SET(27 /* green */,   faint.green);
511    CS_SET(28 /* yellow */,  faint.yellow);
512    CS_SET(29 /* blue */,    faint.blue);
513    CS_SET(30 /* magenta */, faint.magenta);
514    CS_SET(31 /* cyan */,    faint.cyan);
515    CS_SET(32 /* white */,   faint.white);
516    CS_SET_INVISIBLE(33);
517    CS_SET(34 /* inverse fg */, faint.inverse_fg);
518    CS_SET(35 /* inverse bg */, faint.inverse_bg);
519 
520    /* BrightFaint */
521    CS_SET(36 /* def */,     faint.def);
522    CS_SET(37 /* black */,   faint.black);
523    CS_SET(38 /* red */,     faint.red);
524    CS_SET(39 /* green */,   faint.green);
525    CS_SET(40 /* yellow */,  faint.yellow);
526    CS_SET(41 /* blue */,    faint.blue);
527    CS_SET(42 /* magenta */, faint.magenta);
528    CS_SET(43 /* cyan */,    faint.cyan);
529    CS_SET(44 /* white */,   faint.white);
530    CS_SET_INVISIBLE(45);
531    CS_SET(46 /* inverse fg */, faint.inverse_fg);
532    CS_SET(47 /* inverse bg */, faint.inverse_bg);
533 #undef CS_SET
534 
535 #define CS_SET(_c, _F) do {                                \
536         r = cs->_F.r;                                      \
537         g = cs->_F.g;                                      \
538         b = cs->_F.b;                                      \
539         a = cs->_F.a;                                      \
540         evas_object_textgrid_palette_set(                  \
541            textgrid, EVAS_TEXTGRID_PALETTE_EXTENDED, _c,   \
542            r, g, b, a);                                    \
543    } while (0)
544 
545    CS_SET(0 /* black */,   normal.black);
546    CS_SET(1 /* red */,     normal.red);
547    CS_SET(2 /* green */,   normal.green);
548    CS_SET(3 /* yellow */,  normal.yellow);
549    CS_SET(4 /* blue */,    normal.blue);
550    CS_SET(5 /* magenta */, normal.magenta);
551    CS_SET(6 /* cyan */,    normal.cyan);
552    CS_SET(7 /* white */,   normal.white);
553 
554    CS_SET(8 /* black */,    bright.black);
555    CS_SET(9 /* red */,      bright.red);
556    CS_SET(10 /* green */,   bright.green);
557    CS_SET(11 /* yellow */,  bright.yellow);
558    CS_SET(12 /* blue */,    bright.blue);
559    CS_SET(13 /* magenta */, bright.magenta);
560    CS_SET(14 /* cyan */,    bright.cyan);
561    CS_SET(15 /* white */,   bright.white);
562 
563    for (c = 16; c < 256; c++)
564      {
565         r = default_colors256[c].r;
566         g = default_colors256[c].g;
567         b = default_colors256[c].b;
568         a = default_colors256[c].a;
569         evas_object_textgrid_palette_set(
570            textgrid, EVAS_TEXTGRID_PALETTE_EXTENDED, c,
571            r, g, b, a);
572      }
573 #undef CS_SET
574 }
575 
576 void
colors_standard_get(int set,int col,unsigned char * r,unsigned char * g,unsigned char * b,unsigned char * a)577 colors_standard_get(int set, int col,
578                     unsigned char *r,
579                     unsigned char *g,
580                     unsigned char *b,
581                     unsigned char *a)
582 {
583    assert((set >= 0) && (set < 4));
584 
585    *r = default_colors[set][col].r;
586    *g = default_colors[set][col].g;
587    *b = default_colors[set][col].b;
588    *a = default_colors[set][col].a;
589 }
590 
591 void
colors_256_get(int col,unsigned char * r,unsigned char * g,unsigned char * b,unsigned char * a)592 colors_256_get(int col,
593                unsigned char *r,
594                unsigned char *g,
595                unsigned char *b,
596                unsigned char *a)
597 {
598    assert(col < 256);
599    *r = default_colors256[col].r;
600    *g = default_colors256[col].g;
601    *b = default_colors256[col].b;
602    *a = default_colors256[col].a;
603 }
604 
605 void
color_scheme_apply(Evas_Object * edje,const Color_Scheme * cs)606 color_scheme_apply(Evas_Object *edje,
607                    const Color_Scheme *cs)
608 {
609    EINA_SAFETY_ON_NULL_RETURN(cs);
610 
611 #define CS_SET(_K, _F) do {\
612    if (edje_object_color_class_set(edje, _K,                            \
613                                cs->_F.r, cs->_F.g, cs->_F.b, cs->_F.a,  \
614                                cs->_F.r, cs->_F.g, cs->_F.b, cs->_F.a,  \
615                                cs->_F.r, cs->_F.g, cs->_F.b, cs->_F.a)  \
616        != EINA_TRUE)                                                    \
617        {                                                                \
618           ERR("error setting color class '%s' on object %p", _K, edje); \
619        }                                                                \
620 } while (0)
621 #define CS_SET_MANY(_K, _F1, _F2, _F3) do {                                \
622    if (edje_object_color_class_set(edje, _K,                               \
623                                cs->_F1.r, cs->_F1.g, cs->_F1.b, cs->_F1.a, \
624                                cs->_F2.r, cs->_F2.g, cs->_F2.b, cs->_F2.a, \
625                                cs->_F3.r, cs->_F3.g, cs->_F3.b, cs->_F3.a) \
626        != EINA_TRUE)                                                       \
627        {                                                                   \
628           ERR("error setting color class '%s' on object %p", _K, edje);    \
629        }                                                                   \
630 } while (0)
631 
632    CS_SET("BG", bg);
633    CS_SET("FG", normal.def);
634    CS_SET("CURSOR", main);
635    CS_SET("GLOW", main);
636    CS_SET("HIGHLIGHT", hl);
637    CS_SET("GLOW_TXT", main);
638    CS_SET_MANY("GLOW_TXT_HIGHLIGHT", hl, main, main);
639 
640    CS_SET("END_SELECTION", end_sel);
641    CS_SET_MANY("TAB_MISSED", tab_missed_1, tab_missed_2, tab_missed_3);
642    CS_SET_MANY("TAB_MISSED_OVER",
643                tab_missed_over_1, tab_missed_over_2, tab_missed_over_3);
644    CS_SET_MANY("TAB_TITLE", normal.def, tab_title_2, bg);
645 
646 #define CS_DARK      64,  64,  64, 255
647 edje_object_color_class_set(edje, "BG_SENDFILE", CS_DARK, CS_DARK, CS_DARK);
648 #undef CS_DARK
649 
650 #undef CS_SET
651 #undef CS_SET_MANY
652 }
653 
654 static Color_Scheme *
_color_scheme_get_from_file(const char * path,const char * name)655 _color_scheme_get_from_file(const char *path, const char *name)
656 {
657    Eet_File *ef;
658    Color_Scheme *cs;
659 
660    ef = eet_open(path, EET_FILE_MODE_READ);
661    if (!ef)
662      return NULL;
663 
664    cs = eet_data_read(ef, edd_cs, name);
665    eet_close(ef);
666 
667    return cs;
668 }
669 
670 static Color_Scheme *
_color_scheme_get(const char * name)671 _color_scheme_get(const char *name)
672 {
673    static char path_user[PATH_MAX] = "";
674    static char path_app[PATH_MAX] = "";
675    Color_Scheme *cs_user;
676    Color_Scheme *cs_app;
677 
678    snprintf(path_user, sizeof(path_user) - 1,
679             "%s/terminology/" COLORSCHEMES_FILENAME,
680             efreet_config_home_get());
681 
682    snprintf(path_app, sizeof(path_app) - 1,
683             "%s/" COLORSCHEMES_FILENAME,
684             elm_app_data_dir_get());
685 
686    cs_user = _color_scheme_get_from_file(path_user, name);
687    cs_app = _color_scheme_get_from_file(path_app, name);
688 
689    if (cs_user && cs_app)
690      {
691         /* Prefer user file */
692         if (cs_user->md.version >= cs_app->md.version)
693           return cs_user;
694         else
695           return cs_app;
696      }
697    else if (cs_user)
698      return cs_user;
699    else if (cs_app)
700      return cs_app;
701    else
702      return NULL;
703 }
704 
705 void
config_compute_color_scheme(Config * cfg)706 config_compute_color_scheme(Config *cfg)
707 {
708    EINA_SAFETY_ON_NULL_RETURN(cfg);
709 
710    free((void*)cfg->color_scheme);
711    cfg->color_scheme = _color_scheme_get(cfg->color_scheme_name);
712    if (!cfg->color_scheme)
713      {
714         eina_stringshare_del(cfg->color_scheme_name);
715         cfg->color_scheme_name = eina_stringshare_add("Default");
716         cfg->color_scheme = color_scheme_dup(&default_colorscheme);
717      }
718 }
719 
720 
721 static int
color_scheme_cmp(const void * d1,const void * d2)722 color_scheme_cmp(const void *d1, const void *d2)
723 {
724    const Color_Scheme *cs1 = d1;
725    const Color_Scheme *cs2 = d2;
726 
727    return strcmp(cs1->md.name, cs2->md.name);
728 }
729 
730 Eina_List *
color_scheme_list(void)731 color_scheme_list(void)
732 {
733    Eina_List *l = NULL;
734    static char path_user[PATH_MAX] = "";
735    static char path_app[PATH_MAX] = "";
736    Eet_File *ef_app = NULL;
737    Eet_File *ef_user = NULL;
738    Eina_Iterator *it = NULL;
739    Eet_Entry *entry;
740    Color_Scheme *cs_user;
741    Color_Scheme *cs_app;
742 
743    snprintf(path_user, sizeof(path_user) - 1,
744             "%s/terminology/" COLORSCHEMES_FILENAME,
745             efreet_config_home_get());
746 
747    snprintf(path_app, sizeof(path_app) - 1,
748             "%s/" COLORSCHEMES_FILENAME,
749             elm_app_data_dir_get());
750 
751    /* Add default theme */
752    cs_app = malloc(sizeof(*cs_app));
753    if (!cs_app)
754      return NULL;
755    memcpy(cs_app, &default_colorscheme, sizeof(*cs_app));
756    l = eina_list_sorted_insert(l, color_scheme_cmp, cs_app);
757 
758    ef_app = eet_open(path_app, EET_FILE_MODE_READ);
759    if (!ef_app)
760      {
761         ERR("failed to open '%s'", path_app);
762         goto end;
763      }
764 
765    ef_user = eet_open(path_user, EET_FILE_MODE_READ);
766    if (ef_user)
767      {
768         it = eet_list_entries(ef_user);
769         if (!it)
770           {
771              ERR("failed to list entries in '%s'", path_user);
772              goto end;
773           }
774         EINA_ITERATOR_FOREACH(it, entry)
775           {
776              cs_user = eet_data_read(ef_user, edd_cs, entry->name);
777              if (!cs_user)
778                {
779                   ERR("failed to load color scheme '%s' from '%s'",
780                       entry->name, path_user);
781                   continue;
782                }
783              cs_app = eet_data_read(ef_app, edd_cs, entry->name);
784              if (cs_app)
785                {
786                   /* Prefer user file */
787                   if (cs_user->md.version >= cs_app->md.version)
788                     l = eina_list_sorted_insert(l, color_scheme_cmp, cs_user);
789                   else
790                     free(cs_user);
791                   free(cs_app);
792                }
793              else
794                   l = eina_list_sorted_insert(l, color_scheme_cmp, cs_user);
795           }
796      }
797 
798    it = eet_list_entries(ef_app);
799    if (!it)
800      {
801         ERR("failed to list entries in '%s'", path_app);
802         goto end;
803      }
804    EINA_ITERATOR_FOREACH(it, entry)
805      {
806         cs_app = eet_data_read(ef_app, edd_cs, entry->name);
807         if (!cs_app)
808           {
809              ERR("failed to load color scheme '%s' from '%s'",
810                  entry->name, path_app);
811              continue;
812           }
813         cs_user = eet_data_read(ef_user, edd_cs, entry->name);
814         if (cs_user)
815           {
816              /* Prefer user file if higher version */
817              if (cs_user->md.version < cs_app->md.version)
818                l = eina_list_sorted_insert(l, color_scheme_cmp, cs_app);
819              else
820                free(cs_app);
821              free(cs_user);
822           }
823         else
824           l = eina_list_sorted_insert(l, color_scheme_cmp, cs_app);
825      }
826 end:
827    eina_iterator_free(it);
828    if (ef_app)
829      eet_close(ef_app);
830    if (ef_user)
831      eet_close(ef_user);
832 
833    return l;
834 }
835 
836 Color_Scheme *
color_scheme_dup(const Color_Scheme * src)837 color_scheme_dup(const Color_Scheme *src)
838 {
839    Color_Scheme *cs;
840    if (!src) src = &default_colorscheme;
841    size_t len_name = strlen(src->md.name) + 1;
842    size_t len_author = strlen(src->md.author) + 1;
843    size_t len_website = strlen(src->md.website) + 1;
844    size_t len_license = strlen(src->md.license) + 1;
845    size_t len = sizeof(*cs) + len_name + len_author + len_website
846       + len_license;
847    char *s;
848 
849    cs = malloc(len);
850    if (!cs)
851      return NULL;
852    memcpy(cs, src, sizeof(*cs));
853    s = ((char*)cs) + sizeof(*cs);
854 
855    cs->md.name = s;
856    memcpy(s, src->md.name, len_name);
857    s += len_name;
858 
859    cs->md.author = s;
860    memcpy(s, src->md.author, len_author);
861    s += len_author;
862 
863    cs->md.website = s;
864    memcpy(s, src->md.website, len_website);
865    s += len_website;
866 
867    cs->md.license = s;
868    memcpy(s, src->md.license, len_license);
869 
870    return cs;
871 }
872 
873 void
color_scheme_apply_from_config(Evas_Object * edje,const Config * config)874 color_scheme_apply_from_config(Evas_Object *edje,
875                                const Config *config)
876 {
877    const Color_Scheme *cs;
878 
879    EINA_SAFETY_ON_NULL_RETURN(config);
880    EINA_SAFETY_ON_NULL_RETURN(edje);
881 
882    cs = config->color_scheme;
883    if (!cs)
884      {
885         ERR("Could not find color scheme \"%s\"", config->color_scheme_name);
886         return;
887      }
888    color_scheme_apply(edje, cs);
889 }
890 
891 void
colors_init(void)892 colors_init(void)
893 {
894    Eet_Data_Descriptor_Class eddc_color;
895    Eet_Data_Descriptor_Class eddc_color_block;
896    Eet_Data_Descriptor_Class eddc_color_scheme;
897 
898    eet_eina_stream_data_descriptor_class_set
899      (&eddc_color, sizeof(eddc_color), "Color", sizeof(Color));
900    edd_color = eet_data_descriptor_stream_new(&eddc_color);
901 
902    EET_DATA_DESCRIPTOR_ADD_BASIC
903      (edd_color, Color, "r", r, EET_T_UCHAR);
904    EET_DATA_DESCRIPTOR_ADD_BASIC
905      (edd_color, Color, "g", g, EET_T_UCHAR);
906    EET_DATA_DESCRIPTOR_ADD_BASIC
907      (edd_color, Color, "b", b, EET_T_UCHAR);
908    EET_DATA_DESCRIPTOR_ADD_BASIC
909      (edd_color, Color, "a", a, EET_T_UCHAR);
910 
911 
912    eet_eina_stream_data_descriptor_class_set
913      (&eddc_color_block, sizeof(eddc_color_block), "Color_Block", sizeof(Color_Block));
914    edd_cb = eet_data_descriptor_stream_new(&eddc_color_block);
915 
916    EET_DATA_DESCRIPTOR_ADD_SUB_NESTED
917       (edd_cb, Color_Block, "def", def, edd_color);
918    EET_DATA_DESCRIPTOR_ADD_SUB_NESTED
919       (edd_cb, Color_Block, "black", black, edd_color);
920    EET_DATA_DESCRIPTOR_ADD_SUB_NESTED
921       (edd_cb, Color_Block, "red", red, edd_color);
922    EET_DATA_DESCRIPTOR_ADD_SUB_NESTED
923       (edd_cb, Color_Block, "green", green, edd_color);
924    EET_DATA_DESCRIPTOR_ADD_SUB_NESTED
925       (edd_cb, Color_Block, "yellow", yellow, edd_color);
926    EET_DATA_DESCRIPTOR_ADD_SUB_NESTED
927       (edd_cb, Color_Block, "blue", blue, edd_color);
928    EET_DATA_DESCRIPTOR_ADD_SUB_NESTED
929       (edd_cb, Color_Block, "magenta", magenta, edd_color);
930    EET_DATA_DESCRIPTOR_ADD_SUB_NESTED
931       (edd_cb, Color_Block, "cyan", cyan, edd_color);
932    EET_DATA_DESCRIPTOR_ADD_SUB_NESTED
933       (edd_cb, Color_Block, "white", white, edd_color);
934    EET_DATA_DESCRIPTOR_ADD_SUB_NESTED
935       (edd_cb, Color_Block, "inverse_fg", inverse_fg, edd_color);
936    EET_DATA_DESCRIPTOR_ADD_SUB_NESTED
937       (edd_cb, Color_Block, "inverse_bg", inverse_bg, edd_color);
938 
939 
940    eet_eina_stream_data_descriptor_class_set
941      (&eddc_color_scheme, sizeof(eddc_color_scheme), "Color_Scheme", sizeof(Color_Scheme));
942    edd_cs = eet_data_descriptor_stream_new(&eddc_color_scheme);
943 
944    EET_DATA_DESCRIPTOR_ADD_BASIC
945      (edd_cs, Color_Scheme, "version", version, EET_T_INT);
946 
947    EET_DATA_DESCRIPTOR_ADD_BASIC
948      (edd_cs, Color_Scheme, "md.version", md.version, EET_T_INT);
949    EET_DATA_DESCRIPTOR_ADD_BASIC
950      (edd_cs, Color_Scheme, "md.name", md.name, EET_T_STRING);
951    EET_DATA_DESCRIPTOR_ADD_BASIC
952      (edd_cs, Color_Scheme, "md.author", md.author, EET_T_STRING);
953    EET_DATA_DESCRIPTOR_ADD_BASIC
954      (edd_cs, Color_Scheme, "md.website", md.website, EET_T_STRING);
955    EET_DATA_DESCRIPTOR_ADD_BASIC
956      (edd_cs, Color_Scheme, "md.license", md.license, EET_T_STRING);
957 
958    EET_DATA_DESCRIPTOR_ADD_SUB_NESTED
959       (edd_cs, Color_Scheme, "bg", bg, edd_color);
960    EET_DATA_DESCRIPTOR_ADD_SUB_NESTED
961       (edd_cs, Color_Scheme, "main", main, edd_color);
962    EET_DATA_DESCRIPTOR_ADD_SUB_NESTED
963       (edd_cs, Color_Scheme, "hl", hl, edd_color);
964    EET_DATA_DESCRIPTOR_ADD_SUB_NESTED
965       (edd_cs, Color_Scheme, "end_sel", end_sel, edd_color);
966 
967    EET_DATA_DESCRIPTOR_ADD_SUB_NESTED
968       (edd_cs, Color_Scheme, "tab_missed_1", tab_missed_1, edd_color);
969    EET_DATA_DESCRIPTOR_ADD_SUB_NESTED
970       (edd_cs, Color_Scheme, "tab_missed_2", tab_missed_2, edd_color);
971    EET_DATA_DESCRIPTOR_ADD_SUB_NESTED
972       (edd_cs, Color_Scheme, "tab_missed_3", tab_missed_3, edd_color);
973    EET_DATA_DESCRIPTOR_ADD_SUB_NESTED
974       (edd_cs, Color_Scheme, "tab_missed_over_1", tab_missed_over_1, edd_color);
975    EET_DATA_DESCRIPTOR_ADD_SUB_NESTED
976       (edd_cs, Color_Scheme, "tab_missed_over_2", tab_missed_over_2, edd_color);
977    EET_DATA_DESCRIPTOR_ADD_SUB_NESTED
978       (edd_cs, Color_Scheme, "tab_missed_over_3", tab_missed_over_3, edd_color);
979 
980    EET_DATA_DESCRIPTOR_ADD_SUB_NESTED
981       (edd_cs, Color_Scheme, "tab_title_2", tab_title_2, edd_color);
982 
983    EET_DATA_DESCRIPTOR_ADD_SUB_NESTED
984       (edd_cs, Color_Scheme, "Normal", normal, edd_cb);
985    EET_DATA_DESCRIPTOR_ADD_SUB_NESTED
986       (edd_cs, Color_Scheme, "Bright", bright, edd_cb);
987    EET_DATA_DESCRIPTOR_ADD_SUB_NESTED
988       (edd_cs, Color_Scheme, "Faint", faint, edd_cb);
989    EET_DATA_DESCRIPTOR_ADD_SUB_NESTED
990       (edd_cs, Color_Scheme, "BrightFaint", brightfaint, edd_cb);
991 
992 
993 #if ENABLE_NLS
994    default_colorscheme.md.author = gettext(default_colorscheme.md.author);
995 #endif
996 }
997 
998 void
colors_shutdown(void)999 colors_shutdown(void)
1000 {
1001    eet_data_descriptor_free(edd_cs);
1002    edd_cs = NULL;
1003 
1004    eet_data_descriptor_free(edd_cb);
1005    edd_cb = NULL;
1006 
1007    eet_data_descriptor_free(edd_color);
1008    edd_color = NULL;
1009 }
1010