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