1 /*****************************************************************************/
2 /* EyeClock - A clock application for X. The eyes follow the mouse pointer. */
3 /* */
4 /* EyeClock Copyright (C) 1998-1999 Sakai Hiroaki. */
5 /* All Rights Reserved. */
6 /* */
7 /* EyeClock is a simple clock application for X11. You can put your favorite */
8 /* picture on the face of the clock. And you can move the eyes of the */
9 /* picture following the mouse pointer. */
10 /* */
11 /* This file is a part of EyeClock. */
12 /* EyeClock is FREE SOFTWARE. You can use, copy, modify, and/or redistribute */
13 /* it freely under the terms in the COPYRIGHT. */
14 /* See the COPYRIGHT for more details. */
15 /*****************************************************************************/
16
17 /*****************************************************************************/
18 /* Clock ���������åȤ����Ѥ��뤿��Υᥤ��ե졼�� */
19 /*===========================================================================*/
20 /* EyeClock �� Clock ���������åȤȤ����߷פ��Ƥ���Τǡ� */
21 /* ���ץꥱ���������Ǥ�դ���ʬ�˥��������åȤȤ���ĥ���դ��뤳�Ȥ� */
22 /* �Ǥ��ޤ��� */
23 /* ���Υե�����Ǥϡ�Clock ���������åȤ�ĥ���դ��뤿��� */
24 /* toplevel ���������åȤ�������������� Clock ���������åȤ�ĥ���դ��� */
25 /* ClockStart() �ǻ��פ����Ȥ���XtAppMainLoop() ��ƤӽФ��Ƥ��ޤ��� */
26 /*****************************************************************************/
27
28 /*****************************************************************************/
29 /* �������� */
30 /*****************************************************************************/
31
32 /*****************************************************************************/
33 /* �إå��ե�����Υ��롼�� */
34 /*****************************************************************************/
35
36 #include <X11/Xlib.h>
37 #include <X11/Intrinsic.h>
38 #include <X11/StringDefs.h>
39 #include <X11/Shell.h>
40 #include <X11/Xatom.h>
41
42 #include <stdio.h>
43 #include <stdlib.h>
44 #include <signal.h>
45
46 #include "Clock.h"
47 #include "Hand.h"
48 #include "Number.h"
49 #include "Eye.h"
50
51 #include "converter.h"
52 #include "etc.h"
53
54 #include "fallback_resources.h"
55
56 #include "xpm/default_icon_face.xpm"
57
58 /*****************************************************************************/
59 /* �������� */
60 /*****************************************************************************/
61
62 /* None */
63
64 /*****************************************************************************/
65 /* ������� */
66 /*****************************************************************************/
67
68 /* None */
69
70 /*****************************************************************************/
71 /* �����ѿ������ */
72 /*****************************************************************************/
73
74 /*===========================================================================*/
75 /* Toplevel �Υ��������å� */
76 /*===========================================================================*/
77
78 static Widget toplevel = 0;
79 static Widget myclock = 0;
80
81 /*===========================================================================*/
82 /* Number ���������åȤΥ��������åȤ��Ȥ�̾�� */
83 /*===========================================================================*/
84
85 static struct {
86 char * name;
87 int number;
88 } numbers_default_values[] = {
89 {"number1" , 1}, {"number2" , 2}, {"number3" , 3}, {"number4" , 4},
90 {"number5" , 5}, {"number6" , 6}, {"number7" , 7}, {"number8" , 8},
91 {"number9" , 9}, {"number10", 10}, {"number11", 11}, {"number12", 12},
92 {NULL, 0}
93 };
94
95 /*===========================================================================*/
96 /* Hand ���������åȤΥ��������åȤ��Ȥ�̾�� */
97 /*===========================================================================*/
98
99 static struct {
100 char * name;
101 HandType type;
102 } hands_default_values[] = {
103 {"hour" , HOUR_HAND},
104 {"minute", MINUTE_HAND},
105 {"second", SECOND_HAND},
106 {NULL, OTHER_TYPE}
107 };
108
109 /*===========================================================================*/
110 /* Eye ���������åȤΥ��������åȤ��Ȥ�̾�� */
111 /*===========================================================================*/
112
113 static char * eyes_name[] = {
114 "left", "right", "eye3", "eye4", "eye5", "eye6", "eye7", "eye8", NULL};
115
116 /*===========================================================================*/
117 /* ���ץ�������� */
118 /*===========================================================================*/
119
120 static XrmOptionDescRec options[] = {
121
122 {"-icon-pixmap", "*iconPixmap", XrmoptionSepArg, NULL},
123 {"-icon-mask", "*iconMask", XrmoptionSepArg, NULL},
124
125 /* Clock ���������å��ѤΥ��ץ���� */
126
127 {"-clock-geometry", "*clock.geometry", XrmoptionSepArg, NULL},
128 {"-root", "*clock.root", XrmoptionNoArg,"True"},
129 {"-no-root", "*clock.root", XrmoptionNoArg,"False"},
130 {"-face", "*clock.face", XrmoptionSepArg, NULL},
131 {"-interval", "*clock.interval", XrmoptionSepArg, NULL},
132
133 /* Hand ���������å��ѤΥ��ץ���� */
134
135 {"-hands-geometry", "*clock.Hand.geometry", XrmoptionSepArg, NULL},
136 {"-hands-active", "*clock.Hand.active", XrmoptionNoArg,"True"},
137 {"-hands-no-active", "*clock.Hand.active", XrmoptionNoArg,"False"},
138 {"-hands-foreground", "*clock.Hand.foreground", XrmoptionSepArg, NULL},
139 {"-hands-fg", "*clock.Hand.foreground", XrmoptionSepArg, NULL},
140 {"-hands-bordercolor", "*clock.Hand.borderColor", XrmoptionSepArg, NULL},
141 {"-hands-bc", "*clock.Hand.borderColor", XrmoptionSepArg, NULL},
142 {"-hands-borderwidth", "*clock.Hand.borderWidth", XrmoptionSepArg, NULL},
143 {"-hands-bw", "*clock.Hand.borderWidth", XrmoptionSepArg, NULL},
144 {"-hands-width", "*clock.Hand.width", XrmoptionSepArg, NULL},
145 {"-hands-length", "*clock.Hand.length", XrmoptionSepArg, NULL},
146 {"-hands-type", "*clock.Hand.type", XrmoptionSepArg, NULL},
147
148 {"-hour-geometry", "*clock.hour.geometry", XrmoptionSepArg, NULL},
149 {"-hour-active", "*clock.hour.active", XrmoptionNoArg,"True"},
150 {"-hour-no-active", "*clock.hour.active", XrmoptionNoArg,"False"},
151 {"-hour-foreground", "*clock.hour.foreground", XrmoptionSepArg, NULL},
152 {"-hour-fg", "*clock.hour.foreground", XrmoptionSepArg, NULL},
153 {"-hour-bordercolor", "*clock.hour.borderColor", XrmoptionSepArg, NULL},
154 {"-hour-bc", "*clock.hour.borderColor", XrmoptionSepArg, NULL},
155 {"-hour-borderwidth", "*clock.hour.borderWidth", XrmoptionSepArg, NULL},
156 {"-hour-bw", "*clock.hour.borderWidth", XrmoptionSepArg, NULL},
157 {"-hour-width", "*clock.hour.width", XrmoptionSepArg, NULL},
158 {"-hour-length", "*clock.hour.length", XrmoptionSepArg, NULL},
159 {"-hour-type", "*clock.hour.type", XrmoptionSepArg, NULL},
160
161 {"-minute-geometry", "*clock.minute.geometry", XrmoptionSepArg, NULL},
162 {"-minute-active", "*clock.minute.active", XrmoptionNoArg,"True"},
163 {"-minute-no-active", "*clock.minute.active", XrmoptionNoArg,"False"},
164 {"-minute-foreground", "*clock.minute.foreground", XrmoptionSepArg, NULL},
165 {"-minute-fg", "*clock.minute.foreground", XrmoptionSepArg, NULL},
166 {"-minute-bordercolor", "*clock.minute.borderColor", XrmoptionSepArg, NULL},
167 {"-minute-bc", "*clock.minute.borderColor", XrmoptionSepArg, NULL},
168 {"-minute-borderwidth", "*clock.minute.borderWidth", XrmoptionSepArg, NULL},
169 {"-minute-bw", "*clock.minute.borderWidth", XrmoptionSepArg, NULL},
170 {"-minute-width", "*clock.minute.width", XrmoptionSepArg, NULL},
171 {"-minute-length", "*clock.minute.length", XrmoptionSepArg, NULL},
172 {"-minute-type", "*clock.minute.type", XrmoptionSepArg, NULL},
173
174 {"-second-geometry", "*clock.second.geometry", XrmoptionSepArg, NULL},
175 {"-second-active", "*clock.second.active", XrmoptionNoArg,"True"},
176 {"-second-no-active", "*clock.second.active", XrmoptionNoArg,"False"},
177 {"-second-foreground", "*clock.second.foreground", XrmoptionSepArg, NULL},
178 {"-second-fg", "*clock.second.foreground", XrmoptionSepArg, NULL},
179 {"-second-bordercolor", "*clock.second.borderColor", XrmoptionSepArg, NULL},
180 {"-second-bc", "*clock.second.borderColor", XrmoptionSepArg, NULL},
181 {"-second-borderwidth", "*clock.second.borderWidth", XrmoptionSepArg, NULL},
182 {"-second-bw", "*clock.second.borderWidth", XrmoptionSepArg, NULL},
183 {"-second-width", "*clock.second.width", XrmoptionSepArg, NULL},
184 {"-second-length", "*clock.second.length", XrmoptionSepArg, NULL},
185 {"-second-type", "*clock.second.type", XrmoptionSepArg, NULL},
186
187 /* Number ���������å��ѤΥ��ץ���� */
188
189 {"-numbers-geometry", "*clock.Number.geometry", XrmoptionSepArg, NULL},
190 {"-numbers-active", "*clock.Number.active", XrmoptionNoArg,"True"},
191 {"-numbers-no-active", "*clock.Number.active", XrmoptionNoArg,"False"},
192 {"-numbers-length", "*clock.Number.length", XrmoptionSepArg, NULL},
193 {"-numbers-figure", "*clock.Number.figure", XrmoptionSepArg, NULL},
194 {"-numbers-mask", "*clock.Number.mask", XrmoptionSepArg, NULL},
195 {"-numbers-size", "*clock.Number.size", XrmoptionSepArg, NULL},
196 {"-numbers-number", "*clock.Number.number", XrmoptionSepArg, NULL},
197
198 {"-number1-geometry", "*clock.number1.geometry", XrmoptionSepArg, NULL},
199 {"-number1-active", "*clock.number1.active", XrmoptionNoArg,"True"},
200 {"-number1-no-active", "*clock.number1.active", XrmoptionNoArg,"False"},
201 {"-number1-length", "*clock.number1.length", XrmoptionSepArg, NULL},
202 {"-number1-figure", "*clock.number1.figure", XrmoptionSepArg, NULL},
203 {"-number1-mask", "*clock.number1.mask", XrmoptionSepArg, NULL},
204 {"-number1-size", "*clock.number1.size", XrmoptionSepArg, NULL},
205 {"-number1-number", "*clock.number1.number", XrmoptionSepArg, NULL},
206
207 {"-number2-geometry", "*clock.number2.geometry", XrmoptionSepArg, NULL},
208 {"-number2-active", "*clock.number2.active", XrmoptionNoArg,"True"},
209 {"-number2-no-active", "*clock.number2.active", XrmoptionNoArg,"False"},
210 {"-number2-length", "*clock.number2.length", XrmoptionSepArg, NULL},
211 {"-number2-figure", "*clock.number2.figure", XrmoptionSepArg, NULL},
212 {"-number2-mask", "*clock.number2.mask", XrmoptionSepArg, NULL},
213 {"-number2-size", "*clock.number2.size", XrmoptionSepArg, NULL},
214 {"-number2-number", "*clock.number2.number", XrmoptionSepArg, NULL},
215
216 {"-number3-geometry", "*clock.number3.geometry", XrmoptionSepArg, NULL},
217 {"-number3-active", "*clock.number3.active", XrmoptionNoArg,"True"},
218 {"-number3-no-active", "*clock.number3.active", XrmoptionNoArg,"False"},
219 {"-number3-length", "*clock.number3.length", XrmoptionSepArg, NULL},
220 {"-number3-figure", "*clock.number3.figure", XrmoptionSepArg, NULL},
221 {"-number3-mask", "*clock.number3.mask", XrmoptionSepArg, NULL},
222 {"-number3-size", "*clock.number3.size", XrmoptionSepArg, NULL},
223 {"-number3-number", "*clock.number3.number", XrmoptionSepArg, NULL},
224
225 {"-number4-geometry", "*clock.number4.geometry", XrmoptionSepArg, NULL},
226 {"-number4-active", "*clock.number4.active", XrmoptionNoArg,"True"},
227 {"-number4-no-active", "*clock.number4.active", XrmoptionNoArg,"False"},
228 {"-number4-length", "*clock.number4.length", XrmoptionSepArg, NULL},
229 {"-number4-figure", "*clock.number4.figure", XrmoptionSepArg, NULL},
230 {"-number4-mask", "*clock.number4.mask", XrmoptionSepArg, NULL},
231 {"-number4-size", "*clock.number4.size", XrmoptionSepArg, NULL},
232 {"-number4-number", "*clock.number4.number", XrmoptionSepArg, NULL},
233
234 {"-number5-geometry", "*clock.number5.geometry", XrmoptionSepArg, NULL},
235 {"-number5-active", "*clock.number5.active", XrmoptionNoArg,"True"},
236 {"-number5-no-active", "*clock.number5.active", XrmoptionNoArg,"False"},
237 {"-number5-length", "*clock.number5.length", XrmoptionSepArg, NULL},
238 {"-number5-figure", "*clock.number5.figure", XrmoptionSepArg, NULL},
239 {"-number5-mask", "*clock.number5.mask", XrmoptionSepArg, NULL},
240 {"-number5-size", "*clock.number5.size", XrmoptionSepArg, NULL},
241 {"-number5-number", "*clock.number5.number", XrmoptionSepArg, NULL},
242
243 {"-number6-geometry", "*clock.number6.geometry", XrmoptionSepArg, NULL},
244 {"-number6-active", "*clock.number6.active", XrmoptionNoArg,"True"},
245 {"-number6-no-active", "*clock.number6.active", XrmoptionNoArg,"False"},
246 {"-number6-length", "*clock.number6.length", XrmoptionSepArg, NULL},
247 {"-number6-figure", "*clock.number6.figure", XrmoptionSepArg, NULL},
248 {"-number6-mask", "*clock.number6.mask", XrmoptionSepArg, NULL},
249 {"-number6-size", "*clock.number6.size", XrmoptionSepArg, NULL},
250 {"-number6-number", "*clock.number6.number", XrmoptionSepArg, NULL},
251
252 {"-number7-geometry", "*clock.number7.geometry", XrmoptionSepArg, NULL},
253 {"-number7-active", "*clock.number7.active", XrmoptionNoArg,"True"},
254 {"-number7-no-active", "*clock.number7.active", XrmoptionNoArg,"False"},
255 {"-number7-length", "*clock.number7.length", XrmoptionSepArg, NULL},
256 {"-number7-figure", "*clock.number7.figure", XrmoptionSepArg, NULL},
257 {"-number7-mask", "*clock.number7.mask", XrmoptionSepArg, NULL},
258 {"-number7-size", "*clock.number7.size", XrmoptionSepArg, NULL},
259 {"-number7-number", "*clock.number7.number", XrmoptionSepArg, NULL},
260
261 {"-number8-geometry", "*clock.number8.geometry", XrmoptionSepArg, NULL},
262 {"-number8-active", "*clock.number8.active", XrmoptionNoArg,"True"},
263 {"-number8-no-active", "*clock.number8.active", XrmoptionNoArg,"False"},
264 {"-number8-length", "*clock.number8.length", XrmoptionSepArg, NULL},
265 {"-number8-figure", "*clock.number8.figure", XrmoptionSepArg, NULL},
266 {"-number8-mask", "*clock.number8.mask", XrmoptionSepArg, NULL},
267 {"-number8-size", "*clock.number8.size", XrmoptionSepArg, NULL},
268 {"-number8-number", "*clock.number8.number", XrmoptionSepArg, NULL},
269
270 {"-number9-geometry", "*clock.number9.geometry", XrmoptionSepArg, NULL},
271 {"-number9-active", "*clock.number9.active", XrmoptionNoArg,"True"},
272 {"-number9-no-active", "*clock.number9.active", XrmoptionNoArg,"False"},
273 {"-number9-length", "*clock.number9.length", XrmoptionSepArg, NULL},
274 {"-number9-figure", "*clock.number9.figure", XrmoptionSepArg, NULL},
275 {"-number9-mask", "*clock.number9.mask", XrmoptionSepArg, NULL},
276 {"-number9-size", "*clock.number9.size", XrmoptionSepArg, NULL},
277 {"-number9-number", "*clock.number9.number", XrmoptionSepArg, NULL},
278
279 {"-number10-geometry", "*clock.number10.geometry", XrmoptionSepArg, NULL},
280 {"-number10-active", "*clock.number10.active", XrmoptionNoArg,"True"},
281 {"-number10-no-active", "*clock.number10.active", XrmoptionNoArg,"False"},
282 {"-number10-length", "*clock.number10.length", XrmoptionSepArg, NULL},
283 {"-number10-figure", "*clock.number10.figure", XrmoptionSepArg, NULL},
284 {"-number10-mask", "*clock.number10.mask", XrmoptionSepArg, NULL},
285 {"-number10-size", "*clock.number10.size", XrmoptionSepArg, NULL},
286 {"-number10-number", "*clock.number10.number", XrmoptionSepArg, NULL},
287
288 {"-number11-geometry", "*clock.number11.geometry", XrmoptionSepArg, NULL},
289 {"-number11-active", "*clock.number11.active", XrmoptionNoArg,"True"},
290 {"-number11-no-active", "*clock.number11.active", XrmoptionNoArg,"False"},
291 {"-number11-length", "*clock.number11.length", XrmoptionSepArg, NULL},
292 {"-number11-figure", "*clock.number11.figure", XrmoptionSepArg, NULL},
293 {"-number11-mask", "*clock.number11.mask", XrmoptionSepArg, NULL},
294 {"-number11-size", "*clock.number11.size", XrmoptionSepArg, NULL},
295 {"-number11-number", "*clock.number11.number", XrmoptionSepArg, NULL},
296
297 {"-number12-geometry", "*clock.number12.geometry", XrmoptionSepArg, NULL},
298 {"-number12-active", "*clock.number12.active", XrmoptionNoArg,"True"},
299 {"-number12-no-active", "*clock.number12.active", XrmoptionNoArg,"False"},
300 {"-number12-length", "*clock.number12.length", XrmoptionSepArg, NULL},
301 {"-number12-figure", "*clock.number12.figure", XrmoptionSepArg, NULL},
302 {"-number12-mask", "*clock.number12.mask", XrmoptionSepArg, NULL},
303 {"-number12-size", "*clock.number12.size", XrmoptionSepArg, NULL},
304 {"-number12-number", "*clock.number12.number", XrmoptionSepArg, NULL},
305
306 /* Eye ���������å��ѤΥ��ץ���� */
307
308 {"-eyes-geometry", "*clock.Eye.geometry", XrmoptionSepArg, NULL},
309 {"-eyes-active", "*clock.Eye.active", XrmoptionNoArg,"True"},
310 {"-eyes-no-active", "*clock.Eye.active", XrmoptionNoArg,"False"},
311 {"-eyes-fill-color", "*clock.Eye.fillColor", XrmoptionNoArg,"True"},
312 {"-eyes-no-fill-color", "*clock.Eye.fillColor", XrmoptionNoArg,"False"},
313 {"-eyes-fill-pixmap", "*clock.Eye.fillPixmap", XrmoptionNoArg,"True"},
314 {"-eyes-no-fill-pixmap", "*clock.Eye.fillPixmap", XrmoptionNoArg,"False"},
315 {"-eyes-background", "*clock.Eye.background", XrmoptionSepArg, NULL},
316 {"-eyes-bg", "*clock.Eye.background", XrmoptionSepArg, NULL},
317 {"-eyes-move", "*clock.Eye.move", XrmoptionSepArg, NULL},
318 {"-eyes-limit", "*clock.Eye.limit", XrmoptionSepArg, NULL},
319 {"-eyes-offset", "*clock.Eye.offset", XrmoptionSepArg, NULL},
320 {"-eyes-core-figure", "*clock.Eye.coreFigure", XrmoptionSepArg, NULL},
321 {"-eyes-core-mask", "*clock.Eye.coreMask", XrmoptionSepArg, NULL},
322 {"-eyes-eye-figure", "*clock.Eye.eyeFigure", XrmoptionSepArg, NULL},
323 {"-eyes-eye-mask", "*clock.Eye.eyeMask", XrmoptionSepArg, NULL},
324 {"-eyes-core-size", "*clock.Eye.coreSize", XrmoptionSepArg, NULL},
325 {"-eyes-eye-size", "*clock.Eye.eyeSize", XrmoptionSepArg, NULL},
326
327 {"-left-geometry", "*clock.left.geometry", XrmoptionSepArg, NULL},
328 {"-left-active", "*clock.left.active", XrmoptionNoArg,"True"},
329 {"-left-no-active", "*clock.left.active", XrmoptionNoArg,"False"},
330 {"-left-fill-color", "*clock.left.fillColor", XrmoptionNoArg,"True"},
331 {"-left-no-fill-color", "*clock.left.fillColor", XrmoptionNoArg,"False"},
332 {"-left-fill-pixmap", "*clock.left.fillPixmap", XrmoptionNoArg,"True"},
333 {"-left-no-fill-pixmap", "*clock.left.fillPixmap", XrmoptionNoArg,"False"},
334 {"-left-background", "*clock.left.background", XrmoptionSepArg, NULL},
335 {"-left-bg", "*clock.left.background", XrmoptionSepArg, NULL},
336 {"-left-move", "*clock.left.move", XrmoptionSepArg, NULL},
337 {"-left-limit", "*clock.left.limit", XrmoptionSepArg, NULL},
338 {"-left-offset", "*clock.left.offset", XrmoptionSepArg, NULL},
339 {"-left-core-figure", "*clock.left.coreFigure", XrmoptionSepArg, NULL},
340 {"-left-core-mask", "*clock.left.coreMask", XrmoptionSepArg, NULL},
341 {"-left-eye-figure", "*clock.left.eyeFigure", XrmoptionSepArg, NULL},
342 {"-left-eye-mask", "*clock.left.eyeMask", XrmoptionSepArg, NULL},
343 {"-left-core-size", "*clock.left.coreSize", XrmoptionSepArg, NULL},
344 {"-left-eye-size", "*clock.left.eyeSize", XrmoptionSepArg, NULL},
345
346 {"-right-geometry", "*clock.right.geometry", XrmoptionSepArg, NULL},
347 {"-right-active", "*clock.right.active", XrmoptionNoArg,"True"},
348 {"-right-no-active", "*clock.right.active", XrmoptionNoArg,"False"},
349 {"-right-fill-color", "*clock.right.fillColor", XrmoptionNoArg,"True"},
350 {"-right-no-fill-color", "*clock.right.fillColor", XrmoptionNoArg,"False"},
351 {"-right-fill-pixmap", "*clock.right.fillPixmap", XrmoptionNoArg,"True"},
352 {"-right-no-fill-pixmap", "*clock.right.fillPixmap", XrmoptionNoArg,"False"},
353 {"-right-background", "*clock.right.background", XrmoptionSepArg, NULL},
354 {"-right-bg", "*clock.right.background", XrmoptionSepArg, NULL},
355 {"-right-move", "*clock.right.move", XrmoptionSepArg, NULL},
356 {"-right-limit", "*clock.right.limit", XrmoptionSepArg, NULL},
357 {"-right-offset", "*clock.right.offset", XrmoptionSepArg, NULL},
358 {"-right-core-figure", "*clock.right.coreFigure", XrmoptionSepArg, NULL},
359 {"-right-core-mask", "*clock.right.coreMask", XrmoptionSepArg, NULL},
360 {"-right-eye-figure", "*clock.right.eyeFigure", XrmoptionSepArg, NULL},
361 {"-right-eye-mask", "*clock.right.eyeMask", XrmoptionSepArg, NULL},
362 {"-right-core-size", "*clock.right.coreSize", XrmoptionSepArg, NULL},
363 {"-right-eye-size", "*clock.right.eyeSize", XrmoptionSepArg, NULL},
364
365 {"-eye3-geometry", "*clock.eye3.geometry", XrmoptionSepArg, NULL},
366 {"-eye3-active", "*clock.eye3.active", XrmoptionNoArg,"True"},
367 {"-eye3-no-active", "*clock.eye3.active", XrmoptionNoArg,"False"},
368 {"-eye3-fill-color", "*clock.eye3.fillColor", XrmoptionNoArg,"True"},
369 {"-eye3-no-fill-color", "*clock.eye3.fillColor", XrmoptionNoArg,"False"},
370 {"-eye3-fill-pixmap", "*clock.eye3.fillPixmap" , XrmoptionNoArg,"True"},
371 {"-eye3-no-fill-pixmap", "*clock.eye3.fillPixmap", XrmoptionNoArg,"False"},
372 {"-eye3-background", "*clock.eye3.background", XrmoptionSepArg, NULL},
373 {"-eye3-bg", "*clock.eye3.background", XrmoptionSepArg, NULL},
374 {"-eye3-move", "*clock.eye3.move", XrmoptionSepArg, NULL},
375 {"-eye3-limit", "*clock.eye3.limit", XrmoptionSepArg, NULL},
376 {"-eye3-offset", "*clock.eye3.offset", XrmoptionSepArg, NULL},
377 {"-eye3-core-figure", "*clock.eye3.coreFigure", XrmoptionSepArg, NULL},
378 {"-eye3-core-mask", "*clock.eye3.coreMask", XrmoptionSepArg, NULL},
379 {"-eye3-eye-figure", "*clock.eye3.eyeFigure", XrmoptionSepArg, NULL},
380 {"-eye3-eye-mask", "*clock.eye3.eyeMask", XrmoptionSepArg, NULL},
381 {"-eye3-core-size", "*clock.eye3.coreSize", XrmoptionSepArg, NULL},
382 {"-eye3-eye-size", "*clock.eye3.eyeSize", XrmoptionSepArg, NULL},
383
384 {"-eye4-geometry", "*clock.eye4.geometry", XrmoptionSepArg, NULL},
385 {"-eye4-active", "*clock.eye4.active", XrmoptionNoArg,"True"},
386 {"-eye4-no-active", "*clock.eye4.active", XrmoptionNoArg,"False"},
387 {"-eye4-fill-color", "*clock.eye4.fillColor", XrmoptionNoArg,"True"},
388 {"-eye4-no-fill-color", "*clock.eye4.fillColor", XrmoptionNoArg,"False"},
389 {"-eye4-fill-pixmap", "*clock.eye4.fillPixmap" , XrmoptionNoArg,"True"},
390 {"-eye4-no-fill-pixmap", "*clock.eye4.fillPixmap", XrmoptionNoArg,"False"},
391 {"-eye4-background", "*clock.eye4.background", XrmoptionSepArg, NULL},
392 {"-eye4-bg", "*clock.eye4.background", XrmoptionSepArg, NULL},
393 {"-eye4-move", "*clock.eye4.move", XrmoptionSepArg, NULL},
394 {"-eye4-limit", "*clock.eye4.limit", XrmoptionSepArg, NULL},
395 {"-eye4-offset", "*clock.eye4.offset", XrmoptionSepArg, NULL},
396 {"-eye4-core-figure", "*clock.eye4.coreFigure", XrmoptionSepArg, NULL},
397 {"-eye4-core-mask", "*clock.eye4.coreMask", XrmoptionSepArg, NULL},
398 {"-eye4-eye-figure", "*clock.eye4.eyeFigure", XrmoptionSepArg, NULL},
399 {"-eye4-eye-mask", "*clock.eye4.eyeMask", XrmoptionSepArg, NULL},
400 {"-eye4-core-size", "*clock.eye4.coreSize", XrmoptionSepArg, NULL},
401 {"-eye4-eye-size", "*clock.eye4.eyeSize", XrmoptionSepArg, NULL},
402
403 {"-eye5-geometry", "*clock.eye5.geometry", XrmoptionSepArg, NULL},
404 {"-eye5-active", "*clock.eye5.active", XrmoptionNoArg,"True"},
405 {"-eye5-no-active", "*clock.eye5.active", XrmoptionNoArg,"False"},
406 {"-eye5-fill-color", "*clock.eye5.fillColor", XrmoptionNoArg,"True"},
407 {"-eye5-no-fill-color", "*clock.eye5.fillColor", XrmoptionNoArg,"False"},
408 {"-eye5-fill-pixmap", "*clock.eye5.fillPixmap" , XrmoptionNoArg,"True"},
409 {"-eye5-no-fill-pixmap", "*clock.eye5.fillPixmap", XrmoptionNoArg,"False"},
410 {"-eye5-background", "*clock.eye5.background", XrmoptionSepArg, NULL},
411 {"-eye5-bg", "*clock.eye5.background", XrmoptionSepArg, NULL},
412 {"-eye5-move", "*clock.eye5.move", XrmoptionSepArg, NULL},
413 {"-eye5-limit", "*clock.eye5.limit", XrmoptionSepArg, NULL},
414 {"-eye5-offset", "*clock.eye5.offset", XrmoptionSepArg, NULL},
415 {"-eye5-core-figure", "*clock.eye5.coreFigure", XrmoptionSepArg, NULL},
416 {"-eye5-core-mask", "*clock.eye5.coreMask", XrmoptionSepArg, NULL},
417 {"-eye5-eye-figure", "*clock.eye5.eyeFigure", XrmoptionSepArg, NULL},
418 {"-eye5-eye-mask", "*clock.eye5.eyeMask", XrmoptionSepArg, NULL},
419 {"-eye5-core-size", "*clock.eye5.coreSize", XrmoptionSepArg, NULL},
420 {"-eye5-eye-size", "*clock.eye5.eyeSize", XrmoptionSepArg, NULL},
421
422 {"-eye6-geometry", "*clock.eye6.geometry", XrmoptionSepArg, NULL},
423 {"-eye6-active", "*clock.eye6.active", XrmoptionNoArg,"True"},
424 {"-eye6-no-active", "*clock.eye6.active", XrmoptionNoArg,"False"},
425 {"-eye6-fill-color", "*clock.eye6.fillColor", XrmoptionNoArg,"True"},
426 {"-eye6-no-fill-color", "*clock.eye6.fillColor", XrmoptionNoArg,"False"},
427 {"-eye6-fill-pixmap", "*clock.eye6.fillPixmap" , XrmoptionNoArg,"True"},
428 {"-eye6-no-fill-pixmap", "*clock.eye6.fillPixmap", XrmoptionNoArg,"False"},
429 {"-eye6-background", "*clock.eye6.background", XrmoptionSepArg, NULL},
430 {"-eye6-bg", "*clock.eye6.background", XrmoptionSepArg, NULL},
431 {"-eye6-move", "*clock.eye6.move", XrmoptionSepArg, NULL},
432 {"-eye6-limit", "*clock.eye6.limit", XrmoptionSepArg, NULL},
433 {"-eye6-offset", "*clock.eye6.offset", XrmoptionSepArg, NULL},
434 {"-eye6-core-figure", "*clock.eye6.coreFigure", XrmoptionSepArg, NULL},
435 {"-eye6-core-mask", "*clock.eye6.coreMask", XrmoptionSepArg, NULL},
436 {"-eye6-eye-figure", "*clock.eye6.eyeFigure", XrmoptionSepArg, NULL},
437 {"-eye6-eye-mask", "*clock.eye6.eyeMask", XrmoptionSepArg, NULL},
438 {"-eye6-core-size", "*clock.eye6.coreSize", XrmoptionSepArg, NULL},
439 {"-eye6-eye-size", "*clock.eye6.eyeSize", XrmoptionSepArg, NULL},
440
441 {"-eye7-geometry", "*clock.eye7.geometry", XrmoptionSepArg, NULL},
442 {"-eye7-active", "*clock.eye7.active", XrmoptionNoArg,"True"},
443 {"-eye7-no-active", "*clock.eye7.active", XrmoptionNoArg,"False"},
444 {"-eye7-fill-color", "*clock.eye7.fillColor", XrmoptionNoArg,"True"},
445 {"-eye7-no-fill-color", "*clock.eye7.fillColor", XrmoptionNoArg,"False"},
446 {"-eye7-fill-pixmap", "*clock.eye7.fillPixmap" , XrmoptionNoArg,"True"},
447 {"-eye7-no-fill-pixmap", "*clock.eye7.fillPixmap", XrmoptionNoArg,"False"},
448 {"-eye7-background", "*clock.eye7.background", XrmoptionSepArg, NULL},
449 {"-eye7-bg", "*clock.eye7.background", XrmoptionSepArg, NULL},
450 {"-eye7-move", "*clock.eye7.move", XrmoptionSepArg, NULL},
451 {"-eye7-limit", "*clock.eye7.limit", XrmoptionSepArg, NULL},
452 {"-eye7-offset", "*clock.eye7.offset", XrmoptionSepArg, NULL},
453 {"-eye7-core-figure", "*clock.eye7.coreFigure", XrmoptionSepArg, NULL},
454 {"-eye7-core-mask", "*clock.eye7.coreMask", XrmoptionSepArg, NULL},
455 {"-eye7-eye-figure", "*clock.eye7.eyeFigure", XrmoptionSepArg, NULL},
456 {"-eye7-eye-mask", "*clock.eye7.eyeMask", XrmoptionSepArg, NULL},
457 {"-eye7-core-size", "*clock.eye7.coreSize", XrmoptionSepArg, NULL},
458 {"-eye7-eye-size", "*clock.eye7.eyeSize", XrmoptionSepArg, NULL},
459
460 {"-eye8-geometry", "*clock.eye8.geometry", XrmoptionSepArg, NULL},
461 {"-eye8-active", "*clock.eye8.active", XrmoptionNoArg,"True"},
462 {"-eye8-no-active", "*clock.eye8.active", XrmoptionNoArg,"False"},
463 {"-eye8-fill-color", "*clock.eye8.fillColor", XrmoptionNoArg,"True"},
464 {"-eye8-no-fill-color", "*clock.eye8.fillColor", XrmoptionNoArg,"False"},
465 {"-eye8-fill-pixmap", "*clock.eye8.fillPixmap" , XrmoptionNoArg,"True"},
466 {"-eye8-no-fill-pixmap", "*clock.eye8.fillPixmap", XrmoptionNoArg,"False"},
467 {"-eye8-background", "*clock.eye8.background", XrmoptionSepArg, NULL},
468 {"-eye8-bg", "*clock.eye8.background", XrmoptionSepArg, NULL},
469 {"-eye8-move", "*clock.eye8.move", XrmoptionSepArg, NULL},
470 {"-eye8-limit", "*clock.eye8.limit", XrmoptionSepArg, NULL},
471 {"-eye8-offset", "*clock.eye8.offset", XrmoptionSepArg, NULL},
472 {"-eye8-core-figure", "*clock.eye8.coreFigure", XrmoptionSepArg, NULL},
473 {"-eye8-core-mask", "*clock.eye8.coreMask", XrmoptionSepArg, NULL},
474 {"-eye8-eye-figure", "*clock.eye8.eyeFigure", XrmoptionSepArg, NULL},
475 {"-eye8-eye-mask", "*clock.eye8.eyeMask", XrmoptionSepArg, NULL},
476 {"-eye8-core-size", "*clock.eye8.coreSize", XrmoptionSepArg, NULL},
477 {"-eye8-eye-size", "*clock.eye8.eyeSize", XrmoptionSepArg, NULL}
478 };
479
480 /*===========================================================================*/
481 /* ���ȥ� */
482 /*===========================================================================*/
483
484 static Atom wm_delete_window;
485
486 /*===========================================================================*/
487 /* ������������� */
488 /*===========================================================================*/
489
490 static void quit(Widget w, XEvent * event, String * params, Cardinal * num);
491 static void wm_quit(Widget w, XEvent * event, String * params, Cardinal * num);
492 static void restore(Widget w, XEvent * event, String * params, Cardinal * num);
493 static void iconify(Widget w, XEvent * event, String * params, Cardinal * num);
494
495 static XtActionsRec actions[] = {
496 {"quit", quit},
497 {"wm_quit", wm_quit},
498 {"iconify", iconify},
499 {"restore", restore}
500 };
501
502 /*===========================================================================*/
503 /* �ȥ�졼��������� */
504 /*===========================================================================*/
505
506 static char * translations =
507 "<Message>WM_PROTOCOLS: wm_quit()\n"
508 "None<Key>r: restore()\n"
509 "None<Key>i: iconify()\n"
510 "Ctrl<Key>c: quit()\n"
511 "None<Key>q: quit()";
512
513 /*===========================================================================*/
514 /* �إ�� */
515 /*===========================================================================*/
516
517 static char * help_message =
518 "\n"
519 VERSION "\n"
520 "\n"
521 "EyeClock - A clock application for X. The eyes follow the mouse pointer.\n"
522 "\n"
523 "EyeClock Copyright (C) 1998-1999 Sakai Hiroaki.\n"
524 "All Rights Reserved.\n"
525 "\n"
526 "EyeClock is a simple clock application for X11. You can put your favorite\n"
527 "picture on the face of the clock. And you can move the eyes of the\n"
528 "picture following the mouse pointer.\n"
529 "\n"
530 "Usage:\n"
531 "\n"
532 " eyeclock [options]\n"
533 "\n"
534 "Options:\n"
535 "\n"
536 " (X Toolkit options)\n"
537 "\n"
538 " -display [displayname]\n"
539 " -geometry [WxH+X+Y]\n"
540 " -title [titlename]\n"
541 " -name [name]\n"
542 " -background [color], -bg [color]\n"
543 " -icon-pixmap [XPM file]\n"
544 " -icon-mask [XPM file]\n"
545 "\n"
546 " -clock-geometry [WxH+X+Y]\n"
547 " -root\n"
548 " -no-root\n"
549 " -face [XPM file]\n"
550 " -interval [milli seconds]\n"
551 "\n"
552 " -hands-geometry [TxL+X+Y]\n"
553 " -hands-active\n"
554 " -hands-no-active\n"
555 " -hands-foreground [color], -hands-fg [color]\n"
556 " -hands-bordercolor [color], -hands-bc [color]\n"
557 " -hands-borderwidth [x], -hands-bw [x]\n"
558 " -hands-width [x]\n"
559 " -hands-length [x]\n"
560 "\n"
561 " Options like \"-hour-XXXXXXXX\", \"-minute-XXXXXXXX\", and,\n"
562 " \"-second-XXXXXXXX\" are equal to above options. Option like\n"
563 " \"-hands-XXXXXXXX\" effects all hands. Option like\n"
564 " \"-hour-XXXXXXXX\" effects only hour hand.\n"
565 "\n"
566 " -numbers-geometry [WxH+X+Y]\n"
567 " -numbers-active\n"
568 " -numbers-no-active\n"
569 " -numbers-length [x]\n"
570 " -numbers-figure [XPM file]\n"
571 " -numbers-mask [XPM file]\n"
572 " -numbers-size [WxH]\n"
573 "\n"
574 " Options like \"-number1-XXXXXXXX\", \"-number2-XXXXXXXX\", ...,\n"
575 " and, \"-number12-XXXXXXXX\" are equal to above options.\n"
576 " Option like \"-numbers-XXXXXXXX\" effects all numbers.\n"
577 " Option like \"-number1-XXXXXXXX\" effects only number 1.\n"
578 "\n"
579 " -eyes-geometry [WxH+X+Y]\n"
580 " -eyes-active\n"
581 " -eyes-no-active\n"
582 " -eyes-fill-color\n"
583 " -eyes-no-fill-color\n"
584 " -eyes-fill-pixmap\n"
585 " -eyes-no-fill-pixmap\n"
586 " -eyes-background [color], -eyes-bg [color]\n"
587 " -eyes-move [XxY]\n"
588 " -eyes-limit [XxY]\n"
589 " -eyes-offset [XxY]\n"
590 " -eyes-core-figure [XPM file]\n"
591 " -eyes-core-mask [XPM file]\n"
592 " -eyes-eye-figure [XPM file]\n"
593 " -eyes-eye-mask [XPM file]\n"
594 " -eyes-core-size [WxH]\n"
595 " -eyes-eye-size [WxH]\n"
596 "\n"
597 " Options like \"-left-XXXXXXXX\", \"-right-XXXXXXXX\",\n"
598 " \"-eye3-XXXXXXXX\", ... , and, \"-eye8-XXXXXXXX\" are equal to\n"
599 " above options. Option like \"-eyes-XXXXXXXX\" effects all\n"
600 " eyes. Option like \"-left-XXXXXXXX\" effects only left eye.\n"
601 "\n"
602 "See \"man eyeclock\" for more details.\n"
603 "\n"
604 ;
605
606 /*****************************************************************************/
607 /* �ؿ������� */
608 /*****************************************************************************/
609
610 /*===========================================================================*/
611 /* ����� */
612 /*===========================================================================*/
613
die(Widget w)614 static void die(Widget w)
615 {
616 Display * display;
617 int i;
618
619 if (myclock)
620 if (XtIsRealized(myclock))
621 ClockStop(myclock);
622
623 if (toplevel)
624 if (XtIsRealized(toplevel)) {
625 display = XtDisplay(toplevel);
626 XtDestroyWidget(toplevel);
627 XCloseDisplay(display);
628 }
629
630 exit(0);
631 }
632
quit(Widget w,XEvent * event,String * params,Cardinal * num)633 static void quit(Widget w, XEvent * event, String * params, Cardinal * num)
634 {
635 die(w);
636 }
637
wm_quit(Widget w,XEvent * event,String * params,Cardinal * num)638 static void wm_quit(Widget w, XEvent * event, String * params, Cardinal * num)
639 {
640 if ((event->type == ClientMessage) &&
641 (event->xclient.data.l[0] != wm_delete_window)) {
642 XBell(XtDisplay(w), 0);
643 } else {
644 die(w);
645 }
646 }
647
restore(Widget w,XEvent * event,String * params,Cardinal * num)648 static void restore(Widget w, XEvent * event, String * params, Cardinal * num)
649 {
650 unsigned int width;
651 unsigned int height;
652
653 width = ClockGetFaceWidth(myclock);
654 height = ClockGetFaceHeight(myclock);
655
656 if (width && height)
657 XtVaSetValues(toplevel, XtNwidth, width, XtNheight, height, NULL);
658 }
659
iconify(Widget w,XEvent * event,String * params,Cardinal * num)660 static void iconify(Widget w, XEvent * event, String * params, Cardinal * num)
661 {
662 XIconifyWindow(XtDisplay(toplevel), XtWindow(toplevel),
663 DefaultScreen(XtDisplay(toplevel)));
664 }
665
666 /*===========================================================================*/
667 /* Ctrl-c �ϥ�ɥ� */
668 /*===========================================================================*/
669
interrupt_handler(int value)670 static void interrupt_handler(int value)
671 {
672 die(toplevel);
673 }
674
675 /*===========================================================================*/
676 /* HUP �����ʥ�ϥ�ɥ� */
677 /*===========================================================================*/
678
hup_handler(int value)679 static void hup_handler(int value)
680 {
681 XRaiseWindow(XtDisplay(toplevel), XtWindow(toplevel));
682 }
683
684 /*===========================================================================*/
685 /* �إ�� */
686 /*===========================================================================*/
687
help()688 static void help()
689 {
690 fprintf(stdout, "%s", help_message);
691 die(toplevel);
692 }
693
694 /*===========================================================================*/
695 /* �ᥤ�� */
696 /*===========================================================================*/
697
main(int argc,char * argv[])698 int main(int argc, char * argv[])
699 {
700 XtAppContext app_context;
701 Display * display;
702 Window root;
703 Pixmap pixmap;
704 Pixmap icon_face;
705 Pixmap icon_mask;
706 int i;
707
708 /* �����������С�������Ͽ */
709 XtSetTypeConverter(XtRString, XtRXPoint, ConvertStringToPoint,
710 NULL, 0, XtCacheNone, NULL);
711 XtSetTypeConverter(XtRString, XtRBitmap, ConvertStringToPixmap,
712 NULL, 0, XtCacheNone, NULL);
713 XtSetTypeConverter(XtRString, XtRPixmap, ConvertStringToPixmap,
714 NULL, 0, XtCacheNone, NULL);
715 XtSetTypeConverter(XtRPixmapData, XtRPixmap, ConvertPixmapDataToPixmap,
716 NULL, 0, XtCacheNone, NULL);
717 XtSetTypeConverter(XtRString, XtRWidgetCorePart,
718 ConvertGeometryStringToPoint, NULL, 0,
719 XtCacheNone, NULL);
720
721 /* �ȥåץ�٥���������åȤκ��� */
722 toplevel = XtAppInitialize(&app_context, "EyeClock",
723 options, XtNumber(options),
724 &argc, argv, fallback_resources, NULL, 0);
725
726 if (argc > 1) {
727 for (i = 1; i < argc; i++)
728 fprintf(stderr, "Unknown option : %s\n", argv[i]);
729 help();
730 }
731
732 /* Clock ���������åȤκ��� */
733 myclock = XtCreateManagedWidget("clock", clockWidgetClass, toplevel, NULL, 0);
734
735 /* Hand ���������åȤκ��� */
736 for (i = 0; hands_default_values[i].name; i++)
737 XtVaCreateManagedWidget(hands_default_values[i].name,
738 handWidgetClass, myclock,
739 XtNtype, hands_default_values[i].type, NULL);
740
741 /* Number ���������åȤκ��� */
742 for (i = 0; numbers_default_values[i].name; i++)
743 XtVaCreateManagedWidget(numbers_default_values[i].name,
744 numberWidgetClass, myclock,
745 XtNnumber, numbers_default_values[i].number, NULL);
746
747 /* Eye ���������åȤκ��� */
748 for (i = 0; eyes_name[i]; i++)
749 XtCreateManagedWidget(eyes_name[i], eyeWidgetClass, myclock, NULL, 0);
750
751 /* �ݥ��Υե���������ͭ���ˤ��� */
752 XtVaSetValues(toplevel, XtNinput, True, NULL);
753
754 display = XtDisplay(toplevel);
755 root = DefaultRootWindow(display);
756
757 /* ������������� */
758 XtVaGetValues(toplevel, XtNiconPixmap, &icon_face, NULL);
759 if (icon_face == 0) {
760 icon_face = MakePixmapFromPixmapData(display, root, icon_face_xpm);
761 XtVaSetValues(toplevel, XtNiconPixmap, icon_face, NULL);
762 }
763
764 /* ��������ޥ��������� */
765 XtVaGetValues(toplevel, XtNiconMask, &pixmap, NULL);
766 if (pixmap)
767 icon_mask = CreateInvertMaskBitmap(display, root, pixmap);
768 else
769 icon_mask = CreateInvertMaskBitmap(display, root, icon_face);
770 XtVaSetValues(toplevel, XtNiconMask, icon_mask, NULL);
771 if (pixmap)
772 XFreePixmap(display, pixmap);
773
774 /* �������������� */
775 XtAppAddActions(app_context, actions, XtNumber(actions));
776
777 /* �ȥ�졼���������� */
778 XtOverrideTranslations(toplevel, XtParseTranslationTable(translations));
779
780 /* ���������åȤΥꥢ�饤�� */
781 XtRealizeWidget(toplevel);
782
783 /* X �����Ф����������åȤ�ꥢ�饤������ޤ��Ԥ� */
784 while (!XtIsRealized(toplevel)) { /* None */ }
785
786 /* ������ɥ��ޥ͡����㤫��� f.delete �ؤ��б� */
787 wm_delete_window = XInternAtom(display, "WM_DELETE_WINDOW", False);
788 XSetWMProtocols(display, XtWindow(toplevel), &wm_delete_window, 1);
789
790 /* ���פ����Ȥ����� */
791 ClockStart(app_context, myclock);
792
793 /* Ctrl-c �Υȥ�å� */
794 signal(SIGINT, interrupt_handler);
795
796 /* HUP �����ʥ�Υȥ�å� */
797 signal(SIGHUP, hup_handler);
798
799 /* �ᥤ��롼�� */
800 XtAppMainLoop(app_context);
801 }
802
803 /*****************************************************************************/
804 /* �����ޤ� */
805 /*****************************************************************************/
806
807 /*****************************************************************************/
808 /* End of File. */
809 /*****************************************************************************/
810