Annotation of 43BSDTahoe/new/X/xclock/xclock.c, revision 1.1

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:  */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.