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