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