summaryrefslogtreecommitdiff
path: root/uisimulator/x11/resources.c
diff options
context:
space:
mode:
Diffstat (limited to 'uisimulator/x11/resources.c')
-rw-r--r--uisimulator/x11/resources.c231
1 files changed, 231 insertions, 0 deletions
diff --git a/uisimulator/x11/resources.c b/uisimulator/x11/resources.c
new file mode 100644
index 0000000000..e0925d0fc7
--- /dev/null
+++ b/uisimulator/x11/resources.c
@@ -0,0 +1,231 @@
1/* xscreensaver, Copyright (c) 1992, 1997, 1998
2 * Jamie Zawinski <jwz@jwz.org>
3 *
4 * Permission to use, copy, modify, distribute, and sell this software and its
5 * documentation for any purpose is hereby granted without fee, provided that
6 * the above copyright notice appear in all copies and that both that
7 * copyright notice and this permission notice appear in supporting
8 * documentation. No representations are made about the suitability of this
9 * software for any purpose. It is provided "as is" without express or
10 * implied warranty.
11 */
12
13#include "utils.h"
14#include "resources.h"
15#include <X11/Xresource.h>
16
17
18/* Resource functions. Assumes: */
19
20extern char *progname;
21extern char *progclass;
22extern XrmDatabase db;
23
24static unsigned int get_time_resource (char *res_name, char *res_class,
25 Bool sec_p);
26
27#ifndef isupper
28# define isupper(c) ((c) >= 'A' && (c) <= 'Z')
29#endif
30#ifndef _tolower
31# define _tolower(c) ((c) - 'A' + 'a')
32#endif
33
34char *
35get_string_resource (char *res_name, char *res_class)
36{
37 XrmValue value;
38 char *type;
39 char full_name [1024], full_class [1024];
40 strcpy (full_name, progname);
41 strcat (full_name, ".");
42 strcat (full_name, res_name);
43 strcpy (full_class, progclass);
44 strcat (full_class, ".");
45 strcat (full_class, res_class);
46 if (XrmGetResource (db, full_name, full_class, &type, &value))
47 {
48 char *str = (char *) malloc (value.size + 1);
49 strncpy (str, (char *) value.addr, value.size);
50 str [value.size] = 0;
51 return str;
52 }
53 return 0;
54}
55
56Bool
57get_boolean_resource (char *res_name, char *res_class)
58{
59 char *tmp, buf [100];
60 char *s = get_string_resource (res_name, res_class);
61 char *os = s;
62 if (! s) return 0;
63 for (tmp = buf; *s; s++)
64 *tmp++ = isupper (*s) ? _tolower (*s) : *s;
65 *tmp = 0;
66 free (os);
67
68 while (*buf &&
69 (buf[strlen(buf)-1] == ' ' ||
70 buf[strlen(buf)-1] == '\t'))
71 buf[strlen(buf)-1] = 0;
72
73 if (!strcmp (buf, "on") || !strcmp (buf, "true") || !strcmp (buf, "yes"))
74 return 1;
75 if (!strcmp (buf,"off") || !strcmp (buf, "false") || !strcmp (buf,"no"))
76 return 0;
77 fprintf (stderr, "%s: %s must be boolean, not %s.\n",
78 progname, res_name, buf);
79 return 0;
80}
81
82int
83get_integer_resource (char *res_name, char *res_class)
84{
85 int val;
86 char c, *s = get_string_resource (res_name, res_class);
87 char *ss = s;
88 if (!s) return 0;
89
90 while (*ss && *ss <= ' ') ss++; /* skip whitespace */
91
92 if (ss[0] == '0' && (ss[1] == 'x' || ss[1] == 'X')) /* 0x: parse as hex */
93 {
94 if (1 == sscanf (ss+2, "%x %c", &val, &c))
95 {
96 free (s);
97 return val;
98 }
99 }
100 else /* else parse as dec */
101 {
102 if (1 == sscanf (ss, "%d %c", &val, &c))
103 {
104 free (s);
105 return val;
106 }
107 }
108
109 fprintf (stderr, "%s: %s must be an integer, not %s.\n",
110 progname, res_name, s);
111 free (s);
112 return 0;
113}
114
115double
116get_float_resource (char *res_name, char *res_class)
117{
118 double val;
119 char c, *s = get_string_resource (res_name, res_class);
120 if (! s) return 0.0;
121 if (1 == sscanf (s, " %lf %c", &val, &c))
122 {
123 free (s);
124 return val;
125 }
126 fprintf (stderr, "%s: %s must be a float, not %s.\n",
127 progname, res_name, s);
128 free (s);
129 return 0.0;
130}
131
132
133unsigned int
134get_pixel_resource (char *res_name, char *res_class,
135 Display *dpy, Colormap cmap)
136{
137 XColor color;
138 char *s = get_string_resource (res_name, res_class);
139 char *s2;
140 if (!s) goto DEFAULT;
141
142 for (s2 = s + strlen(s) - 1; s2 > s; s2--)
143 if (*s2 == ' ' || *s2 == '\t')
144 *s2 = 0;
145 else
146 break;
147
148 if (! XParseColor (dpy, cmap, s, &color))
149 {
150 fprintf (stderr, "%s: can't parse color %s\n", progname, s);
151 goto DEFAULT;
152 }
153 if (! XAllocColor (dpy, cmap, &color))
154 {
155 fprintf (stderr, "%s: couldn't allocate color %s\n", progname, s);
156 goto DEFAULT;
157 }
158 free (s);
159 return color.pixel;
160 DEFAULT:
161 if (s) free (s);
162 return ((strlen(res_class) >= 10 &&
163 !strcmp ("Background", res_class + strlen(res_class) - 10))
164 ? BlackPixel (dpy, DefaultScreen (dpy))
165 : WhitePixel (dpy, DefaultScreen (dpy)));
166}
167
168
169int
170parse_time (const char *string, Bool seconds_default_p, Bool silent_p)
171{
172 unsigned int h, m, s;
173 char c;
174 if (3 == sscanf (string, " %u : %2u : %2u %c", &h, &m, &s, &c))
175 ;
176 else if (2 == sscanf (string, " : %2u : %2u %c", &m, &s, &c) ||
177 2 == sscanf (string, " %u : %2u %c", &m, &s, &c))
178 h = 0;
179 else if (1 == sscanf (string, " : %2u %c", &s, &c))
180 h = m = 0;
181 else if (1 == sscanf (string, " %u %c",
182 (seconds_default_p ? &s : &m), &c))
183 {
184 h = 0;
185 if (seconds_default_p) m = 0;
186 else s = 0;
187 }
188 else
189 {
190 if (! silent_p)
191 fprintf (stderr, "%s: invalid time interval specification \"%s\".\n",
192 progname, string);
193 return -1;
194 }
195 if (s >= 60 && (h != 0 || m != 0))
196 {
197 if (! silent_p)
198 fprintf (stderr, "%s: seconds > 59 in \"%s\".\n", progname, string);
199 return -1;
200 }
201 if (m >= 60 && h > 0)
202 {
203 if (! silent_p)
204 fprintf (stderr, "%s: minutes > 59 in \"%s\".\n", progname, string);
205 return -1;
206 }
207 return ((h * 60 * 60) + (m * 60) + s);
208}
209
210static unsigned int
211get_time_resource (char *res_name, char *res_class, Bool sec_p)
212{
213 int val;
214 char *s = get_string_resource (res_name, res_class);
215 if (!s) return 0;
216 val = parse_time (s, sec_p, False);
217 free (s);
218 return (val < 0 ? 0 : val);
219}
220
221unsigned int
222get_seconds_resource (char *res_name, char *res_class)
223{
224 return get_time_resource (res_name, res_class, True);
225}
226
227unsigned int
228get_minutes_resource (char *res_name, char *res_class)
229{
230 return get_time_resource (res_name, res_class, False);
231}