|
|
1.1 root 1: #include <X/mit-copyright.h>
2:
3: /* Copyright 1985 Massachusetts Institute of Technology */
4:
5: /*
6: * xclock.c MIT Project Athena, X Window system clock.
7: *
8: * This program provides the user with a small
9: * window contining a digital clock with day and date.
10: * Parameters are variable from the command line.
11: *
12: * Author: Tony Della Fera, DEC
13: * September, 1984
14: * Hacked up by a cast of thousands....
15: */
16:
17: #include <stdio.h>
18: #include <math.h>
19: #include <sys/time.h>
20: #include <X/Xlib.h>
21:
22: #define PI 3.141592
23:
24: #define SEG_BUFF_SIZE 128
25:
26: #define SECOND_HAND_FRACT 90
27: #define MINUTE_HAND_FRACT 70
28: #define HOUR_HAND_FRACT 40
29: #define SECOND_HAND_TIME 30
30:
31: #define DEF_UPDATE 60
32:
33: #define DEF_BORDER 2
34: #define DEF_VECTOR_HEIGHT 1
35: #define DEF_VECTOR_WIDTH 1
36:
37: #define DEF_DIGITAL_PADDING 10
38: #define DEF_DIGITAL_FONT "6x10"
39: #define DEF_ANALOG_PADDING 8
40: #define DEF_ANALOG_WIDTH 164
41: #define DEF_ANALOG_HEIGHT 164
42:
43: #define DEF_BORDER_COLOR BlackPixel
44: #define DEF_HIGH_COLOR BlackPixel
45: #define DEF_FRGRND_COLOR BlackPixel
46: #define DEF_BKGRND_COLOR WhitePixel
47:
48: #define UNINIT -1
49: #define FAILURE 0
50:
51: #define max(a, b) ((a) > (b) ? (a) : (b))
52: #define min(a, b) ((a) < (b) ? (a) : (b))
53: #define abs(a) ((a) < 0 ? -(a) : (a))
54:
55: typedef enum _bool {FALSE, TRUE} Bool;
56:
57: Bool XClockDebug = FALSE;
58: Bool AnalogClock = FALSE;
59: Bool ShowSecondHand = FALSE;
60: Bool Reverse = FALSE;
61:
62: int CenterX = 0;
63: int CenterY = 0;
64: int NumSegs = 0;
65:
66: int FrgrndColor;
67: int BkgrndColor;
68: int BorderColor;
69: int HighColor;
70:
71: Vertex SegBuff[SEG_BUFF_SIZE];
72: Vertex *SegBuffPtr;
73:
74: Window ClockWindow;
75:
76: main(argc, argv)
77: int argc;
78: char **argv;
79: {
80: char time_string[26];
81: register char *time_ptr = time_string;
82: #ifdef DEBUG
83: register Bool debug = XClockDebug;
84: #endif
85: register int i;
86: register int radius;
87: register int padding = UNINIT; /* UNINIT = parameter uninitialized. */
88: int border = UNINIT; /* UNINIT = parameter uninitialized. */
89: int update = UNINIT; /* UNINIT = parameter uninitialized. */
90: int win_width = UNINIT; /* UNINIT = parameter uninitialized. */
91: int win_height = UNINIT; /* UNINIT = parameter uninitialized. */
92: int second_hand_length;
93: int minute_hand_length;
94: int hour_hand_length;
95: int readfds = 0;
96: int maxfds = 0;
97: int string_width;
98: int status;
99: Bool even_update = FALSE;
100:
101: long time_value;
102:
103: char *index();
104: char *ctime(), asctim();
105: char *strind;
106: char *fn = DEF_DIGITAL_FONT;
107: char *fore_color;
108: char *back_color;
109: char *high_color;
110: char *brdr_color;
111: char *geom = NULL;
112: char *display = NULL;
113: int rvflag = 0;
114:
115: Color cdef;
116:
117: struct tm *localtime();
118: struct timeval timeout;
119: struct tm tm;
120: struct tm otm;
121:
122: Font font;
123: FontInfo font_info;
124: XEvent event;
125: char *def_val;
126:
127: def_val = XGetDefault(argv[0], "BorderWidth");
128: if (def_val != NULL) border = atoi(def_val);
129:
130: def_val = XGetDefault(argv[0], "BodyFont");
131: if (def_val != NULL) fn = def_val;
132:
133: fore_color = XGetDefault(argv[0], "Foreground");
134: back_color = XGetDefault(argv[0], "Background");
135: high_color = XGetDefault(argv[0], "Highlight");
136: brdr_color = XGetDefault(argv[0], "Border");
137:
138: def_val = XGetDefault(argv[0], "ReverseVideo");
139: if(def_val != NULL && strcmp(def_val, "on") == 0) rvflag++;
140:
141: def_val = XGetDefault(argv[0], "InternalBorder");
142: if (def_val != NULL) padding = atoi(def_val);
143:
144: if ((def_val = XGetDefault(argv[0], "Mode")) != NULL) {
145: if (strcmp(def_val, "analog") == 0) AnalogClock = TRUE;
146: if (strcmp(def_val, "digital") == 0) AnalogClock = FALSE;
147: if (strcmp(def_val, "Analog") == 0) AnalogClock = TRUE;
148: if (strcmp(def_val, "Digital") == 0) AnalogClock = FALSE;
149: }
150:
151: def_val = XGetDefault(argv[0],"Update");
152: if (def_val != NULL) update = atoi(def_val);
153:
154: for (i = 1; i < argc; i++) {
155: if (argv [i] [0] == '=') {
156: geom = argv[i];
157: continue;
158: }
159: strind = index(argv[i], ':');
160: if(strind != NULL) {
161: display = argv[i];
162: continue;
163: }
164: strind = index(argv [i], '-');
165: if (strind == NULL) Syntax(argv[0]);
166: if (strcmp(argv [i], "-a") == 0 ||
167: strcmp(argv [i], "-analog") == 0) {
168: AnalogClock = TRUE;
169: continue;
170: }
171: if (strcmp(argv [i], "-d") == 0 ||
172: strcmp(argv [i], "-digital") == 0) {
173: AnalogClock = FALSE;
174: continue;
175: }
176: if (strcmp(argv [i], "-bw") == 0 ||
177: strcmp(argv [i], "-border") == 0) {
178: if (++i >= argc) Syntax(argv[0]);
179: border = atoi(argv [i]);
180: continue;
181: }
182: #ifdef DEBUG
183: if (strcmp(argv [i], "-debug") == 0) {
184: XClockDebug = TRUE;
185: debug = TRUE;
186: continue;
187: }
188: #endif
189: if (strcmp(argv [i], "-fn") == 0 ||
190: strcmp(argv [i], "-font") == 0) {
191: if (++i >= argc) Syntax(argv[0]);
192: fn = argv [i];
193: continue;
194: }
195: if (strcmp(argv [i], "-fg") == 0 ||
196: strcmp(argv [i], "-foreground") == 0) {
197: if (++i >= argc) Syntax(argv[0]);
198: fore_color = argv [i];
199: continue;
200: }
201: if (strcmp(argv [i], "-bg") == 0 ||
202: strcmp(argv [i], "-background") == 0) {
203: if (++i >= argc) Syntax(argv[0]);
204: back_color = argv [i];
205: continue;
206: }
207: if (strcmp(argv [i], "-hl") == 0 ||
208: strcmp(argv [i], "-highlight") == 0) {
209: if (++i >= argc) Syntax(argv[0]);
210: high_color = argv [i];
211: continue;
212: }
213: if (strcmp(argv [i], "-bd") == 0 ||
214: strcmp(argv [i], "-bordercolor") == 0) {
215: if (++i >= argc) Syntax(argv[0]);
216: brdr_color = argv [i];
217: continue;
218: }
219: if (strcmp(argv [i], "-help") == 0) {
220: Syntax(argv[0]);
221: }
222: if (strcmp(argv [i], "-p") == 0 ||
223: strcmp(argv [i], "-padding") == 0) {
224: if (++i >= argc) Syntax(argv[0]);
225: padding = atoi(argv [i]);
226: continue;
227: }
228: if (strcmp(argv [i], "-rv") == 0 ||
229: strcmp(argv [i], "-reverse") == 0) {
230: rvflag++;
231: continue;
232: }
233: if (strcmp(argv [i], "-u") == 0 ||
234: strcmp(argv [i], "-update") == 0) {
235: if (++i >= argc) Syntax(argv[0]);
236: update = atoi(argv [i]);
237: continue;
238: }
239: Syntax(argv[0]);
240: }
241:
242: /*
243: * Open up the display.
244: */
245: if (XOpenDisplay(display) == NULL) {
246: XClockError("Error while trying to open display");
247: }
248: if (rvflag) Reverse = TRUE;
249:
250: /*
251: * Set up colors and pixmaps.
252: */
253: if (brdr_color != NULL) {
254: if (DisplayCells() > 2) {
255: if (
256: XParseColor(brdr_color, &cdef) &&
257: XGetHardwareColor(&cdef)
258: ) BorderColor = cdef.pixel;
259: else BorderColor = DEF_BORDER_COLOR;
260: }
261: else if (strcmp(brdr_color, "black") == 0)
262: BorderColor = BlackPixel;
263: else if (strcmp(brdr_color, "white") == 0)
264: BorderColor = WhitePixel;
265: else BorderColor = DEF_BORDER_COLOR;
266: }
267: else BorderColor = DEF_BORDER_COLOR;
268:
269: if (fore_color != NULL) {
270: if (DisplayCells() > 2) {
271: if (
272: XParseColor(fore_color, &cdef) &&
273: XGetHardwareColor(&cdef)
274: ) FrgrndColor = cdef.pixel;
275: else FrgrndColor = DEF_FRGRND_COLOR;
276: }
277: else if (strcmp(fore_color, "black") == 0)
278: FrgrndColor = BlackPixel;
279: else if (strcmp(fore_color, "white") == 0)
280: FrgrndColor = WhitePixel;
281: else FrgrndColor = DEF_FRGRND_COLOR;
282: }
283: else FrgrndColor = DEF_FRGRND_COLOR;
284:
285: if (back_color != NULL) {
286: if (DisplayCells() > 2) {
287: if (
288: XParseColor(back_color, &cdef) &&
289: XGetHardwareColor(&cdef)
290: ) BkgrndColor = cdef.pixel;
291: else BkgrndColor = DEF_BKGRND_COLOR;
292: }
293: else if (strcmp(back_color, "black") == 0)
294: BkgrndColor = BlackPixel;
295: else if (strcmp(back_color, "white") == 0)
296: BkgrndColor = WhitePixel;
297: else BkgrndColor = DEF_BKGRND_COLOR;
298: }
299: else BkgrndColor = DEF_BKGRND_COLOR;
300:
301: if ((high_color != NULL) && AnalogClock) {
302: if (DisplayCells() > 2) {
303: if (
304: XParseColor(high_color, &cdef) &&
305: XGetHardwareColor(&cdef)
306: ) HighColor = cdef.pixel;
307: else HighColor = DEF_HIGH_COLOR;
308: }
309: else if (strcmp(high_color, "black") == 0)
310: HighColor = BlackPixel;
311: else if (strcmp(high_color, "white") == 0)
312: HighColor = WhitePixel;
313: else HighColor = DEF_HIGH_COLOR;
314: }
315: else HighColor = DEF_HIGH_COLOR;
316:
317: if (Reverse) {
318: HighColor = BorderColor = BkgrndColor;
319: BkgrndColor = FrgrndColor;
320: FrgrndColor = HighColor;
321: }
322:
323: /*
324: * Set up analog and digital specific defaults.
325: */
326: if (AnalogClock == TRUE) {
327: /*
328: * Set analog defaults.
329: */
330: if (padding == UNINIT) padding = DEF_ANALOG_PADDING;
331: if (update == UNINIT) update = DEF_UPDATE;
332: if (update <= SECOND_HAND_TIME) ShowSecondHand = TRUE;
333: /*
334: * Initialize the segment buffer and segment buffer pointer.
335: */
336: SegBuffPtr = SegBuff;
337:
338: /*
339: * Initialize the number of "segments" in the buffer; each
340: * segment is one Vertex or 3 shorts, an x value, a y value
341: * and the flags as passed to XDraw.
342: */
343: NumSegs = 0;
344: }
345: else {
346: /*
347: * Set digital defaults.
348: */
349:
350: if (padding == UNINIT) padding = DEF_DIGITAL_PADDING;
351: if (update == UNINIT) update = DEF_UPDATE;
352:
353: /*
354: * Get font dependent information and determine window
355: * size from a test string.
356: */
357: time(&time_value);
358: time_ptr = ctime(&time_value);
359: time_ptr[strlen(time_ptr) - 1] = 0;
360:
361: font = XGetFont(fn);
362: if (font == FAILURE) XClockError("Can't get font");
363:
364: status = XQueryFont(font, &font_info);
365: if (status == FAILURE) XClockError("Can't query font");
366:
367: string_width = XQueryWidth (time_ptr, font);
368:
369: }
370:
371:
372: /*
373: * Now set analog and digital independent defaults.
374: */
375: if (border == UNINIT) border = DEF_BORDER;
376: if (update > 1 && ((60 / update) * update == 60)) even_update = TRUE;
377:
378: /*
379: * Open the main window.
380: */
381: {
382: int min_width, min_height;
383: char default_geom[20];
384: OpaqueFrame frame;
385: if (AnalogClock) {
386: min_width = DEF_ANALOG_WIDTH/3;
387: min_height = DEF_ANALOG_HEIGHT/3;
388: sprintf (default_geom,
389: "%dx%d-0-0", DEF_ANALOG_WIDTH, DEF_ANALOG_HEIGHT);
390: }
391: else {
392: min_width = string_width + (2 * padding);
393: min_height = font_info.height + (2 * padding);
394: sprintf (default_geom, "%dx%d-0-0", min_width, min_height);
395: }
396: frame.bdrwidth = border;
397: frame.border = XMakeTile (BorderColor);
398: frame.background = XMakeTile (BkgrndColor);
399: ClockWindow = XCreate (
400: AnalogClock ? "Analog XClock" : "Digital XClock",
401: argv[0],
402: geom,
403: default_geom,
404: &frame,
405: min_width,
406: min_height);
407: if (ClockWindow == FAILURE)
408: XClockError("Can't open clock window");
409: }
410:
411: /*
412: * Select window exposure events to see if the contents of
413: * the window have been erased or altered. Select unmap events so
414: * we can stop output when iconified.
415: */
416: XSelectInput(ClockWindow, ExposeWindow|UnmapWindow);
417:
418: /*
419: * Map clock window to screen.
420: */
421: XMapWindow(ClockWindow);
422:
423: /*
424: * Initialize the select system call's maximum file
425: * descriptor number to be one more than the file descriptor
426: * number of the X connection.
427: */
428: maxfds = dpyno() + 1;
429:
430: /*
431: * Initialize the select timeout structure.
432: */
433: timeout.tv_sec = update;
434: timeout.tv_usec = 0;
435:
436: /*
437: * Initialize the old-time structure.
438: */
439: otm = *localtime(&time_value);
440:
441: /*
442: * Synchronize X before proceeding.
443: */
444: XSync(FALSE);
445:
446: /*
447: * Main clock loop.
448: */
449: while (TRUE) {
450: time(&time_value);
451: tm = *localtime(&time_value);
452: if (even_update) {
453: /* Truncate to update interval, get new timeout */
454: timeout.tv_sec = update - tm.tm_sec;
455: tm.tm_sec = (tm.tm_sec / update) * update;
456: timeout.tv_sec += tm.tm_sec;
457: }
458: if (AnalogClock == FALSE) {
459: /*
460: * See if there are any events pending that
461: * arn't supposed to be there.
462: */
463: if (XPending() != 0) {
464: /*
465: * There is an event pending so we must
466: * check to see if it is an ExposeWindow
467: * event, if it is anything else somthing
468: * went wrong!
469: */
470: XNextEvent(&event);
471: if (event.type == UnmapWindow) {
472: XPeekEvent(&event);
473: continue;
474: }
475: if (event.type != ExposeWindow) {
476: XClockError("Unexpected X_Event (digital mode)");
477: }
478: }
479: time_ptr = asctime(&tm);
480: time_ptr[strlen(time_ptr) - 1] = 0;
481: XTextPad (
482: ClockWindow,
483: padding, padding,
484: time_ptr, strlen(time_ptr),
485: font, 0, 0,
486: FrgrndColor, BkgrndColor,
487: GXcopy, AllPlanes
488: );
489: }
490: else {
491: /*
492: * Look for an X_Event associated with xclock.
493: */
494: if (XPending() != 0) {
495: /*
496: * There is an event pending so we must
497: * check to see if it is an ExposeWindow
498: * event, if it is anything else, somthing
499: * went wrong!
500: */
501: XNextEvent(&event);
502: if (event.type == UnmapWindow) {
503: XPeekEvent(&event);
504: continue;
505: }
506: if (event.type == ExposeWindow) {
507: /*
508: * Ok, we have a window exposure event,
509: * refresh the clock face. Check to
510: * see if the window has changed size.
511: */
512: XExposeWindowEvent *exp_event = (XExposeWindowEvent *)&event;
513: if ((exp_event->width != win_width) ||
514: (exp_event->height != win_height)) {
515: win_width = exp_event->width;
516: win_height = exp_event->height;
517: radius = (min(win_width, win_height) -(2 * padding)) / 2;
518: second_hand_length =
519: ((SECOND_HAND_FRACT *
520: radius)
521: / 100);
522: minute_hand_length =
523: ((MINUTE_HAND_FRACT *
524: radius) / 100);
525: hour_hand_length =
526: ((HOUR_HAND_FRACT *
527: radius) / 100);
528: CenterX = win_width / 2;
529: CenterY = win_height / 2;
530: }
531: DrawClockFace(second_hand_length,
532: radius);
533: }
534: else {
535: /*
536: * We should never get here!
537: */
538: XClockError("Unexpected X_Event (analog mode)");
539: }
540: }
541: /*
542: * The second (or minute) hand is sec (or min)
543: * sixtieths around the clock face. The hour hand is
544: * (hour + min/60) twelfths of the way around the
545: * clock-face. The derivation is left as an excercise
546: * for the reader.
547: */
548:
549: /*
550: * Erase old hands.
551: */
552: if (ShowSecondHand == TRUE) {
553: DrawHand(1, second_hand_length,
554: ((double) otm.tm_sec)/60.0);
555: }
556: DrawHand(1, minute_hand_length,
557: ((double) otm.tm_min)/60.0);
558: DrawHand(1, hour_hand_length,
559: (((double)otm.tm_hour) +
560: (((double)otm.tm_min)/60.0))/12.0);
561: Sync(BkgrndColor);
562:
563: /*
564: * 12 hour clock.
565: */
566: if(tm.tm_hour > 12)
567: tm.tm_hour -= 12;
568:
569: /*
570: * Draw new hands.
571: */
572: if (ShowSecondHand == TRUE) {
573: DrawHand(1, second_hand_length,
574: ((double) tm.tm_sec)/60.0);
575: }
576: DrawHand(1, minute_hand_length,
577: ((double) tm.tm_min)/60.0);
578: DrawHand(1, hour_hand_length,
579: (((double) tm.tm_hour) +
580: (((double) tm.tm_min)/60.0))/12.0);
581: Sync(HighColor);
582:
583: /*
584: * Make the new time now be the old time.
585: */
586: otm = tm;
587: }
588: XFlush ();
589:
590: /*
591: * Use the select system call on the file descriptor in
592: * the display structure to determine if there is work
593: * to be done. If not block untill timeout. Remember to
594: * reset the file descriptor before each select.
595: */
596: readfds = 1 << dpyno();
597: if (select(maxfds, &readfds, NULL, NULL, &timeout) == -1)
598: XClockError("Error in select on display file descriptor");
599: }
600: }
601:
602:
603: /*
604: * DrawHand - Draws (or erases) a hand. Fraction_of_a_circle is a
605: * fraction between 0 and 1 (inclusive) indicating how far around the
606: * circle (clockwise) high noon.
607: *
608: * Blank_length is the distance from the center which the hand begins
609: * (logically 0, but I have the feature, I might as well use it).
610: * length is the maximum length of the hand.
611: *
612: * The blank_length feature is because I wanted to draw tick-marks around the
613: * circle (for seconds). The obvious means of drawing lines from the center
614: * to the perimeter, then erasing all but the outside most pixels doesn't
615: * work because of round-off error (sigh).
616: */
617: DrawHand(blank_length, length, fraction_of_a_circle)
618: int blank_length;
619: int length;
620: double fraction_of_a_circle;
621: {
622:
623: double cos();
624: double sin();
625: double angle;
626:
627: /*
628: * A full circle is 2 PI radians.
629: * Angles are measured from 6 o'clock, not noon (or so it seems).
630: * Thus, when fraction_of_a_circle is 0, we want angle to be PI,
631: * and when fraction_of_a_circle is 1, we want angle to be 3 PI.
632: *
633: * Also, angles increase counter-clockwise, not clockwise, so we
634: * throw in a factor of -1 so our clock doesn't run backwards.
635: */
636: angle = (-2 * PI * fraction_of_a_circle) + PI;
637:
638: /*
639: * Add the move instruction to the segment buffer and increment
640: * the "next" pointer.
641: */
642: SegBuffPtr->x = CenterX + (int)((float)blank_length * sin(angle));
643: SegBuffPtr->y = CenterY + (int)((float)blank_length * cos(angle));
644: SegBuffPtr->flags = VertexDontDraw;
645: SegBuffPtr++;
646: NumSegs++;
647:
648: /*
649: * Add the new point to the buffer and increment the "next" pointer.
650: */
651: SegBuffPtr->x = CenterX + (int)((float)length * sin(angle));
652: SegBuffPtr->y = CenterY + (int)((float)length * cos(angle));
653: SegBuffPtr->flags = VertexDrawLastPoint;
654: SegBuffPtr++;
655: NumSegs++;
656: }
657:
658:
659: /*
660: * Draw the clock face (every fifth tick-mark is longer
661: * than the others).
662: */
663: DrawClockFace(second_hand, radius)
664: int second_hand;
665: int radius;
666: {
667: register Bool debug = XClockDebug;
668: register int i;
669: register int delta = (radius - second_hand) / 3;
670:
671: XClear(ClockWindow);
672: for (i = 0; i < 60; i++) {
673: if ((i % 5) == 0) {
674: DrawHand(second_hand, radius, ((double) i)/60.);
675: }
676: else {
677: DrawHand((radius - delta), radius, ((double) i)/60.);
678: }
679: }
680: /*
681: * Flush the buffer to the VS100.
682: */
683: Sync(FrgrndColor);
684: }
685:
686:
687: /*
688: * This routine synchronizes the segment buffer contents with the
689: * VS100 screen. In effect, it flushes the buffer contents to the
690: * screen.
691: */
692: Sync(color)
693: int color; /* X drawing color. */
694: {
695: register Bool debug = XClockDebug;
696:
697: /*
698: * Call the X draw curve routine.
699: */
700: XDraw(
701: ClockWindow,
702: SegBuff, NumSegs,
703: DEF_VECTOR_WIDTH, DEF_VECTOR_HEIGHT,
704: color, GXcopy, AllPlanes
705: );
706:
707: /*
708: * Reset the segment buffer pointer and the segment counter.
709: */
710: SegBuffPtr = SegBuff;
711: NumSegs = 0;
712: }
713:
714:
715:
716: /*
717: * Report the syntax for calling xclock.
718: */
719: Syntax(call)
720: char *call;
721: {
722: printf ("Usage: %s [-analog] [-bw <pixels>] [-digital]\n", call);
723: printf (" [-fg <color>] [-bg <color>] [-hl <color>] [-bd <color>]\n");
724: printf (" [-fn <font_name>] [-help] [-padding <pixels>]\n");
725: printf (" [-rv] [-update <seconds>] [[<host>]:[<vs>]]\n");
726: printf (" [=[<width>][x<height>][<+-><xoff>[<+-><yoff>]]]\n\n");
727: printf ("Default: %s -digital -bw %d -font %s -padding %d -update %d =-0-0\n\n",
728: call, DEF_BORDER, DEF_DIGITAL_FONT, DEF_DIGITAL_PADDING, DEF_UPDATE);
729: printf ("Default: %s -analog -bw %d -padding %d -update %d =%dx%d-0-0\n\n",
730: call, DEF_BORDER, DEF_DIGITAL_PADDING, DEF_UPDATE,
731: DEF_ANALOG_WIDTH, DEF_ANALOG_HEIGHT);
732: printf ("Notes: The order in which switches are specified is not significant.\n");
733: printf (" In analog mode the second hand only appears for update times\n");
734: printf (" less than or equal to %d seconds.\n", SECOND_HAND_TIME);
735: exit(0);
736: }
737:
738:
739: /*
740: * XClockError - Fatal xclock error.
741: */
742: XClockError (identifier)
743: char *identifier;
744: {
745: register Bool debug = XClockDebug;
746:
747: if (debug) printf("XClockError: Fatal xclock error encountered.\n");
748: perror("xclock");
749: fprintf(stderr, "xclock: %s\n", identifier);
750:
751: exit(1);
752: }
753:
754: /*
755: * End of xclock.c
756: */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.