1 /*
2 * Copyright (C) 2000-2019 the xine project
3 *
4 * This file is part of xine, a unix video player.
5 *
6 * xine is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * xine is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19 *
20 */
21 #ifdef HAVE_CONFIG_H
22 #include "config.h"
23 #endif
24
25 #include <stdio.h>
26 #include <stdlib.h>
27 #include <ctype.h>
28 #include <string.h>
29 #include <errno.h>
30 #include <inttypes.h>
31 #include <unistd.h>
32
33 #include <X11/Xlib.h>
34 #include <X11/Intrinsic.h>
35
36 #include "_xitk.h"
37
38 static const xitk_color_names_t xitk_color_names[] = {
39 { 255, 250, 250, "snow" },
40 { 248, 248, 255, "GhostWhite" },
41 { 245, 245, 245, "WhiteSmoke" },
42 { 220, 220, 220, "gainsboro" },
43 { 255, 250, 240, "FloralWhite" },
44 { 253, 245, 230, "OldLace" },
45 { 250, 240, 230, "linen" },
46 { 250, 235, 215, "AntiqueWhite" },
47 { 255, 239, 213, "PapayaWhip" },
48 { 255, 235, 205, "BlanchedAlmond" },
49 { 255, 228, 196, "bisque" },
50 { 255, 218, 185, "PeachPuff" },
51 { 255, 222, 173, "NavajoWhite" },
52 { 255, 228, 181, "moccasin" },
53 { 255, 248, 220, "cornsilk" },
54 { 255, 255, 240, "ivory" },
55 { 255, 250, 205, "LemonChiffon" },
56 { 255, 245, 238, "seashell" },
57 { 240, 255, 240, "honeydew" },
58 { 245, 255, 250, "MintCream" },
59 { 240, 255, 255, "azure" },
60 { 240, 248, 255, "AliceBlue" },
61 { 230, 230, 250, "lavender" },
62 { 255, 240, 245, "LavenderBlush" },
63 { 255, 228, 225, "MistyRose" },
64 { 255, 255, 255, "white" },
65 { 0, 0, 0, "black" },
66 { 47, 79, 79, "DarkSlateGrey" },
67 { 105, 105, 105, "DimGray" },
68 { 105, 105, 105, "DimGrey" },
69 { 112, 128, 144, "SlateGray" },
70 { 112, 128, 144, "SlateGrey" },
71 { 119, 136, 153, "LightSlateGray" },
72 { 119, 136, 153, "LightSlateGrey" },
73 { 190, 190, 190, "gray" },
74 { 190, 190, 190, "grey" },
75 { 211, 211, 211, "LightGrey" },
76 { 211, 211, 211, "LightGray" },
77 { 25, 25, 112, "MidnightBlue" },
78 { 0, 0, 128, "navy" },
79 { 0, 0, 128, "NavyBlue" },
80 { 100, 149, 237, "CornflowerBlue" },
81 { 72, 61, 139, "DarkSlateBlue" },
82 { 106, 90, 205, "SlateBlue" },
83 { 123, 104, 238, "MediumSlateBlue" },
84 { 132, 112, 255, "LightSlateBlue" },
85 { 0, 0, 205, "MediumBlue" },
86 { 65, 105, 225, "RoyalBlue" },
87 { 0, 0, 255, "blue" },
88 { 30, 144, 255, "DodgerBlue" },
89 { 0, 191, 255, "DeepSkyBlue" },
90 { 135, 206, 235, "SkyBlue" },
91 { 135, 206, 250, "LightSkyBlue" },
92 { 70, 130, 180, "SteelBlue" },
93 { 176, 196, 222, "LightSteelBlue" },
94 { 173, 216, 230, "LightBlue" },
95 { 176, 224, 230, "PowderBlue" },
96 { 175, 238, 238, "PaleTurquoise" },
97 { 0, 206, 209, "DarkTurquoise" },
98 { 72, 209, 204, "MediumTurquoise" },
99 { 64, 224, 208, "turquoise" },
100 { 0, 255, 255, "cyan" },
101 { 224, 255, 255, "LightCyan" },
102 { 95, 158, 160, "CadetBlue" },
103 { 102, 205, 170, "MediumAquamarine" },
104 { 127, 255, 212, "aquamarine" },
105 { 0, 100, 0, "DarkGreen" },
106 { 85, 107, 47, "DarkOliveGreen" },
107 { 143, 188, 143, "DarkSeaGreen" },
108 { 46, 139, 87, "SeaGreen" },
109 { 60, 179, 113, "MediumSeaGreen" },
110 { 32, 178, 170, "LightSeaGreen" },
111 { 152, 251, 152, "PaleGreen" },
112 { 0, 255, 127, "SpringGreen" },
113 { 124, 252, 0, "LawnGreen" },
114 { 127, 255, 0, "chartreuse" },
115 { 0, 250, 154, "MediumSpringGreen" },
116 { 173, 255, 47, "GreenYellow" },
117 { 50, 205, 50, "LimeGreen" },
118 { 154, 205, 50, "YellowGreen" },
119 { 34, 139, 34, "ForestGreen" },
120 { 107, 142, 35, "OliveDrab" },
121 { 189, 183, 107, "DarkKhaki" },
122 { 240, 230, 140, "khaki" },
123 { 238, 232, 170, "PaleGoldenrod" },
124 { 250, 250, 210, "LightGoldenrodYellow" },
125 { 255, 255, 224, "LightYellow" },
126 { 255, 255, 0, "yellow" },
127 { 255, 215, 0, "gold" },
128 { 238, 221, 130, "LightGoldenrod" },
129 { 218, 165, 32, "goldenrod" },
130 { 184, 134, 11, "DarkGoldenrod" },
131 { 188, 143, 143, "RosyBrown" },
132 { 205, 92, 92, "IndianRed" },
133 { 139, 69, 19, "SaddleBrown" },
134 { 160, 82, 45, "sienna" },
135 { 205, 133, 63, "peru" },
136 { 222, 184, 135, "burlywood" },
137 { 245, 245, 220, "beige" },
138 { 245, 222, 179, "wheat" },
139 { 244, 164, 96, "SandyBrown" },
140 { 210, 180, 140, "tan" },
141 { 210, 105, 30, "chocolate" },
142 { 178, 34, 34, "firebrick" },
143 { 165, 42, 42, "brown" },
144 { 233, 150, 122, "DarkSalmon" },
145 { 250, 128, 114, "salmon" },
146 { 255, 160, 122, "LightSalmon" },
147 { 255, 165, 0, "orange" },
148 { 255, 140, 0, "DarkOrange" },
149 { 255, 127, 80, "coral" },
150 { 240, 128, 128, "LightCoral" },
151 { 255, 99, 71, "tomato" },
152 { 255, 69, 0, "OrangeRed" },
153 { 255, 0, 0, "red" },
154 { 255, 105, 180, "HotPink" },
155 { 255, 20, 147, "DeepPink" },
156 { 255, 192, 203, "pink" },
157 { 255, 182, 193, "LightPink" },
158 { 219, 112, 147, "PaleVioletRed" },
159 { 176, 48, 96, "maroon" },
160 { 199, 21, 133, "MediumVioletRed" },
161 { 208, 32, 144, "VioletRed" },
162 { 255, 0, 255, "magenta" },
163 { 238, 130, 238, "violet" },
164 { 221, 160, 221, "plum" },
165 { 218, 112, 214, "orchid" },
166 { 186, 85, 211, "MediumOrchid" },
167 { 153, 50, 204, "DarkOrchid" },
168 { 148, 0, 211, "DarkViolet" },
169 { 138, 43, 226, "BlueViolet" },
170 { 160, 32, 240, "purple" },
171 { 147, 112, 219, "MediumPurple" },
172 { 216, 191, 216, "thistle" },
173 { 255, 250, 250, "snow1" },
174 { 238, 233, 233, "snow2" },
175 { 205, 201, 201, "snow3" },
176 { 139, 137, 137, "snow4" },
177 { 255, 245, 238, "seashell1" },
178 { 238, 229, 222, "seashell2" },
179 { 205, 197, 191, "seashell3" },
180 { 139, 134, 130, "seashell4" },
181 { 255, 239, 219, "AntiqueWhite1" },
182 { 238, 223, 204, "AntiqueWhite2" },
183 { 205, 192, 176, "AntiqueWhite3" },
184 { 139, 131, 120, "AntiqueWhite4" },
185 { 255, 228, 196, "bisque1" },
186 { 238, 213, 183, "bisque2" },
187 { 205, 183, 158, "bisque3" },
188 { 139, 125, 107, "bisque4" },
189 { 255, 218, 185, "PeachPuff1" },
190 { 238, 203, 173, "PeachPuff2" },
191 { 205, 175, 149, "PeachPuff3" },
192 { 139, 119, 101, "PeachPuff4" },
193 { 255, 222, 173, "NavajoWhite1" },
194 { 238, 207, 161, "NavajoWhite2" },
195 { 205, 179, 139, "NavajoWhite3" },
196 { 139, 121, 94, "NavajoWhite4" },
197 { 255, 250, 205, "LemonChiffon1" },
198 { 238, 233, 191, "LemonChiffon2" },
199 { 205, 201, 165, "LemonChiffon3" },
200 { 139, 137, 112, "LemonChiffon4" },
201 { 255, 248, 220, "cornsilk1" },
202 { 238, 232, 205, "cornsilk2" },
203 { 205, 200, 177, "cornsilk3" },
204 { 139, 136, 120, "cornsilk4" },
205 { 255, 255, 240, "ivory1" },
206 { 238, 238, 224, "ivory2" },
207 { 205, 205, 193, "ivory3" },
208 { 139, 139, 131, "ivory4" },
209 { 240, 255, 240, "honeydew1" },
210 { 224, 238, 224, "honeydew2" },
211 { 193, 205, 193, "honeydew3" },
212 { 131, 139, 131, "honeydew4" },
213 { 255, 240, 245, "LavenderBlush1" },
214 { 238, 224, 229, "LavenderBlush2" },
215 { 205, 193, 197, "LavenderBlush3" },
216 { 139, 131, 134, "LavenderBlush4" },
217 { 255, 228, 225, "MistyRose1" },
218 { 238, 213, 210, "MistyRose2" },
219 { 205, 183, 181, "MistyRose3" },
220 { 139, 125, 123, "MistyRose4" },
221 { 240, 255, 255, "azure1" },
222 { 224, 238, 238, "azure2" },
223 { 193, 205, 205, "azure3" },
224 { 131, 139, 139, "azure4" },
225 { 131, 111, 255, "SlateBlue1" },
226 { 122, 103, 238, "SlateBlue2" },
227 { 105, 89, 205, "SlateBlue3" },
228 { 71, 60, 139, "SlateBlue4" },
229 { 72, 118, 255, "RoyalBlue1" },
230 { 67, 110, 238, "RoyalBlue2" },
231 { 58, 95, 205, "RoyalBlue3" },
232 { 39, 64, 139, "RoyalBlue4" },
233 { 0, 0, 255, "blue1" },
234 { 0, 0, 238, "blue2" },
235 { 0, 0, 205, "blue3" },
236 { 0, 0, 139, "blue4" },
237 { 30, 144, 255, "DodgerBlue1" },
238 { 28, 134, 238, "DodgerBlue2" },
239 { 24, 116, 205, "DodgerBlue3" },
240 { 16, 78, 139, "DodgerBlue4" },
241 { 99, 184, 255, "SteelBlue1" },
242 { 92, 172, 238, "SteelBlue2" },
243 { 79, 148, 205, "SteelBlue3" },
244 { 54, 100, 139, "SteelBlue4" },
245 { 0, 191, 255, "DeepSkyBlue1" },
246 { 0, 178, 238, "DeepSkyBlue2" },
247 { 0, 154, 205, "DeepSkyBlue3" },
248 { 0, 104, 139, "DeepSkyBlue4" },
249 { 135, 206, 255, "SkyBlue1" },
250 { 126, 192, 238, "SkyBlue2" },
251 { 108, 166, 205, "SkyBlue3" },
252 { 74, 112, 139, "SkyBlue4" },
253 { 176, 226, 255, "LightSkyBlue1" },
254 { 164, 211, 238, "LightSkyBlue2" },
255 { 141, 182, 205, "LightSkyBlue3" },
256 { 96, 123, 139, "LightSkyBlue4" },
257 { 198, 226, 255, "SlateGray1" },
258 { 185, 211, 238, "SlateGray2" },
259 { 159, 182, 205, "SlateGray3" },
260 { 108, 123, 139, "SlateGray4" },
261 { 202, 225, 255, "LightSteelBlue1" },
262 { 188, 210, 238, "LightSteelBlue2" },
263 { 162, 181, 205, "LightSteelBlue3" },
264 { 110, 123, 139, "LightSteelBlue4" },
265 { 191, 239, 255, "LightBlue1" },
266 { 178, 223, 238, "LightBlue2" },
267 { 154, 192, 205, "LightBlue3" },
268 { 104, 131, 139, "LightBlue4" },
269 { 224, 255, 255, "LightCyan1" },
270 { 209, 238, 238, "LightCyan2" },
271 { 180, 205, 205, "LightCyan3" },
272 { 122, 139, 139, "LightCyan4" },
273 { 187, 255, 255, "PaleTurquoise1" },
274 { 174, 238, 238, "PaleTurquoise2" },
275 { 150, 205, 205, "PaleTurquoise3" },
276 { 102, 139, 139, "PaleTurquoise4" },
277 { 152, 245, 255, "CadetBlue1" },
278 { 142, 229, 238, "CadetBlue2" },
279 { 122, 197, 205, "CadetBlue3" },
280 { 83, 134, 139, "CadetBlue4" },
281 { 0, 245, 255, "turquoise1" },
282 { 0, 229, 238, "turquoise2" },
283 { 0, 197, 205, "turquoise3" },
284 { 0, 134, 139, "turquoise4" },
285 { 0, 255, 255, "cyan1" },
286 { 0, 238, 238, "cyan2" },
287 { 0, 205, 205, "cyan3" },
288 { 0, 139, 139, "cyan4" },
289 { 151, 255, 255, "DarkSlateGray1" },
290 { 141, 238, 238, "DarkSlateGray2" },
291 { 121, 205, 205, "DarkSlateGray3" },
292 { 82, 139, 139, "DarkSlateGray4" },
293 { 127, 255, 212, "aquamarine1" },
294 { 118, 238, 198, "aquamarine2" },
295 { 102, 205, 170, "aquamarine3" },
296 { 69, 139, 116, "aquamarine4" },
297 { 193, 255, 193, "DarkSeaGreen1" },
298 { 180, 238, 180, "DarkSeaGreen2" },
299 { 155, 205, 155, "DarkSeaGreen3" },
300 { 105, 139, 105, "DarkSeaGreen4" },
301 { 84, 255, 159, "SeaGreen1" },
302 { 78, 238, 148, "SeaGreen2" },
303 { 67, 205, 128, "SeaGreen3" },
304 { 46, 139, 87, "SeaGreen4" },
305 { 154, 255, 154, "PaleGreen1" },
306 { 144, 238, 144, "PaleGreen2" },
307 { 124, 205, 124, "PaleGreen3" },
308 { 84, 139, 84, "PaleGreen4" },
309 { 0, 255, 127, "SpringGreen1" },
310 { 0, 238, 118, "SpringGreen2" },
311 { 0, 205, 102, "SpringGreen3" },
312 { 0, 139, 69, "SpringGreen4" },
313 { 0, 255, 0, "green1" },
314 { 0, 238, 0, "green2" },
315 { 0, 205, 0, "green3" },
316 { 0, 139, 0, "green4" },
317 { 127, 255, 0, "chartreuse1" },
318 { 118, 238, 0, "chartreuse2" },
319 { 102, 205, 0, "chartreuse3" },
320 { 69, 139, 0, "chartreuse4" },
321 { 192, 255, 62, "OliveDrab1" },
322 { 179, 238, 58, "OliveDrab2" },
323 { 154, 205, 50, "OliveDrab3" },
324 { 105, 139, 34, "OliveDrab4" },
325 { 202, 255, 112, "DarkOliveGreen1" },
326 { 188, 238, 104, "DarkOliveGreen2" },
327 { 162, 205, 90, "DarkOliveGreen3" },
328 { 110, 139, 61, "DarkOliveGreen4" },
329 { 255, 246, 143, "khaki1" },
330 { 238, 230, 133, "khaki2" },
331 { 205, 198, 115, "khaki3" },
332 { 139, 134, 78, "khaki4" },
333 { 255, 236, 139, "LightGoldenrod1" },
334 { 238, 220, 130, "LightGoldenrod2" },
335 { 205, 190, 112, "LightGoldenrod3" },
336 { 139, 129, 76, "LightGoldenrod4" },
337 { 255, 255, 224, "LightYellow1" },
338 { 238, 238, 209, "LightYellow2" },
339 { 205, 205, 180, "LightYellow3" },
340 { 139, 139, 122, "LightYellow4" },
341 { 255, 255, 0, "yellow1" },
342 { 238, 238, 0, "yellow2" },
343 { 205, 205, 0, "yellow3" },
344 { 139, 139, 0, "yellow4" },
345 { 255, 215, 0, "gold1" },
346 { 238, 201, 0, "gold2" },
347 { 205, 173, 0, "gold3" },
348 { 139, 117, 0, "gold4" },
349 { 255, 193, 37, "goldenrod1" },
350 { 238, 180, 34, "goldenrod2" },
351 { 205, 155, 29, "goldenrod3" },
352 { 139, 105, 20, "goldenrod4" },
353 { 255, 185, 15, "DarkGoldenrod1" },
354 { 238, 173, 14, "DarkGoldenrod2" },
355 { 205, 149, 12, "DarkGoldenrod3" },
356 { 139, 101, 8, "DarkGoldenrod4" },
357 { 255, 193, 193, "RosyBrown1" },
358 { 238, 180, 180, "RosyBrown2" },
359 { 205, 155, 155, "RosyBrown3" },
360 { 139, 105, 105, "RosyBrown4" },
361 { 255, 106, 106, "IndianRed1" },
362 { 238, 99, 99, "IndianRed2" },
363 { 205, 85, 85, "IndianRed3" },
364 { 139, 58, 58, "IndianRed4" },
365 { 255, 130, 71, "sienna1" },
366 { 238, 121, 66, "sienna2" },
367 { 205, 104, 57, "sienna3" },
368 { 139, 71, 38, "sienna4" },
369 { 255, 211, 155, "burlywood1" },
370 { 238, 197, 145, "burlywood2" },
371 { 205, 170, 125, "burlywood3" },
372 { 139, 115, 85, "burlywood4" },
373 { 255, 231, 186, "wheat1" },
374 { 238, 216, 174, "wheat2" },
375 { 205, 186, 150, "wheat3" },
376 { 139, 126, 102, "wheat4" },
377 { 255, 165, 79, "tan1" },
378 { 238, 154, 73, "tan2" },
379 { 205, 133, 63, "tan3" },
380 { 139, 90, 43, "tan4" },
381 { 255, 127, 36, "chocolate1" },
382 { 238, 118, 33, "chocolate2" },
383 { 205, 102, 29, "chocolate3" },
384 { 139, 69, 19, "chocolate4" },
385 { 255, 48, 48, "firebrick1" },
386 { 238, 44, 44, "firebrick2" },
387 { 205, 38, 38, "firebrick3" },
388 { 139, 26, 26, "firebrick4" },
389 { 255, 64, 64, "brown1" },
390 { 238, 59, 59, "brown2" },
391 { 205, 51, 51, "brown3" },
392 { 139, 35, 35, "brown4" },
393 { 255, 140, 105, "salmon1" },
394 { 238, 130, 98, "salmon2" },
395 { 205, 112, 84, "salmon3" },
396 { 139, 76, 57, "salmon4" },
397 { 255, 160, 122, "LightSalmon1" },
398 { 238, 149, 114, "LightSalmon2" },
399 { 205, 129, 98, "LightSalmon3" },
400 { 139, 87, 66, "LightSalmon4" },
401 { 255, 165, 0, "orange1" },
402 { 238, 154, 0, "orange2" },
403 { 205, 133, 0, "orange3" },
404 { 139, 90, 0, "orange4" },
405 { 255, 127, 0, "DarkOrange1" },
406 { 238, 118, 0, "DarkOrange2" },
407 { 205, 102, 0, "DarkOrange3" },
408 { 139, 69, 0, "DarkOrange4" },
409 { 255, 114, 86, "coral1" },
410 { 238, 106, 80, "coral2" },
411 { 205, 91, 69, "coral3" },
412 { 139, 62, 47, "coral4" },
413 { 255, 99, 71, "tomato1" },
414 { 238, 92, 66, "tomato2" },
415 { 205, 79, 57, "tomato3" },
416 { 139, 54, 38, "tomato4" },
417 { 255, 69, 0, "OrangeRed1" },
418 { 238, 64, 0, "OrangeRed2" },
419 { 205, 55, 0, "OrangeRed3" },
420 { 139, 37, 0, "OrangeRed4" },
421 { 255, 0, 0, "red1" },
422 { 238, 0, 0, "red2" },
423 { 205, 0, 0, "red3" },
424 { 139, 0, 0, "red4" },
425 { 255, 20, 147, "DeepPink1" },
426 { 238, 18, 137, "DeepPink2" },
427 { 205, 16, 118, "DeepPink3" },
428 { 139, 10, 80, "DeepPink4" },
429 { 255, 110, 180, "HotPink1" },
430 { 238, 106, 167, "HotPink2" },
431 { 205, 96, 144, "HotPink3" },
432 { 139, 58, 98, "HotPink4" },
433 { 255, 181, 197, "pink1" },
434 { 238, 169, 184, "pink2" },
435 { 205, 145, 158, "pink3" },
436 { 139, 99, 108, "pink4" },
437 { 255, 174, 185, "LightPink1" },
438 { 238, 162, 173, "LightPink2" },
439 { 205, 140, 149, "LightPink3" },
440 { 139, 95, 101, "LightPink4" },
441 { 255, 130, 171, "PaleVioletRed1" },
442 { 238, 121, 159, "PaleVioletRed2" },
443 { 205, 104, 137, "PaleVioletRed3" },
444 { 139, 71, 93, "PaleVioletRed4" },
445 { 255, 52, 179, "maroon1" },
446 { 238, 48, 167, "maroon2" },
447 { 205, 41, 144, "maroon3" },
448 { 139, 28, 98, "maroon4" },
449 { 255, 62, 150, "VioletRed1" },
450 { 238, 58, 140, "VioletRed2" },
451 { 205, 50, 120, "VioletRed3" },
452 { 139, 34, 82, "VioletRed4" },
453 { 255, 0, 255, "magenta1" },
454 { 238, 0, 238, "magenta2" },
455 { 205, 0, 205, "magenta3" },
456 { 139, 0, 139, "magenta4" },
457 { 255, 131, 250, "orchid1" },
458 { 238, 122, 233, "orchid2" },
459 { 205, 105, 201, "orchid3" },
460 { 139, 71, 137, "orchid4" },
461 { 255, 187, 255, "plum1" },
462 { 238, 174, 238, "plum2" },
463 { 205, 150, 205, "plum3" },
464 { 139, 102, 139, "plum4" },
465 { 224, 102, 255, "MediumOrchid1" },
466 { 209, 95, 238, "MediumOrchid2" },
467 { 180, 82, 205, "MediumOrchid3" },
468 { 122, 55, 139, "MediumOrchid4" },
469 { 191, 62, 255, "DarkOrchid1" },
470 { 178, 58, 238, "DarkOrchid2" },
471 { 154, 50, 205, "DarkOrchid3" },
472 { 104, 34, 139, "DarkOrchid4" },
473 { 155, 48, 255, "purple1" },
474 { 145, 44, 238, "purple2" },
475 { 125, 38, 205, "purple3" },
476 { 85, 26, 139, "purple4" },
477 { 171, 130, 255, "MediumPurple1" },
478 { 159, 121, 238, "MediumPurple2" },
479 { 137, 104, 205, "MediumPurple3" },
480 { 93, 71, 139, "MediumPurple4" },
481 { 255, 225, 255, "thistle1" },
482 { 238, 210, 238, "thistle2" },
483 { 205, 181, 205, "thistle3" },
484 { 139, 123, 139, "thistle4" },
485 { 0, 0, 0, "gray0" },
486 { 0, 0, 0, "grey0" },
487 { 3, 3, 3, "gray1" },
488 { 3, 3, 3, "grey1" },
489 { 5, 5, 5, "gray2" },
490 { 5, 5, 5, "grey2" },
491 { 8, 8, 8, "gray3" },
492 { 8, 8, 8, "grey3" },
493 { 10, 10, 10, "gray4" },
494 { 10, 10, 10, "grey4" },
495 { 13, 13, 13, "gray5" },
496 { 13, 13, 13, "grey5" },
497 { 15, 15, 15, "gray6" },
498 { 15, 15, 15, "grey6" },
499 { 18, 18, 18, "gray7" },
500 { 18, 18, 18, "grey7" },
501 { 20, 20, 20, "gray8" },
502 { 20, 20, 20, "grey8" },
503 { 23, 23, 23, "gray9" },
504 { 23, 23, 23, "grey9" },
505 { 26, 26, 26, "gray10" },
506 { 26, 26, 26, "grey10" },
507 { 28, 28, 28, "gray11" },
508 { 28, 28, 28, "grey11" },
509 { 31, 31, 31, "gray12" },
510 { 31, 31, 31, "grey12" },
511 { 33, 33, 33, "gray13" },
512 { 33, 33, 33, "grey13" },
513 { 36, 36, 36, "gray14" },
514 { 36, 36, 36, "grey14" },
515 { 38, 38, 38, "gray15" },
516 { 38, 38, 38, "grey15" },
517 { 41, 41, 41, "gray16" },
518 { 41, 41, 41, "grey16" },
519 { 43, 43, 43, "gray17" },
520 { 43, 43, 43, "grey17" },
521 { 46, 46, 46, "gray18" },
522 { 46, 46, 46, "grey18" },
523 { 48, 48, 48, "gray19" },
524 { 48, 48, 48, "grey19" },
525 { 51, 51, 51, "gray20" },
526 { 51, 51, 51, "grey20" },
527 { 54, 54, 54, "gray21" },
528 { 54, 54, 54, "grey21" },
529 { 56, 56, 56, "gray22" },
530 { 56, 56, 56, "grey22" },
531 { 59, 59, 59, "gray23" },
532 { 59, 59, 59, "grey23" },
533 { 61, 61, 61, "gray24" },
534 { 61, 61, 61, "grey24" },
535 { 64, 64, 64, "gray25" },
536 { 64, 64, 64, "grey25" },
537 { 66, 66, 66, "gray26" },
538 { 66, 66, 66, "grey26" },
539 { 69, 69, 69, "gray27" },
540 { 69, 69, 69, "grey27" },
541 { 71, 71, 71, "gray28" },
542 { 71, 71, 71, "grey28" },
543 { 74, 74, 74, "gray29" },
544 { 74, 74, 74, "grey29" },
545 { 77, 77, 77, "gray30" },
546 { 77, 77, 77, "grey30" },
547 { 79, 79, 79, "gray31" },
548 { 79, 79, 79, "grey31" },
549 { 82, 82, 82, "gray32" },
550 { 82, 82, 82, "grey32" },
551 { 84, 84, 84, "gray33" },
552 { 84, 84, 84, "grey33" },
553 { 87, 87, 87, "gray34" },
554 { 87, 87, 87, "grey34" },
555 { 89, 89, 89, "gray35" },
556 { 89, 89, 89, "grey35" },
557 { 92, 92, 92, "gray36" },
558 { 92, 92, 92, "grey36" },
559 { 94, 94, 94, "gray37" },
560 { 94, 94, 94, "grey37" },
561 { 97, 97, 97, "gray38" },
562 { 97, 97, 97, "grey38" },
563 { 99, 99, 99, "gray39" },
564 { 99, 99, 99, "grey39" },
565 { 102, 102, 102, "gray40" },
566 { 102, 102, 102, "grey40" },
567 { 105, 105, 105, "gray41" },
568 { 105, 105, 105, "grey41" },
569 { 107, 107, 107, "gray42" },
570 { 107, 107, 107, "grey42" },
571 { 110, 110, 110, "gray43" },
572 { 110, 110, 110, "grey43" },
573 { 112, 112, 112, "gray44" },
574 { 112, 112, 112, "grey44" },
575 { 115, 115, 115, "gray45" },
576 { 115, 115, 115, "grey45" },
577 { 117, 117, 117, "gray46" },
578 { 117, 117, 117, "grey46" },
579 { 120, 120, 120, "gray47" },
580 { 120, 120, 120, "grey47" },
581 { 122, 122, 122, "gray48" },
582 { 122, 122, 122, "grey48" },
583 { 125, 125, 125, "gray49" },
584 { 125, 125, 125, "grey49" },
585 { 127, 127, 127, "gray50" },
586 { 127, 127, 127, "grey50" },
587 { 130, 130, 130, "gray51" },
588 { 130, 130, 130, "grey51" },
589 { 133, 133, 133, "gray52" },
590 { 133, 133, 133, "grey52" },
591 { 135, 135, 135, "gray53" },
592 { 135, 135, 135, "grey53" },
593 { 138, 138, 138, "gray54" },
594 { 138, 138, 138, "grey54" },
595 { 140, 140, 140, "gray55" },
596 { 140, 140, 140, "grey55" },
597 { 143, 143, 143, "gray56" },
598 { 143, 143, 143, "grey56" },
599 { 145, 145, 145, "gray57" },
600 { 145, 145, 145, "grey57" },
601 { 148, 148, 148, "gray58" },
602 { 148, 148, 148, "grey58" },
603 { 150, 150, 150, "gray59" },
604 { 150, 150, 150, "grey59" },
605 { 153, 153, 153, "gray60" },
606 { 153, 153, 153, "grey60" },
607 { 156, 156, 156, "gray61" },
608 { 156, 156, 156, "grey61" },
609 { 158, 158, 158, "gray62" },
610 { 158, 158, 158, "grey62" },
611 { 161, 161, 161, "gray63" },
612 { 161, 161, 161, "grey63" },
613 { 163, 163, 163, "gray64" },
614 { 163, 163, 163, "grey64" },
615 { 166, 166, 166, "gray65" },
616 { 166, 166, 166, "grey65" },
617 { 168, 168, 168, "gray66" },
618 { 168, 168, 168, "grey66" },
619 { 171, 171, 171, "gray67" },
620 { 171, 171, 171, "grey67" },
621 { 173, 173, 173, "gray68" },
622 { 173, 173, 173, "grey68" },
623 { 176, 176, 176, "gray69" },
624 { 176, 176, 176, "grey69" },
625 { 179, 179, 179, "gray70" },
626 { 179, 179, 179, "grey70" },
627 { 181, 181, 181, "gray71" },
628 { 181, 181, 181, "grey71" },
629 { 184, 184, 184, "gray72" },
630 { 184, 184, 184, "grey72" },
631 { 186, 186, 186, "gray73" },
632 { 186, 186, 186, "grey73" },
633 { 189, 189, 189, "gray74" },
634 { 189, 189, 189, "grey74" },
635 { 191, 191, 191, "gray75" },
636 { 191, 191, 191, "grey75" },
637 { 194, 194, 194, "gray76" },
638 { 194, 194, 194, "grey76" },
639 { 196, 196, 196, "gray77" },
640 { 196, 196, 196, "grey77" },
641 { 199, 199, 199, "gray78" },
642 { 199, 199, 199, "grey78" },
643 { 201, 201, 201, "gray79" },
644 { 201, 201, 201, "grey79" },
645 { 204, 204, 204, "gray80" },
646 { 204, 204, 204, "grey80" },
647 { 207, 207, 207, "gray81" },
648 { 207, 207, 207, "grey81" },
649 { 209, 209, 209, "gray82" },
650 { 209, 209, 209, "grey82" },
651 { 212, 212, 212, "gray83" },
652 { 212, 212, 212, "grey83" },
653 { 214, 214, 214, "gray84" },
654 { 214, 214, 214, "grey84" },
655 { 217, 217, 217, "gray85" },
656 { 217, 217, 217, "grey85" },
657 { 219, 219, 219, "gray86" },
658 { 219, 219, 219, "grey86" },
659 { 222, 222, 222, "gray87" },
660 { 222, 222, 222, "grey87" },
661 { 224, 224, 224, "gray88" },
662 { 224, 224, 224, "grey88" },
663 { 227, 227, 227, "gray89" },
664 { 227, 227, 227, "grey89" },
665 { 229, 229, 229, "gray90" },
666 { 229, 229, 229, "grey90" },
667 { 232, 232, 232, "gray91" },
668 { 232, 232, 232, "grey91" },
669 { 235, 235, 235, "gray92" },
670 { 235, 235, 235, "grey92" },
671 { 237, 237, 237, "gray93" },
672 { 237, 237, 237, "grey93" },
673 { 240, 240, 240, "gray94" },
674 { 240, 240, 240, "grey94" },
675 { 242, 242, 242, "gray95" },
676 { 242, 242, 242, "grey95" },
677 { 245, 245, 245, "gray96" },
678 { 245, 245, 245, "grey96" },
679 { 247, 247, 247, "gray97" },
680 { 247, 247, 247, "grey97" },
681 { 250, 250, 250, "gray98" },
682 { 250, 250, 250, "grey98" },
683 { 252, 252, 252, "gray99" },
684 { 252, 252, 252, "grey99" },
685 { 255, 255, 255, "gray100" },
686 { 255, 255, 255, "grey100" },
687 { 169, 169, 169, "DarkGrey" },
688 { 169, 169, 169, "DarkGray" },
689 { 0, 0, 139, "DarkBlue" },
690 { 0, 139, 139, "DarkCyan" },
691 { 139, 0, 139, "DarkMagenta" },
692 { 139, 0, 0, "DarkRed" },
693 { 144, 238, 144, "LightGreen" },
694 { 0, 0, 0, "" }
695 };
696
697 #if 0
698 void dump_widget_type(xitk_widget_t *w) {
699 if(w->type & WIDGET_GROUP) {
700 printf("WIDGET_TYPE_GROUP: ");
701 if(w->type & WIDGET_GROUP_WIDGET)
702 printf("[THE_WIDGET] ");
703 if((w->type & WIDGET_GROUP_MASK) & WIDGET_GROUP_BROWSER)
704 printf("WIDGET_TYPE_BROWSER | ");
705 if((w->type & WIDGET_GROUP_MASK) & WIDGET_GROUP_FILEBROWSER)
706 printf("WIDGET_TYPE_FILEBROWSER | ");
707 if((w->type & WIDGET_GROUP_MASK) & WIDGET_GROUP_MRLBROWSER)
708 printf("WIDGET_TYPE_MRLBROWSER | ");
709 if((w->type & WIDGET_GROUP_MASK) & WIDGET_GROUP_COMBO)
710 printf("WIDGET_TYPE_COMBO | ");
711 if((w->type & WIDGET_GROUP_MASK) & WIDGET_GROUP_TABS)
712 printf("WIDGET_TYPE_TABS | ");
713 if((w->type & WIDGET_GROUP_MASK) & WIDGET_GROUP_INTBOX)
714 printf("WIDGET_TYPE_INTBOX | ");
715 if((w->type & WIDGET_GROUP_MASK) & WIDGET_GROUP_MENU)
716 printf("WIDGET_TYPE_MENU | ");
717 }
718
719 if((w->type & WIDGET_TYPE_MASK) == WIDGET_TYPE_BUTTON) printf("WIDGET_TYPE_BUTTON ");
720 if((w->type & WIDGET_TYPE_MASK) == WIDGET_TYPE_LABELBUTTON) printf("WIDGET_TYPE_LABELBUTTON ");
721 if((w->type & WIDGET_TYPE_MASK) == WIDGET_TYPE_SLIDER) printf("WIDGET_TYPE_SLIDER ");
722 if((w->type & WIDGET_TYPE_MASK) == WIDGET_TYPE_LABEL) printf("WIDGET_TYPE_LABEL ");
723 if((w->type & WIDGET_TYPE_MASK) == WIDGET_TYPE_CHECKBOX) printf("WIDGET_TYPE_CHECKBOX ");
724 if((w->type & WIDGET_TYPE_MASK) == WIDGET_TYPE_IMAGE) printf("WIDGET_TYPE_IMAGE ");
725 if((w->type & WIDGET_TYPE_MASK) == WIDGET_TYPE_INPUTTEXT) printf("WIDGET_TYPE_INPUTTEXT ");
726 printf("\n");
727 }
728 #endif
729
730 /*
731 * Alloc a memory area of size_t size.
732 */
xitk_xmalloc(size_t size)733 void *xitk_xmalloc(size_t size) {
734 void *ptrmalloc;
735
736 /* prevent xitk_xmalloc(0) of possibly returning NULL */
737 if(!size)
738 size++;
739
740 if((ptrmalloc = calloc(1, size)) == NULL) {
741 XITK_DIE("%s(): calloc() failed: %s\n", __FUNCTION__, strerror(errno));
742 }
743
744 return ptrmalloc;
745 }
746
747 /*
748 * Call the notify_change_skin function, if exist, of each widget in
749 * the specifier widget list.
750 */
xitk_change_skins_widget_list(xitk_widget_list_t * wl,xitk_skin_config_t * skonfig)751 void xitk_change_skins_widget_list(xitk_widget_list_t *wl, xitk_skin_config_t *skonfig) {
752 xitk_widget_t *mywidget;
753 widget_event_t event;
754
755 if (!wl) {
756 XITK_WARNING("widget list was NULL.\n");
757 return;
758 }
759
760 event.type = WIDGET_EVENT_CHANGE_SKIN;
761 event.skonfig = skonfig;
762
763 mywidget = (xitk_widget_t *)wl->list.head.next;
764 while (mywidget->node.next && wl->win && wl->gc && skonfig) {
765
766 (void) mywidget->event(mywidget, &event, NULL);
767
768 mywidget = (xitk_widget_t *)mywidget->node.next;
769 }
770 }
771
772 /*
773 * (re)paint the specified widget list.
774 */
xitk_paint_widget_list(xitk_widget_list_t * wl)775 int xitk_paint_widget_list (xitk_widget_list_t *wl) {
776 xitk_widget_t *mywidget;
777 widget_event_t event;
778
779 if (!wl) {
780 return 1;
781 }
782 mywidget = (xitk_widget_t *)wl->list.head.next;
783
784 while (mywidget->node.next && wl->win && wl->gc) {
785
786 if((mywidget->enable != WIDGET_ENABLE) && (mywidget->have_focus != FOCUS_LOST)) {
787
788 event.type = WIDGET_EVENT_FOCUS;
789 event.focus = FOCUS_LOST;
790 (void) mywidget->event(mywidget, &event, NULL);
791
792 event.type = WIDGET_EVENT_PAINT;
793 (void) mywidget->event(mywidget, &event, NULL);
794
795 mywidget->have_focus = FOCUS_LOST;
796 }
797 else {
798 event.type = WIDGET_EVENT_PAINT;
799 (void) mywidget->event(mywidget, &event, NULL);
800 }
801
802 mywidget = (xitk_widget_t *)mywidget->node.next;
803 }
804 return 1;
805 }
806
807 /*
808 * Return 1 if the mouse poiter is in the visible area of widget.
809 */
xitk_is_cursor_out_mask(Display * display,xitk_widget_t * w,Pixmap mask,int x,int y)810 int xitk_is_cursor_out_mask(Display *display, xitk_widget_t *w, Pixmap mask, int x, int y) {
811 XImage *xi;
812 Pixel p;
813
814 if(!display) {
815 XITK_WARNING("display was unset.\n");
816 return 0;
817 }
818 if(!w) {
819 XITK_WARNING("widget list was NULL.\n");
820 return 0;
821 }
822
823 if(mask) {
824 int xx, yy;
825
826 if((xx = (x - w->x)) == w->width) xx--;
827 if((yy = (y - w->y)) == w->height) yy--;
828
829 XLOCK (xitk_x_lock_display, display);
830 xi = XGetImage(display, mask, xx, yy, 1, 1, AllPlanes, ZPixmap);
831 p = XGetPixel(xi, 0, 0);
832 XDestroyImage(xi);
833 XUNLOCK (xitk_x_unlock_display, display);
834
835 return (int) p;
836 }
837
838 return 1;
839 }
840
841 /*
842 * Return 1 if mouse pointer is in widget area.
843 */
xitk_is_inside_widget(xitk_widget_t * widget,int x,int y)844 int xitk_is_inside_widget (xitk_widget_t *widget, int x, int y) {
845 int inside = 0;
846
847 if(!widget) {
848 XITK_WARNING("widget was NULL.\n");
849 return 0;
850 }
851
852 if(((x >= widget->x) && (x < (widget->x + widget->width))) &&
853 ((y >= widget->y) && (y < (widget->y + widget->height)))) {
854 widget_event_t event;
855 widget_event_result_t result;
856
857 inside = 1;
858
859 event.type = WIDGET_EVENT_INSIDE;
860 event.x = x;
861 event.y = y;
862 if(widget->event(widget, &event, &result))
863 inside = result.value;
864 }
865
866 return inside;
867 }
868
869 /*
870 * Return widget present at specified coords.
871 */
xitk_get_widget_at(xitk_widget_list_t * wl,int x,int y)872 xitk_widget_t *xitk_get_widget_at (xitk_widget_list_t *wl, int x, int y) {
873 xitk_widget_t *mywidget;
874
875 if(!wl) {
876 XITK_WARNING("widget list was NULL.\n");
877 return 0;
878 }
879
880 mywidget = (xitk_widget_t *)wl->list.head.next;
881 while (mywidget->node.next) {
882 if ((xitk_is_inside_widget (mywidget, x, y))
883 && (mywidget->enable == WIDGET_ENABLE) && mywidget->visible)
884 return mywidget;
885
886 mywidget = (xitk_widget_t *)mywidget->node.next;
887 }
888 return NULL;
889 }
890
891 /*
892 * Call notify_focus (with FOCUS_MOUSE_[IN|OUT] as focus state),
893 * function in right widget (the one who get, and the one who lose focus).
894 */
xitk_motion_notify_widget_list(xitk_widget_list_t * wl,int x,int y,unsigned int state)895 void xitk_motion_notify_widget_list(xitk_widget_list_t *wl, int x, int y, unsigned int state) {
896 xitk_widget_t *mywidget;
897 widget_event_t event;
898
899 if(!wl) {
900 XITK_WARNING("widget list was NULL.\n");
901 return;
902 }
903
904 /* Slider still pressed, mouse pointer outside widget */
905 if(wl->widget_pressed && wl->widget_focused && (wl->widget_pressed == wl->widget_focused) &&
906 ((wl->widget_pressed->type & WIDGET_TYPE_MASK) == WIDGET_TYPE_SLIDER)) {
907 widget_event_result_t result;
908
909 // printf("slider already clicked -> send event\n");
910
911 if(state & Button1Mask) {
912 event.type = WIDGET_EVENT_CLICK;
913 event.x = x;
914 event.y = y;
915 event.button_pressed = LBUTTON_DOWN;
916 event.button = Button1;
917 (void) wl->widget_focused->event(wl->widget_focused, &event, &result);
918 }
919 return;
920 }
921
922 mywidget = xitk_get_widget_at (wl, x, y);
923
924 if (mywidget != wl->widget_under_mouse) {
925
926 if (wl->widget_under_mouse) {
927
928 /* Kill (hide) tips */
929 xitk_tips_hide_tips();
930
931 if(!(wl->widget_focused && wl->widget_focused == wl->widget_under_mouse &&
932 (((wl->widget_focused->type & WIDGET_GROUP_MASK) & WIDGET_GROUP_BROWSER) ||
933 ((wl->widget_focused->type & WIDGET_TYPE_MASK) == WIDGET_TYPE_SLIDER &&
934 (wl->widget_focused->type & WIDGET_KEYABLE)))) &&
935 (wl->widget_under_mouse->type & WIDGET_FOCUSABLE) &&
936 wl->widget_under_mouse->enable == WIDGET_ENABLE) {
937
938 event.type = WIDGET_EVENT_FOCUS;
939 event.focus = FOCUS_MOUSE_OUT;
940 (void) wl->widget_under_mouse->event(wl->widget_under_mouse, &event, NULL);
941
942 event.type = WIDGET_EVENT_PAINT;
943 (void) wl->widget_under_mouse->event(wl->widget_under_mouse, &event, NULL);
944 }
945 }
946
947 wl->widget_under_mouse = mywidget;
948
949 if (mywidget && (mywidget->enable == WIDGET_ENABLE) && mywidget->visible) {
950
951 #if 0
952 dump_widget_type(mywidget);
953 #endif
954
955 /* Only give focus and paint when tips are accepted, otherwise associated window is invisible. */
956 /* This call may occur from MotionNotify directly after iconifying window. */
957 if(xitk_tips_show_widget_tips(mywidget)) {
958
959 if(!(wl->widget_focused && wl->widget_focused == wl->widget_under_mouse &&
960 (((wl->widget_focused->type & WIDGET_GROUP_MASK) & WIDGET_GROUP_BROWSER) ||
961 ((wl->widget_focused->type & WIDGET_TYPE_MASK) == WIDGET_TYPE_SLIDER &&
962 (wl->widget_focused->type & WIDGET_KEYABLE)))) &&
963 (mywidget->type & WIDGET_FOCUSABLE) && mywidget->enable == WIDGET_ENABLE) {
964 event.type = WIDGET_EVENT_FOCUS;
965 /* If widget still marked pressed or focus received, it shall receive the focus again. */
966 event.focus = (mywidget == wl->widget_pressed || mywidget == wl->widget_focused) ?
967 FOCUS_RECEIVED : FOCUS_MOUSE_IN;
968 (void) mywidget->event(mywidget, &event, NULL);
969
970 event.type = WIDGET_EVENT_PAINT;
971 (void) mywidget->event(mywidget, &event, NULL);
972
973 if(mywidget->type & WIDGET_GROUP_MENU)
974 menu_auto_pop(mywidget);
975 }
976 }
977 }
978 }
979 else {
980 /* Can the following happen here at all ? */
981 if(mywidget && (mywidget->type & WIDGET_TYPE_MASK) == WIDGET_TYPE_SLIDER) {
982 widget_event_result_t result;
983
984 if(state & Button1Mask) {
985 event.type = WIDGET_EVENT_CLICK;
986 event.x = x;
987 event.y = y;
988 event.button_pressed = LBUTTON_DOWN;
989 event.button = Button1;
990 (void) mywidget->event(mywidget, &event, &result);
991 }
992 }
993 }
994 }
995
996 /*
997 * Call notify_focus (with FOCUS_[RECEIVED|LOST] as focus state),
998 * then call notify_click function, if exist, of widget at coords x/y.
999 */
xitk_click_notify_widget_list(xitk_widget_list_t * wl,int x,int y,int button,int bUp)1000 int xitk_click_notify_widget_list (xitk_widget_list_t *wl, int x, int y, int button, int bUp) {
1001 int bRepaint = 0;
1002 xitk_widget_t *mywidget, *menu = NULL;
1003 widget_event_t event;
1004 widget_event_result_t result;
1005
1006 if(!wl) {
1007 XITK_WARNING("widget list was NULL.\n");
1008 return 0;
1009 }
1010
1011 mywidget = xitk_get_widget_at (wl, x, y);
1012
1013 if(mywidget != wl->widget_focused && !bUp) {
1014
1015 if (wl->widget_focused) {
1016
1017 /* Kill (hide) tips */
1018 xitk_tips_hide_tips();
1019
1020 if((wl->widget_focused->type & WIDGET_FOCUSABLE) &&
1021 wl->widget_focused->enable == WIDGET_ENABLE) {
1022
1023 if(wl->widget_focused && (wl->widget_focused->type & WIDGET_GROUP_MENU))
1024 menu = xitk_menu_get_menu(wl->widget_focused);
1025
1026 if((wl->widget_focused->type & WIDGET_GROUP_COMBO)) {
1027 if(((wl->widget_focused->type & WIDGET_TYPE_MASK) == WIDGET_TYPE_CHECKBOX)
1028 || ((wl->widget_focused->type & WIDGET_TYPE_MASK) == WIDGET_TYPE_LABEL)) {
1029
1030 if((!(mywidget &&
1031 ((((mywidget->type & WIDGET_TYPE_MASK) == WIDGET_TYPE_LABEL) ||
1032 ((mywidget->type & WIDGET_TYPE_MASK) == WIDGET_TYPE_CHECKBOX)) &&
1033 (xitk_combo_is_same_parent(wl->widget_focused, mywidget) == 1)))) ||
1034 (!mywidget)) {
1035
1036 if(xitk_checkbox_get_state(wl->widget_focused))
1037 xitk_combo_rollunroll(wl->widget_focused);
1038
1039 }
1040 }
1041 }
1042 else {
1043 event.type = WIDGET_EVENT_FOCUS;
1044 event.focus = FOCUS_LOST;
1045 (void) wl->widget_focused->event(wl->widget_focused, &event, NULL);
1046 wl->widget_focused->have_focus = FOCUS_LOST;
1047 }
1048 }
1049
1050 event.type = WIDGET_EVENT_PAINT;
1051 (void) wl->widget_focused->event(wl->widget_focused, &event, NULL);
1052 }
1053
1054 wl->widget_focused = mywidget;
1055
1056 if (mywidget) {
1057
1058 if ((mywidget->type & WIDGET_FOCUSABLE) && mywidget->enable == WIDGET_ENABLE) {
1059 event.type = WIDGET_EVENT_FOCUS;
1060 event.focus = FOCUS_RECEIVED;
1061 (void) mywidget->event(mywidget, &event, NULL);
1062 mywidget->have_focus = FOCUS_RECEIVED;
1063 }
1064 else
1065 wl->widget_focused = NULL;
1066
1067 event.type = WIDGET_EVENT_PAINT;
1068 (void) mywidget->event(mywidget, &event, NULL);
1069 }
1070
1071 }
1072 else if (!bUp) {
1073
1074 if(wl->widget_under_mouse && mywidget && (wl->widget_under_mouse == mywidget)) {
1075 if ((mywidget->type & WIDGET_FOCUSABLE) && mywidget->enable == WIDGET_ENABLE) {
1076 event.type = WIDGET_EVENT_FOCUS;
1077 event.focus = FOCUS_RECEIVED;
1078 (void) mywidget->event(mywidget, &event, NULL);
1079 mywidget->have_focus = FOCUS_RECEIVED;
1080 }
1081 }
1082
1083 }
1084
1085 if (!bUp) {
1086
1087 wl->widget_pressed = mywidget;
1088
1089 if (mywidget) {
1090 widget_event_result_t result;
1091
1092 /* Kill (hide) tips */
1093 xitk_tips_hide_tips();
1094
1095 if((mywidget->type & WIDGET_CLICKABLE) &&
1096 mywidget->enable == WIDGET_ENABLE && mywidget->running) {
1097 event.type = WIDGET_EVENT_CLICK;
1098 event.x = x;
1099 event.y = y;
1100 event.button_pressed = LBUTTON_DOWN;
1101 event.button = button;
1102
1103 if(mywidget->event(mywidget, &event, &result))
1104 bRepaint |= result.value;
1105 }
1106 }
1107 }
1108 else {
1109
1110 if(wl->widget_pressed) {
1111 if((wl->widget_pressed->type & WIDGET_CLICKABLE) &&
1112 (wl->widget_pressed->enable == WIDGET_ENABLE) && wl->widget_pressed->running) {
1113 event.type = WIDGET_EVENT_CLICK;
1114 event.x = x;
1115 event.y = y;
1116 event.button_pressed = LBUTTON_UP;
1117 event.button = button;
1118
1119 if(wl->widget_pressed->event(wl->widget_pressed, &event, &result))
1120 bRepaint |= result.value;
1121 }
1122
1123 wl->widget_pressed = NULL;
1124 }
1125 }
1126
1127 if(!(wl->widget_focused) && menu)
1128 wl->widget_focused = menu;
1129
1130 return((bRepaint == 1));
1131 }
1132
1133 /*
1134 * Find the first focusable widget in wl, according to direction
1135 */
xitk_set_focus_to_next_widget(xitk_widget_list_t * wl,int backward)1136 void xitk_set_focus_to_next_widget(xitk_widget_list_t *wl, int backward) {
1137 widget_event_t event;
1138
1139 if(!wl) {
1140 XITK_WARNING("widget list is NULL.\n");
1141 return;
1142 }
1143 if (!wl->win || !wl->gc)
1144 return;
1145
1146 if (!wl->widget_focused) {
1147
1148 xitk_widget_t *w;
1149 if (backward) {
1150 for (w = (xitk_widget_t *)wl->list.tail.prev;
1151 w->node.prev && !((w->type & WIDGET_FOCUSABLE) && w->enable && w->visible);
1152 w = (xitk_widget_t *)w->node.prev) ;
1153 if (!w->node.prev)
1154 return;
1155 } else {
1156 for (w = (xitk_widget_t *)wl->list.head.next;
1157 w->node.next && !((w->type & WIDGET_FOCUSABLE) && w->enable && w->visible);
1158 w = (xitk_widget_t *)w->node.next) ;
1159 if (!w->node.next)
1160 return;
1161 }
1162 wl->widget_focused = w;
1163
1164 } else {
1165
1166 xitk_widget_t *w;
1167 if (backward) {
1168 for (w = (xitk_widget_t *)wl->widget_focused->node.prev;
1169 w->node.prev && !((w->type & WIDGET_FOCUSABLE) && w->enable && w->visible);
1170 w = (xitk_widget_t *)w->node.prev) ;
1171 if (!w->node.prev) {
1172 for (w = (xitk_widget_t *)wl->list.tail.prev;
1173 (w != wl->widget_focused) && !((w->type & WIDGET_FOCUSABLE) && w->enable && w->visible);
1174 w = (xitk_widget_t *)w->node.prev) ;
1175 if (w == wl->widget_focused)
1176 return;
1177 }
1178 } else {
1179 for (w = (xitk_widget_t *)wl->widget_focused->node.next;
1180 w->node.next && !((w->type & WIDGET_FOCUSABLE) && w->enable && w->visible);
1181 w = (xitk_widget_t *)w->node.next) ;
1182 if (!w->node.next) {
1183 for (w = (xitk_widget_t *)wl->list.head.next;
1184 (w != wl->widget_focused) && !((w->type & WIDGET_FOCUSABLE) && w->enable && w->visible);
1185 w = (xitk_widget_t *)w->node.next) ;
1186 if (w == wl->widget_focused)
1187 return;
1188 }
1189 }
1190 if ((wl->widget_focused->type & WIDGET_FOCUSABLE) &&
1191 (wl->widget_focused->enable == WIDGET_ENABLE)) {
1192 event.type = WIDGET_EVENT_FOCUS;
1193 event.focus = FOCUS_LOST;
1194 wl->widget_focused->have_focus = FOCUS_LOST;
1195 (void)wl->widget_focused->event (wl->widget_focused, &event, NULL);
1196 event.type = WIDGET_EVENT_PAINT;
1197 (void)wl->widget_focused->event (wl->widget_focused, &event, NULL);
1198 }
1199 wl->widget_focused = w;
1200
1201 }
1202
1203 xitk_tips_hide_tips ();
1204
1205 if ((wl->widget_focused->type & WIDGET_FOCUSABLE) &&
1206 (wl->widget_focused->enable == WIDGET_ENABLE)) {
1207 event.type = WIDGET_EVENT_FOCUS;
1208 event.focus = FOCUS_RECEIVED;
1209 (void)wl->widget_focused->event (wl->widget_focused, &event, NULL);
1210 wl->widget_focused->have_focus = FOCUS_RECEIVED;
1211 event.type = WIDGET_EVENT_PAINT;
1212 (void)wl->widget_focused->event (wl->widget_focused, &event, NULL);
1213 }
1214
1215 if (wl->widget_focused->enable == WIDGET_ENABLE && wl->widget_focused->running) {
1216 if ((wl->widget_focused->type & WIDGET_CLICKABLE) &&
1217 (wl->widget_focused->type & WIDGET_TYPE_MASK) == WIDGET_TYPE_INPUTTEXT) {
1218 widget_event_result_t result;
1219 event.type = WIDGET_EVENT_CLICK;
1220 event.x = wl->widget_focused->x + 1;
1221 event.y = wl->widget_focused->y + 1;
1222 event.button_pressed = LBUTTON_DOWN;
1223 event.button = AnyButton;
1224 (void)wl->widget_focused->event (wl->widget_focused, &event, &result);
1225 event.type = WIDGET_EVENT_PAINT;
1226 (void)wl->widget_focused->event (wl->widget_focused, &event, NULL);
1227 }
1228 }
1229
1230 #if 0
1231 /* next widget will be focused */
1232 if((widget == wl->widget_focused) ||
1233 (widget && wl->widget_focused &&
1234 (((wl->widget_focused->type & WIDGET_GROUP_MASK) == WIDGET_GROUP_MENU)
1235 && (wl->widget_focused->type & WIDGET_GROUP_WIDGET)))) {
1236 xitk_widget_t *next_widget;
1237
1238 if ((wl->widget_focused->type & WIDGET_FOCUSABLE) &&
1239 (wl->widget_focused->enable == WIDGET_ENABLE)) {
1240
1241 event.type = WIDGET_EVENT_FOCUS;
1242 event.focus = FOCUS_LOST;
1243
1244 wl->widget_focused->have_focus = FOCUS_LOST;
1245 (void) wl->widget_focused->event(wl->widget_focused, &event, NULL);
1246
1247 event.type = WIDGET_EVENT_PAINT;
1248 (void) wl->widget_focused->event(wl->widget_focused, &event, NULL);
1249
1250 }
1251
1252 next_widget = get_next_focusable_widget(wl, backward);
1253
1254 if(next_widget == NULL)
1255 next_widget = first_widget;
1256
1257 wl->widget_focused = next_widget;
1258
1259 goto __focus_the_widget;
1260 }
1261 #endif
1262 }
1263
1264 /*
1265 *
1266 */
xitk_set_focus_to_widget(xitk_widget_t * w)1267 void xitk_set_focus_to_widget(xitk_widget_t *w) {
1268 xitk_widget_t *widget;
1269 widget_event_t event;
1270 xitk_widget_list_t *wl = w->wl;
1271
1272 if (!wl) {
1273 XITK_WARNING("widget list is NULL.\n");
1274 return;
1275 }
1276
1277 widget = (xitk_widget_t *)wl->list.head.next;
1278
1279 while (widget->node.next && wl->win && wl->gc && (widget != w))
1280 widget = (xitk_widget_t *)widget->node.next;
1281
1282 if (widget->node.next) {
1283
1284 if(wl->widget_focused) {
1285
1286 /* Kill (hide) tips */
1287 xitk_tips_hide_tips();
1288
1289 if ((wl->widget_focused->type & WIDGET_FOCUSABLE) &&
1290 (wl->widget_focused->enable == WIDGET_ENABLE)) {
1291 event.type = WIDGET_EVENT_FOCUS;
1292 event.focus = FOCUS_LOST;
1293 wl->widget_focused->have_focus = FOCUS_LOST;
1294 (void) wl->widget_focused->event(wl->widget_focused, &event, NULL);
1295
1296 event.type = WIDGET_EVENT_PAINT;
1297 (void) wl->widget_focused->event(wl->widget_focused, &event, NULL);
1298 }
1299 }
1300
1301 wl->widget_focused = widget;
1302
1303 if ((wl->widget_focused->type & WIDGET_FOCUSABLE) &&
1304 (wl->widget_focused->enable == WIDGET_ENABLE)) {
1305 event.type = WIDGET_EVENT_FOCUS;
1306 event.focus = FOCUS_RECEIVED;
1307 (void) wl->widget_focused->event(wl->widget_focused, &event, NULL);
1308 wl->widget_focused->have_focus = FOCUS_RECEIVED;
1309
1310 event.type = WIDGET_EVENT_PAINT;
1311 (void) wl->widget_focused->event(wl->widget_focused, &event, NULL);
1312 }
1313
1314 if (wl->widget_focused->enable == WIDGET_ENABLE && wl->widget_focused->running) {
1315
1316 if((wl->widget_focused->type & WIDGET_CLICKABLE) &&
1317 (wl->widget_focused->type & WIDGET_TYPE_MASK) == WIDGET_TYPE_INPUTTEXT) {
1318 widget_event_result_t result;
1319
1320 event.type = WIDGET_EVENT_CLICK;
1321 event.x = wl->widget_focused->x + 1;
1322 event.y = wl->widget_focused->y + 1;
1323 event.button_pressed = LBUTTON_DOWN;
1324 event.button = AnyButton;
1325 (void) wl->widget_focused->event(wl->widget_focused, &event, &result);
1326
1327 event.type = WIDGET_EVENT_PAINT;
1328 (void) wl->widget_focused->event(wl->widget_focused, &event, NULL);
1329 }
1330
1331 }
1332 }
1333 else
1334 XITK_WARNING("widget not found in list.\n");
1335 }
1336
1337 /*
1338 * Call notify_keyevent, if exist, of specified plugin. This pass an X11 XEvent.
1339 */
xitk_send_key_event(xitk_widget_t * w,XEvent * xev)1340 void xitk_send_key_event(xitk_widget_t *w, XEvent *xev) {
1341 widget_event_t event;
1342
1343 if(!w) {
1344 XITK_WARNING("widget is NULL\n");
1345 return;
1346 }
1347
1348 event.type = WIDGET_EVENT_KEY_EVENT;
1349 event.xevent = xev;
1350
1351 (void) w->event(w, &event, NULL);
1352 }
1353
1354 /*
1355 * Return the focused widget.
1356 */
xitk_get_focused_widget(xitk_widget_list_t * wl)1357 xitk_widget_t *xitk_get_focused_widget(xitk_widget_list_t *wl) {
1358
1359 if(wl) {
1360 return wl->widget_focused;
1361 }
1362
1363 XITK_WARNING("widget list is NULL\n");
1364 return NULL;
1365 }
1366
1367 /*
1368 * Return the pressed widget.
1369 */
xitk_get_pressed_widget(xitk_widget_list_t * wl)1370 xitk_widget_t *xitk_get_pressed_widget(xitk_widget_list_t *wl) {
1371
1372 if(wl)
1373 return wl->widget_pressed;
1374
1375 XITK_WARNING("widget list is NULL\n");
1376 return NULL;
1377 }
1378
1379 /*
1380 * Return widget width.
1381 */
xitk_get_widget_width(xitk_widget_t * w)1382 int xitk_get_widget_width(xitk_widget_t *w) {
1383
1384 if(!w) {
1385 XITK_WARNING("widget is NULL\n");
1386 return -1;
1387 }
1388 return w->width;
1389 }
1390
1391 /*
1392 * Return widget height.
1393 */
xitk_get_widget_height(xitk_widget_t * w)1394 int xitk_get_widget_height(xitk_widget_t *w) {
1395
1396 if(!w) {
1397 XITK_WARNING("widget is NULL\n");
1398 return -1;
1399 }
1400 return w->height;
1401 }
1402
1403 /*
1404 * Set position of a widget.
1405 */
xitk_set_widget_pos(xitk_widget_t * w,int x,int y)1406 int xitk_set_widget_pos(xitk_widget_t *w, int x, int y) {
1407
1408 if(!w) {
1409 XITK_WARNING("widget is NULL\n");
1410 return 0;
1411 }
1412
1413 w->x = x;
1414 w->y = y;
1415
1416 return 1;
1417 }
1418
1419 /*
1420 * Get position of a widget.
1421 */
xitk_get_widget_pos(xitk_widget_t * w,int * x,int * y)1422 int xitk_get_widget_pos(xitk_widget_t *w, int *x, int *y) {
1423
1424 if(!w) {
1425 XITK_WARNING("widget is NULL\n");
1426 return 0;
1427 }
1428 *x = w->x;
1429 *y = w->y;
1430 return 1;
1431 }
1432
xitk_get_widget_type(xitk_widget_t * w)1433 uint32_t xitk_get_widget_type(xitk_widget_t *w) {
1434
1435 if(!w) {
1436 XITK_WARNING("widget is NULL\n");
1437 return 0;
1438 }
1439
1440 return w->type;
1441 }
1442
1443 /*
1444 * Return 1 if widget is enabled.
1445 */
xitk_is_widget_enabled(xitk_widget_t * w)1446 int xitk_is_widget_enabled(xitk_widget_t *w) {
1447
1448 if(!w) {
1449 XITK_WARNING("widget is NULL\n");
1450 return 0;
1451 }
1452 return (w->enable == WIDGET_ENABLE);
1453 }
1454
1455 /*
1456 * Return 1 if widget have focus.
1457 */
xitk_is_widget_focused(xitk_widget_t * w)1458 int xitk_is_widget_focused(xitk_widget_t *w) {
1459
1460 if(!w) {
1461 XITK_WARNING("widget is NULL\n");
1462 return 0;
1463 }
1464 return(w->have_focus == FOCUS_RECEIVED);
1465 }
1466
1467 /*
1468 * Enable a widget.
1469 */
xitk_enable_widget(xitk_widget_t * w)1470 void xitk_enable_widget(xitk_widget_t *w) {
1471
1472 if(!w) {
1473 XITK_WARNING("widget is NULL\n");
1474 return;
1475 }
1476
1477 w->enable = WIDGET_ENABLE;
1478 if(w->type & WIDGET_GROUP) {
1479 widget_event_t event;
1480
1481 event.type = WIDGET_EVENT_ENABLE;
1482 (void) w->event(w, &event, NULL);
1483 }
1484 }
1485
1486 /*
1487 * Disable a widget.
1488 */
xitk_disable_widget(xitk_widget_t * w)1489 void xitk_disable_widget(xitk_widget_t *w) {
1490 widget_event_t event;
1491
1492 if(!w) {
1493 XITK_WARNING("widget is NULL\n");
1494 return;
1495 }
1496
1497 if(w->wl != NULL) {
1498
1499 if((w->wl->widget_under_mouse != NULL) && (w == w->wl->widget_under_mouse)) {
1500 /* Kill (hide) tips */
1501 xitk_tips_hide_tips();
1502 }
1503
1504 if((w->type & WIDGET_FOCUSABLE) &&
1505 (w->enable == WIDGET_ENABLE) && (w->have_focus != FOCUS_LOST)) {
1506
1507 event.type = WIDGET_EVENT_FOCUS;
1508 event.focus = FOCUS_LOST;
1509 (void) w->event(w, &event, NULL);
1510
1511 event.type = WIDGET_EVENT_PAINT;
1512 (void) w->event(w, &event, NULL);
1513
1514 w->have_focus = FOCUS_LOST;
1515 }
1516 }
1517
1518 w->enable = !WIDGET_ENABLE;
1519 if(w->type & WIDGET_GROUP) {
1520 event.type = WIDGET_EVENT_ENABLE;
1521 (void) w->event(w, &event, NULL);
1522 }
1523 }
1524
1525 /*
1526 *
1527 */
xitk_free_widget(xitk_widget_t * w)1528 void xitk_free_widget(xitk_widget_t *w) {
1529 widget_event_t event;
1530 if(!w) {
1531 XITK_WARNING("widget is NULL\n");
1532 return;
1533 }
1534
1535 event.type = WIDGET_EVENT_DESTROY;
1536 (void) w->event(w, &event, NULL);
1537
1538 xitk_tips_hide_tips();
1539 XITK_FREE(w->tips_string);
1540 XITK_FREE(w);
1541 w = NULL;
1542
1543 }
1544
1545 /*
1546 * Destroy a widget.
1547 */
xitk_destroy_widget(xitk_widget_t * w)1548 void xitk_destroy_widget(xitk_widget_t *w) {
1549
1550 if (!w)
1551 return;
1552
1553 xitk_hide_widget(w);
1554 xitk_stop_widget(w);
1555 xitk_disable_widget(w);
1556
1557 if (w->wl) {
1558 if (w == w->wl->widget_focused)
1559 w->wl->widget_focused = NULL;
1560 if (w == w->wl->widget_under_mouse)
1561 w->wl->widget_under_mouse = NULL;
1562 if (w == w->wl->widget_pressed)
1563 w->wl->widget_pressed = NULL;
1564 }
1565
1566 xitk_dnode_remove (&w->node);
1567 xitk_free_widget(w);
1568 }
1569
1570 /*
1571 * Destroy widgets from widget list.
1572 */
xitk_destroy_widgets(xitk_widget_list_t * wl)1573 void xitk_destroy_widgets(xitk_widget_list_t *wl) {
1574 if(!wl) {
1575 XITK_WARNING("widget list was NULL.\n");
1576 return;
1577 }
1578
1579 while (1) {
1580 xitk_widget_t *mywidget = (xitk_widget_t *)wl->list.tail.prev;
1581 if (!mywidget->node.prev)
1582 break;
1583 xitk_destroy_widget(mywidget);
1584 }
1585 }
1586
1587 #if 0
1588 /*
1589 * Return the struct of color names/values.
1590 */
1591 xitk_color_names_t *gui_get_color_names(void) {
1592
1593 return xitk_color_names;
1594 }
1595 #endif
1596
1597 /*
1598 * Return a xitk_color_name_t type from a string color.
1599 */
xitk_get_color_name(const char * color)1600 xitk_color_names_t *xitk_get_color_name(const char *color) {
1601 xitk_color_names_t *cn = NULL;
1602
1603 if(color == NULL) {
1604 XITK_WARNING("color was NULL.\n");
1605 return NULL;
1606 }
1607
1608 /* Hexa X triplet */
1609 if((strncasecmp(color, "#", 1) <= 0) && (strlen(color) == 7)) {
1610 char *lowercolorname;
1611 char *p;
1612
1613 p = strdup((color + 1));
1614
1615 /*
1616 * convert copied color to lowercase, this can avoid some problems
1617 * with _buggy_ sscanf(), who knows ;-)
1618 */
1619 lowercolorname = p;
1620 while(*lowercolorname != '\0') {
1621 *lowercolorname = tolower(*lowercolorname);
1622 lowercolorname++;
1623 }
1624 lowercolorname = p;
1625
1626 cn = (xitk_color_names_t *) xitk_xmalloc(sizeof(xitk_color_names_t));
1627
1628 if((sscanf(lowercolorname,
1629 "%2x%2x%2x", &cn->red, &cn->green, &cn->blue)) != 3) {
1630 XITK_WARNING("sscanf() failed: %s\n", strerror(errno));
1631 cn->red = cn->green = cn->blue = 0;
1632 }
1633
1634 strlcpy(cn->colorname, color, sizeof(cn->colorname));
1635
1636 XITK_FREE(p);
1637
1638 return cn;
1639 }
1640 else {
1641 const xitk_color_names_t *pcn = NULL;
1642 for(pcn = xitk_color_names; pcn->colorname[0] != '\0'; pcn++) {
1643 if(!strncasecmp(pcn->colorname, color, strlen(pcn->colorname))) {
1644
1645 cn = (xitk_color_names_t *) xitk_xmalloc(sizeof(xitk_color_names_t));
1646
1647 *cn = *pcn;
1648
1649 return cn;
1650 }
1651 }
1652 }
1653
1654 return NULL;
1655 }
1656
1657 /*
1658 * Free color object.
1659 */
xitk_free_color_name(xitk_color_names_t * color)1660 void xitk_free_color_name(xitk_color_names_t *color) {
1661
1662 if(!color) {
1663 XITK_WARNING("color is NULL\n");
1664 return;
1665 }
1666
1667 XITK_FREE(color);
1668 }
1669
1670 /*
1671 * Stop a widget.
1672 */
xitk_stop_widget(xitk_widget_t * w)1673 void xitk_stop_widget(xitk_widget_t *w) {
1674
1675 if(!w) {
1676 XITK_WARNING("widget is NULL\n");
1677 return;
1678 }
1679
1680 w->running = 0;
1681
1682 }
1683
1684 /*
1685 * (Re)Start a widget.
1686 */
xitk_start_widget(xitk_widget_t * w)1687 void xitk_start_widget(xitk_widget_t *w) {
1688
1689 if(!w) {
1690 XITK_WARNING("widget is NULL\n");
1691 return;
1692 }
1693
1694 w->running = 1;
1695
1696 }
1697
1698 /*
1699 * Stop widgets from widget list.
1700 */
xitk_stop_widgets(xitk_widget_list_t * wl)1701 void xitk_stop_widgets(xitk_widget_list_t *wl) {
1702 xitk_widget_t *mywidget;
1703
1704 if(!wl) {
1705 XITK_WARNING("widget list was NULL.\n");
1706 return;
1707 }
1708
1709 mywidget = (xitk_widget_t *)wl->list.head.next;
1710
1711 while (mywidget->node.next) {
1712
1713 xitk_stop_widget(mywidget);
1714
1715 mywidget = (xitk_widget_t *)mywidget->node.next;
1716 }
1717 }
1718
1719 /*
1720 * Show a widget.
1721 */
xitk_show_widget(xitk_widget_t * w)1722 void xitk_show_widget(xitk_widget_t *w) {
1723
1724 if(!w) {
1725 XITK_WARNING("widget is NULL\n");
1726 return;
1727 }
1728
1729 if(w->visible == 0) {
1730 widget_event_t event;
1731
1732 w->visible = 1;
1733
1734 event.type = WIDGET_EVENT_PAINT;
1735 (void) w->event(w, &event, NULL);
1736 }
1737 }
1738
1739 /*
1740 * Show widgets from widget list.
1741 */
xitk_show_widgets(xitk_widget_list_t * wl)1742 void xitk_show_widgets(xitk_widget_list_t *wl) {
1743 xitk_widget_t *mywidget;
1744
1745 if(!wl) {
1746 XITK_WARNING("widget list was NULL.\n");
1747 return;
1748 }
1749
1750 mywidget = (xitk_widget_t *)wl->list.head.next;
1751
1752 while (mywidget->node.next) {
1753
1754 if(mywidget->visible == -1)
1755 mywidget->visible = 0;
1756 else
1757 xitk_show_widget(mywidget);
1758
1759 mywidget = (xitk_widget_t *)mywidget->node.next;
1760 }
1761 }
1762
xitk_enable_and_show_widget(xitk_widget_t * w)1763 void xitk_enable_and_show_widget(xitk_widget_t *w) {
1764
1765 if(!w) {
1766 XITK_WARNING("widget is NULL\n");
1767 return;
1768 }
1769
1770 xitk_enable_widget(w);
1771 xitk_show_widget(w);
1772 }
1773
1774 /*
1775 * Hide a widget.
1776 */
xitk_hide_widget(xitk_widget_t * w)1777 void xitk_hide_widget(xitk_widget_t *w) {
1778
1779 if(!w) {
1780 XITK_WARNING("widget is NULL\n");
1781 return;
1782 }
1783
1784 if(w->visible == 1) {
1785 widget_event_t event;
1786
1787 w->visible = 0;
1788
1789 xitk_tips_hide_tips();
1790
1791 event.type = WIDGET_EVENT_PAINT;
1792 (void) w->event(w, &event, NULL);
1793 }
1794 }
1795
1796 /*
1797 * Hide widgets from widget list..
1798 */
xitk_hide_widgets(xitk_widget_list_t * wl)1799 void xitk_hide_widgets(xitk_widget_list_t *wl) {
1800 xitk_widget_t *mywidget;
1801
1802 if(!wl) {
1803 XITK_WARNING("widget list was NULL.\n");
1804 return;
1805 }
1806
1807 mywidget = (xitk_widget_t *)wl->list.head.next;
1808
1809 while (mywidget->node.next) {
1810
1811 if(mywidget->visible == 0)
1812 mywidget->visible = -1;
1813 else
1814 xitk_hide_widget(mywidget);
1815
1816 mywidget = (xitk_widget_t *)mywidget->node.next;
1817 }
1818 }
1819
xitk_disable_and_hide_widget(xitk_widget_t * w)1820 void xitk_disable_and_hide_widget(xitk_widget_t *w) {
1821
1822 if(!w) {
1823 XITK_WARNING("widget is NULL\n");
1824 return;
1825 }
1826
1827 xitk_disable_widget(w);
1828 xitk_hide_widget(w);
1829 }
1830
1831 /*
1832 *
1833 */
xitk_get_widget_foreground_skin(xitk_widget_t * w)1834 xitk_image_t *xitk_get_widget_foreground_skin(xitk_widget_t *w) {
1835 widget_event_t event;
1836 widget_event_result_t result;
1837 xitk_image_t *image = NULL;
1838
1839 if(!w) {
1840 XITK_WARNING("widget is NULL\n");
1841 return NULL;
1842 }
1843
1844 event.type = WIDGET_EVENT_GET_SKIN;
1845 event.skin_layer = FOREGROUND_SKIN;
1846
1847 if(w->event(w, &event, &result))
1848 image = result.image;
1849
1850 return image;
1851 }
1852
1853 /*
1854 *
1855 */
xitk_get_widget_background_skin(xitk_widget_t * w)1856 xitk_image_t *xitk_get_widget_background_skin(xitk_widget_t *w) {
1857 widget_event_t event;
1858 widget_event_result_t result;
1859 xitk_image_t *image = NULL;
1860
1861 if(!w) {
1862 XITK_WARNING("widget is NULL\n");
1863 return NULL;
1864 }
1865
1866 event.type = WIDGET_EVENT_GET_SKIN;
1867 event.skin_layer = BACKGROUND_SKIN;
1868
1869 if(w->event(w, &event, &result))
1870 image = result.image;
1871
1872 return image;
1873 }
1874
1875 /*
1876 *
1877 */
xitk_set_widget_tips(xitk_widget_t * w,const char * str)1878 void xitk_set_widget_tips(xitk_widget_t *w, const char *str) {
1879
1880 if(!w || !str) {
1881 XITK_WARNING("widget is NULL\n");
1882 return;
1883 }
1884
1885 xitk_tips_set_tips(w, str);
1886 }
1887
1888 /*
1889 *
1890 */
xitk_set_widget_tips_default(xitk_widget_t * w,const char * str)1891 void xitk_set_widget_tips_default(xitk_widget_t *w, const char *str) {
1892
1893 if(!w || !str) {
1894 XITK_WARNING("widget is NULL\n");
1895 return;
1896 }
1897
1898 xitk_tips_set_tips(w, str);
1899 xitk_tips_set_timeout(w, xitk_get_tips_timeout());
1900 }
1901
1902 /*
1903 *
1904 */
xitk_set_widget_tips_and_timeout(xitk_widget_t * w,const char * str,unsigned long timeout)1905 void xitk_set_widget_tips_and_timeout(xitk_widget_t *w, const char *str, unsigned long timeout) {
1906
1907 if(!w || !str) {
1908 XITK_WARNING("widget is NULL\n");
1909 return;
1910 }
1911
1912 xitk_tips_set_tips(w, str);
1913 xitk_tips_set_timeout(w, timeout);
1914 }
1915
1916 /*
1917 *
1918 */
xitk_get_widget_tips_timeout(xitk_widget_t * w)1919 unsigned long xitk_get_widget_tips_timeout(xitk_widget_t *w) {
1920
1921 if(!w) {
1922 XITK_WARNING("widget is NULL\n");
1923 return 0;
1924 }
1925
1926 return w->tips_timeout;
1927 }
1928
1929 /*
1930 *
1931 */
xitk_disable_widget_tips(xitk_widget_t * w)1932 void xitk_disable_widget_tips(xitk_widget_t *w) {
1933
1934 if(!w) {
1935 XITK_WARNING("widget is NULL\n");
1936 return;
1937 }
1938
1939 xitk_tips_set_timeout(w, 0);
1940 }
1941
1942 /*
1943 *
1944 */
xitk_enable_widget_tips(xitk_widget_t * w)1945 void xitk_enable_widget_tips(xitk_widget_t *w) {
1946
1947 if(!w) {
1948 XITK_WARNING("widget is NULL\n");
1949 return;
1950 }
1951
1952 xitk_tips_set_timeout(w, xitk_get_tips_timeout());
1953 }
1954
1955 /*
1956 *
1957 */
xitk_disable_widgets_tips(xitk_widget_list_t * wl)1958 void xitk_disable_widgets_tips(xitk_widget_list_t *wl) {
1959 xitk_widget_t *mywidget;
1960
1961 if(!wl) {
1962 XITK_WARNING("widget list was NULL.\n");
1963 return;
1964 }
1965
1966 mywidget = (xitk_widget_t *)wl->list.head.next;
1967
1968 while (mywidget->node.next) {
1969
1970 xitk_disable_widget_tips(mywidget);
1971
1972 mywidget = (xitk_widget_t *)mywidget->node.next;
1973 }
1974 }
1975
1976 /*
1977 *
1978 */
xitk_enable_widgets_tips(xitk_widget_list_t * wl)1979 void xitk_enable_widgets_tips(xitk_widget_list_t *wl) {
1980 xitk_widget_t *mywidget;
1981
1982 if(!wl) {
1983 XITK_WARNING("widget list was NULL.\n");
1984 return;
1985 }
1986
1987 mywidget = (xitk_widget_t *)wl->list.head.next;
1988
1989 while (mywidget->node.next) {
1990
1991 if(mywidget->tips_string)
1992 xitk_enable_widget_tips(mywidget);
1993
1994 mywidget = (xitk_widget_t *)mywidget->node.next;
1995 }
1996 }
1997
1998 /*
1999 *
2000 */
xitk_set_widgets_tips_timeout(xitk_widget_list_t * wl,unsigned long timeout)2001 void xitk_set_widgets_tips_timeout(xitk_widget_list_t *wl, unsigned long timeout) {
2002 xitk_widget_t *mywidget;
2003
2004 if(!wl) {
2005 XITK_WARNING("widget list was NULL.\n");
2006 return;
2007 }
2008
2009 xitk_set_tips_timeout(timeout);
2010
2011 mywidget = (xitk_widget_t *)wl->list.head.next;
2012
2013 while (mywidget->node.next) {
2014
2015 if(mywidget->tips_string)
2016 xitk_tips_set_timeout(mywidget, timeout);
2017
2018 mywidget = (xitk_widget_t *)mywidget->node.next;
2019 }
2020 }
2021
2022 /*
2023 *
2024 */
xitk_set_widget_tips_timeout(xitk_widget_t * w,unsigned long timeout)2025 void xitk_set_widget_tips_timeout(xitk_widget_t *w, unsigned long timeout) {
2026
2027 if(!w) {
2028 XITK_WARNING("widget is NULL\n");
2029 return;
2030 }
2031
2032 xitk_tips_set_timeout(w, timeout);
2033 }
2034
xitk_is_mouse_over_widget(Display * display,Window window,xitk_widget_t * w)2035 int xitk_is_mouse_over_widget(Display *display, Window window, xitk_widget_t *w) {
2036 Bool ret;
2037 Window root_window, child_window;
2038 int root_x, root_y, win_x, win_y;
2039 unsigned int mask;
2040 int retval = 0;
2041
2042 if(!w) {
2043 XITK_WARNING("widget is NULL\n");
2044 return 0;
2045 }
2046 if(window == None) {
2047 XITK_WARNING("window is None\n");
2048 return 0;
2049 }
2050
2051 XLOCK (xitk_x_lock_display, display);
2052 ret = XQueryPointer(display, window,
2053 &root_window, &child_window, &root_x, &root_y, &win_x, &win_y, &mask);
2054 XUNLOCK (xitk_x_unlock_display, display);
2055
2056 if((ret == False) ||
2057 ((child_window == None) && (win_x == 0) && (win_y == 0))) {
2058 retval = 0;
2059 }
2060 else {
2061
2062 if(((win_x >= w->x) && (win_x < (w->x + w->width))) &&
2063 ((win_y >= w->y) && (win_y < (w->y + w->height)))) {
2064 retval = 1;
2065 }
2066
2067 }
2068
2069 return retval;
2070 }
2071
xitk_get_mouse_coords(Display * display,Window window,int * x,int * y,int * rx,int * ry)2072 int xitk_get_mouse_coords(Display *display, Window window, int *x, int *y, int *rx, int *ry) {
2073 Bool ret;
2074 Window root_window, child_window;
2075 int root_x, root_y, win_x, win_y;
2076 unsigned int mask;
2077 int retval = 0;
2078
2079 if(window == None) {
2080 XITK_WARNING("window is None\n");
2081 return 0;
2082 }
2083
2084 XLOCK (xitk_x_lock_display, display);
2085 ret = XQueryPointer(display, window,
2086 &root_window, &child_window, &root_x, &root_y, &win_x, &win_y, &mask);
2087 XUNLOCK (xitk_x_unlock_display, display);
2088
2089 if((ret == False) ||
2090 ((child_window == None) && (win_x == 0) && (win_y == 0))) {
2091 retval = 0;
2092 }
2093 else {
2094
2095 if(x)
2096 *x = win_x;
2097 if(y)
2098 *y = win_y;
2099 if(rx)
2100 *rx = root_x;
2101 if(ry)
2102 *ry = root_y;
2103
2104 retval = 1;
2105 }
2106
2107 return retval;
2108 }
2109
xitk_widget_list_set(xitk_widget_list_t * wl,int param,void * data)2110 int xitk_widget_list_set(xitk_widget_list_t *wl, int param, void *data) {
2111
2112 if(!wl) {
2113 XITK_WARNING("List is NULL\n");
2114 return 0;
2115 }
2116
2117 switch(param) {
2118 case WIDGET_LIST_GC:
2119 wl->gc = (GC) data;
2120 break;
2121 case WIDGET_LIST_WINDOW:
2122 wl->win = (Window) data;
2123 break;
2124 default:
2125 XITK_WARNING("Unknown param %d\n", param);
2126 return 0;
2127 break;
2128 }
2129 return 1;
2130 }
2131
xitk_widget_list_get(xitk_widget_list_t * wl,int param)2132 void *xitk_widget_list_get(xitk_widget_list_t *wl, int param) {
2133 void *data = NULL;
2134
2135 if(!wl) {
2136 XITK_WARNING("List is NULL\n");
2137 return NULL;
2138 }
2139
2140 switch(param) {
2141 case WIDGET_LIST_GC:
2142 if(wl->gc)
2143 data = (void *) wl->gc;
2144 else
2145 XITK_WARNING("widget list GC unset\n");
2146 break;
2147 case WIDGET_LIST_WINDOW:
2148 if(wl->win)
2149 data = (void *) wl->win;
2150 else
2151 XITK_WARNING("widget list window unset\n");
2152 break;
2153 default:
2154 XITK_WARNING("Unknown param %d\n", param);
2155 break;
2156 }
2157
2158 return data;
2159 }
2160
xitk_widget_keyable(xitk_widget_t * w,int keyable)2161 void xitk_widget_keyable(xitk_widget_t *w, int keyable) {
2162 if(!w) {
2163 XITK_WARNING("widget is NULL\n");
2164 return;
2165 }
2166
2167 if(keyable)
2168 w->type |= WIDGET_KEYABLE;
2169 else
2170 w->type &= ~WIDGET_KEYABLE;
2171 }
2172
xitk_add_widget(xitk_widget_list_t * wl,xitk_widget_t * wi)2173 void xitk_add_widget (xitk_widget_list_t *wl, xitk_widget_t *wi) {
2174 if (wl && wi)
2175 xitk_dlist_add_tail (&wl->list, &wi->node);
2176 }
2177