Annotation of 43BSD/contrib/X/xsetroot/xsetroot.c, revision 1.1

1.1     ! root        1: #include <X/mit-copyright.h>
        !             2: 
        !             3: /* Copyright 1985 Massachusetts Institute of Technology */
        !             4: 
        !             5: /*
        !             6:  * xsetroot.c  MIT Project Athena, X Window system root window 
        !             7:  *             parameter setting utility.  This program will set 
        !             8:  *             various parameters of the X root window.
        !             9:  *
        !            10:  *  Author:    Tony Della Fera, DEC
        !            11:  *             28-Nov-84
        !            12:  */
        !            13: #ifndef lint
        !            14: static char *rcsid_xsetroot_c = "$Header: xsetroot.c,v 10.8 86/02/01 16:16:52 tony Rel $";
        !            15: #endif
        !            16: 
        !            17: #include <X/Xlib.h>
        !            18: #include <strings.h>
        !            19: #define NULL 0
        !            20: 
        !            21: #define MAX(a, b) (a) > (b) ? (a) : (b)
        !            22: #define MIN(a, b) (a) < (b) ? (a) : (b)
        !            23: #define ABS(a) (a) < 0 ? -(a) : (a)
        !            24: 
        !            25: #define DEF_MSE_COLOR          BlackPixel
        !            26: #define DEF_SOLID_COLOR                WhitePixel
        !            27: #define DEF_FG_COLOR           BlackPixel
        !            28: #define DEF_BG_COLOR           WhitePixel
        !            29: #define DEF_ROOT_NAME          " X Root Window "
        !            30: 
        !            31: #define BITMAP_SIZE            16
        !            32: #define BITMAP_HOT             8
        !            33: 
        !            34: #define FAILURE                        0
        !            35: 
        !            36: typedef enum bool {FALSE, TRUE} bool;
        !            37: 
        !            38: static unsigned short solid_line = 0xffff;
        !            39: 
        !            40: static short gray_bits[BITMAP_SIZE] = {
        !            41:     0xaaaa, 0x5555, 0xaaaa, 0x5555,
        !            42:     0xaaaa, 0x5555, 0xaaaa, 0x5555,
        !            43:     0xaaaa, 0x5555, 0xaaaa, 0x5555,
        !            44:     0xaaaa, 0x5555, 0xaaaa, 0x5555
        !            45: };
        !            46: 
        !            47: main(argc, argv)
        !            48:     int argc;
        !            49:     char **argv;
        !            50: {
        !            51:     register int i;
        !            52:     register int x;
        !            53:     register int y;
        !            54:     register unsigned short pattern_line = 0;
        !            55:     int mse = DEF_MSE_COLOR;
        !            56:     int solid = DEF_SOLID_COLOR;
        !            57:     int fg = DEF_FG_COLOR;
        !            58:     int bg = DEF_BG_COLOR;
        !            59:     int width;
        !            60:     int height;
        !            61:     int x_hot;
        !            62:     int y_hot;
        !            63:     int xmod;
        !            64:     int ymod;
        !            65:     char *def_val;
        !            66:     char *strind;
        !            67:     char *root_name;
        !            68:     char *cursor_fname;
        !            69:     char *mask_fname;
        !            70:     char *bitmap_fname;
        !            71:     char *mse_name = NULL;
        !            72:     char *solid_name = NULL;
        !            73:     char *fg_name = NULL;
        !            74:     char *bg_name = NULL;
        !            75:     char display[40];
        !            76:     bool def_sw = FALSE;
        !            77:     bool name_sw = FALSE;
        !            78:     bool cursor_sw = FALSE;
        !            79:     bool solid_sw = FALSE;
        !            80:     bool invert_sw = FALSE;
        !            81:     bool gray_sw = FALSE;
        !            82:     bool bitmap_sw = FALSE;
        !            83:     bool mod_sw = FALSE;
        !            84: 
        !            85:     short *cursor_bits;
        !            86:     short *mask_bits;
        !            87:     short *bkgnd_bits;
        !            88: 
        !            89:     Color color_def;
        !            90:     Cursor cursor;
        !            91:     Bitmap bkgnd_bitmap;
        !            92:     Pixmap bkgnd_pixmap;
        !            93: 
        !            94:     display[0] = '\0';
        !            95:     
        !            96:     /*
        !            97:      * Get X defaults.
        !            98:      */
        !            99:     def_val = XGetDefault(argv[0], "Foreground");
        !           100:     fg_name = def_val;
        !           101: 
        !           102:     def_val = XGetDefault(argv[0], "Background");
        !           103:     bg_name = def_val;
        !           104: 
        !           105:     def_val = XGetDefault(argv[0], "Mouse");
        !           106:     mse_name = def_val;
        !           107: 
        !           108:     /*
        !           109:      * Parse argument list.
        !           110:      */
        !           111:     for (i = 1; i < argc; i++) {
        !           112:         strind = index(argv[i], ':');
        !           113:         if(strind != NULL) {
        !           114:             (void) strncpy(display, argv[i], sizeof(display));
        !           115:            if (argc == 2) def_sw = TRUE;
        !           116:             continue;
        !           117:         }
        !           118:         strind = index (argv[i], '-');
        !           119:         if (strind == NULL) Syntax(argv[0]);
        !           120:         if (strncmp(argv[i], "-help", 5) == 0) {
        !           121:             Syntax(argv[0]);
        !           122:         }
        !           123:         if (strncmp(argv[i], "-def", 4) == 0) {
        !           124:            def_sw = TRUE;
        !           125:            continue;
        !           126:         }
        !           127:         if (strncmp(argv[i], "-fg", 3) == 0) {
        !           128:             if (++i >= argc) Syntax(argv[0]);
        !           129:            fg_name = argv[i];
        !           130:            continue;
        !           131:        }
        !           132:         if (strncmp(argv[i], "-bg", 3) == 0) {
        !           133:             if (++i >= argc) Syntax(argv[0]);
        !           134:            bg_name = argv[i];
        !           135:            continue;
        !           136:        }
        !           137:         if (strncmp(argv[i], "-invert", 7) == 0) {
        !           138:            invert_sw = TRUE;
        !           139:            continue;
        !           140:        }
        !           141:         if (strncmp(argv[i], "-name", 5) == 0) {
        !           142:            if (++i >= argc) Syntax(argv[0]);
        !           143:             root_name = argv[i];
        !           144:            name_sw = TRUE;
        !           145:             continue;
        !           146:         }
        !           147:        if (strncmp(argv[i], "-cursor", 7) == 0) {
        !           148:             if (++i >= argc) Syntax(argv[0]);
        !           149:            cursor_fname = argv[i];
        !           150:             if (++i >= argc) Syntax(argv[0]);
        !           151:            mask_fname = argv[i];
        !           152:            cursor_sw = TRUE;
        !           153:            continue;
        !           154:        }
        !           155:        if (strncmp(argv[i], "-solid", 6) == 0) {
        !           156:            if (
        !           157:                gray_sw == TRUE ||
        !           158:                bitmap_sw == TRUE ||
        !           159:                mod_sw == TRUE
        !           160:            ) Syntax(argv[0]);
        !           161:             if (++i >= argc) Syntax(argv[0]);
        !           162:            solid_name = argv[i];
        !           163:            solid_sw = TRUE;
        !           164:            continue;
        !           165:        }
        !           166:        if (
        !           167:            (strncmp(argv[i], "-gray", 5) == 0) ||
        !           168:            (strncmp(argv[i], "-grey", 5) == 0)
        !           169:        ){
        !           170:            if (
        !           171:                solid_sw == TRUE ||
        !           172:                bitmap_sw == TRUE ||
        !           173:                mod_sw == TRUE
        !           174:            ) Syntax(argv[0]);
        !           175:            gray_sw = TRUE;
        !           176:            continue;
        !           177:        }
        !           178:        if (strncmp(argv[i], "-bitmap", 7) == 0) {
        !           179:            if (
        !           180:                gray_sw == TRUE ||
        !           181:                solid_sw == TRUE ||
        !           182:                mod_sw == TRUE
        !           183:            ) Syntax(argv[0]);
        !           184:             if (++i >= argc) Syntax(argv[0]);
        !           185:            bitmap_fname = argv[i];
        !           186:            bitmap_sw = TRUE;
        !           187:            continue;
        !           188:        }
        !           189:         if (strncmp(argv[i], "-mod", 5) == 0) {
        !           190:            if (
        !           191:                gray_sw == TRUE ||
        !           192:                bitmap_sw == TRUE ||
        !           193:                solid_sw == TRUE
        !           194:            ) Syntax(argv[0]);
        !           195:             if (++i >= argc) Syntax(argv[0]);
        !           196:             xmod = atoi(argv[i]);
        !           197:             if (++i >= argc) Syntax(argv[0]);
        !           198:             ymod = atoi(argv[i]);
        !           199:            mod_sw = TRUE;
        !           200:             continue;
        !           201:         }
        !           202:         Syntax(argv[0]);
        !           203:     }
        !           204:     
        !           205:     /*
        !           206:      * If there are no arguments then restore defaults.
        !           207:      */
        !           208:     if (argc == 1) def_sw = TRUE;
        !           209: 
        !           210:     /*
        !           211:      * Open the display.
        !           212:      */
        !           213:     if (XOpenDisplay(display) == NULL) Error("Unable to open display");
        !           214: 
        !           215:     /*
        !           216:      * Parse color definintions.
        !           217:      */
        !           218:     if ((DisplayCells() > 2) && (solid_name != NULL)) {
        !           219:        if (
        !           220:            XParseColor(solid_name, &color_def) &&
        !           221:            XGetHardwareColor(&color_def)
        !           222:        ) solid = color_def.pixel;
        !           223:     }
        !           224:     else if (solid_name && strcmp(solid_name, "black") == 0) solid = BlackPixel;
        !           225:     else if (solid_name && strcmp(solid_name, "white") == 0) solid = WhitePixel;
        !           226: 
        !           227:     if ((DisplayCells() > 2) && (fg_name != NULL)) {
        !           228:        if (
        !           229:            XParseColor(fg_name, &color_def) &&
        !           230:            XGetHardwareColor(&color_def)
        !           231:        ) fg = color_def.pixel;
        !           232:     }
        !           233:     else if (solid_name && strcmp(fg_name, "black") == 0) fg = BlackPixel;
        !           234:     else if (solid_name && strcmp(fg_name, "white") == 0) fg = WhitePixel;
        !           235: 
        !           236:     if ((DisplayCells() > 2) && (bg_name != NULL)) {
        !           237:        if (
        !           238:            XParseColor(bg_name, &color_def) &&
        !           239:            XGetHardwareColor(&color_def)
        !           240:        ) bg = color_def.pixel;
        !           241:     }
        !           242:     else if (bg_name && strcmp(bg_name, "black") == 0) bg = BlackPixel;
        !           243:     else if (bg_name && strcmp(bg_name, "white") == 0) bg = WhitePixel;
        !           244: 
        !           245:     if ((DisplayCells() > 2) && (mse_name != NULL)) {
        !           246:        if (
        !           247:            XParseColor(mse_name, &color_def) &&
        !           248:            XGetHardwareColor(&color_def)
        !           249:        ) mse = color_def.pixel;
        !           250:     }
        !           251:     else if (mse_name && strcmp(mse_name, "black") == 0) mse = BlackPixel;
        !           252:     else if (mse_name && strcmp(mse_name, "white") == 0) mse = WhitePixel;
        !           253: 
        !           254:     /*
        !           255:      * Set the root window name if a new root name supplied.
        !           256:      */
        !           257:     if (name_sw == TRUE) XStoreName(RootWindow, root_name);
        !           258: 
        !           259:     /*
        !           260:      * Set cursor if a cursor is supplied.
        !           261:      */
        !           262:     if (cursor_sw == TRUE) {
        !           263:        int status;
        !           264:        /*
        !           265:         * Open and read the mask file.
        !           266:         */
        !           267:        status = XReadBitmapFile(
        !           268:            mask_fname, 
        !           269:            &width, &height, &mask_bits,
        !           270:            NULL, NULL
        !           271:        );
        !           272:        if (status == 0) Error ("Unable to open mask file");
        !           273:        else if (status < 0) Error ("Unable to parse mask file");
        !           274:        else if ((width != BITMAP_SIZE) || (height != BITMAP_SIZE))
        !           275:            Error("Invaild mask Bitmap size");
        !           276:        /*
        !           277:         * Open and read the cursor file.
        !           278:         */
        !           279:        status = XReadBitmapFile(
        !           280:            cursor_fname,
        !           281:            &width, &height, &cursor_bits,
        !           282:            &x_hot, &y_hot
        !           283:        );
        !           284:        if (status == 0) Error ("Unable to open cursor file");
        !           285:        else if (status < 0) Error("Unable to parse cursor file");
        !           286:        else if ((width != BITMAP_SIZE) || (height != BITMAP_SIZE))
        !           287:            Error("Invaild cursor Bitmap size");
        !           288:        
        !           289: 
        !           290:        /*
        !           291:         * If there is no hot spot defined  or if the one defined is
        !           292:         * invalid, place the hot spot at BITMAP_HOT.
        !           293:         */
        !           294:        if (
        !           295:            (x_hot >= BITMAP_SIZE) || (x_hot < 0)
        !           296:        ){
        !           297:            x_hot = BITMAP_HOT;
        !           298:        }
        !           299:        if (
        !           300:            (y_hot >= BITMAP_SIZE) || (y_hot < 0)
        !           301:        ){
        !           302:            y_hot = BITMAP_HOT;
        !           303:        }
        !           304:        
        !           305:        /*
        !           306:         * Create the cursor.
        !           307:         */
        !           308:        cursor = XCreateCursor(
        !           309:            width, height,
        !           310:            cursor_bits, mask_bits,
        !           311:            x_hot, y_hot,
        !           312:            mse, bg,
        !           313:            GXcopy
        !           314:        );
        !           315:        if (cursor == FAILURE) Error("Unable to store cursor");
        !           316: 
        !           317:        /*
        !           318:         * Define the root window's cursor to be the new
        !           319:         * cursor.
        !           320:         */
        !           321:        XDefineCursor(RootWindow, cursor);
        !           322:     }
        !           323: 
        !           324:     /*
        !           325:      * Set background to a solid color if requested.
        !           326:      */
        !           327:     if (solid_sw == TRUE) {
        !           328:        /*
        !           329:         * Create the tile Pixmap.
        !           330:         */
        !           331:        bkgnd_pixmap = XMakeTile(solid);
        !           332:        if (bkgnd_pixmap == FAILURE) Error("Unable to store solid Pixmap");
        !           333:        /*
        !           334:         * Change the window.
        !           335:         */
        !           336:        XChangeBackground(RootWindow, bkgnd_pixmap);
        !           337:        Done();
        !           338:     }
        !           339:        
        !           340:     /*
        !           341:      * Set background to a gray pattern if requested.
        !           342:      */
        !           343:     if (gray_sw == TRUE) {
        !           344:        /*
        !           345:         * Create the Bitmap.
        !           346:         */
        !           347:        bkgnd_bitmap = XStoreBitmap(BITMAP_SIZE, BITMAP_SIZE, gray_bits);
        !           348:        if (bkgnd_bitmap == FAILURE) Error("Unable to store gray Bitmap");
        !           349:        /*
        !           350:         * Create the tile Pixmap.
        !           351:         */
        !           352:        if (invert_sw == TRUE) {
        !           353:            bkgnd_pixmap = XMakePixmap(bkgnd_bitmap, bg, fg);
        !           354:        }
        !           355:        else {
        !           356:            bkgnd_pixmap = XMakePixmap(bkgnd_bitmap, fg, bg);
        !           357:        }
        !           358:        if (bkgnd_pixmap == FAILURE) Error("Unable to store gray Pixmap");
        !           359:        /*
        !           360:         * Change the window.
        !           361:         */
        !           362:        XChangeBackground(RootWindow, bkgnd_pixmap);
        !           363:        Done();
        !           364:     }
        !           365:        
        !           366:     /*
        !           367:      * Set background to a bitmap pattern if requested.
        !           368:      */
        !           369:     if (bitmap_sw == TRUE) {
        !           370:        int status;
        !           371:        /*
        !           372:         * Open and read the bitmap file.
        !           373:         */
        !           374:        status = XReadBitmapFile(
        !           375:            bitmap_fname,
        !           376:            &width, &height, &bkgnd_bits,
        !           377:            &x_hot, &y_hot
        !           378:        );
        !           379:        if (status == 0) Error ("Unable to open Bitmap file");
        !           380:        else if (status < 0) Error("Unable to parse Bitmap file");
        !           381:        else if ((width != BITMAP_SIZE) || (height != BITMAP_SIZE))
        !           382:            Error("Invaild Bitmap size");
        !           383:        bkgnd_bitmap = XStoreBitmap (width, height, bkgnd_bits);
        !           384:        if (bkgnd_bitmap == FAILURE)
        !           385:            Error("Unable to store Bitmap");
        !           386:        
        !           387:        /*
        !           388:         * Create the tile pixmap.
        !           389:         */
        !           390:        if (invert_sw == TRUE) {
        !           391:            bkgnd_pixmap = XMakePixmap(bkgnd_bitmap, bg, fg);
        !           392:        }
        !           393:        else {
        !           394:            bkgnd_pixmap = XMakePixmap(bkgnd_bitmap, fg, bg);
        !           395:        }
        !           396:        if (bkgnd_pixmap == FAILURE) Error("Unable to store Pixmap");
        !           397:        /*
        !           398:         * Change the window.
        !           399:         */
        !           400:        XChangeBackground(RootWindow, bkgnd_pixmap);
        !           401:        Done();
        !           402:     }
        !           403: 
        !           404:     /*
        !           405:      * Set background to a modula pattern if requested.
        !           406:      */
        !           407:     if (mod_sw == TRUE) {
        !           408:        bkgnd_bits = (short *) malloc (BITMAP_SIZE*sizeof(short));
        !           409:        /*
        !           410:         * Compute modula bits.
        !           411:         */
        !           412:        for (x = 0; x < BITMAP_SIZE; x++) {
        !           413:            pattern_line <<= 1;
        !           414:            if (x % xmod == 0) pattern_line |= 0x0001;
        !           415:        }
        !           416:        for (y = 0; y < BITMAP_SIZE; y++) {
        !           417:            if (y % ymod == 0) {
        !           418:                bkgnd_bits[y] = solid_line;
        !           419:            }
        !           420:            else {
        !           421:                bkgnd_bits[y] = pattern_line;
        !           422:            }
        !           423:        }
        !           424:        /*
        !           425:         * Create and store the pattern pixmap.
        !           426:         */
        !           427:        bkgnd_bitmap = XStoreBitmap(BITMAP_SIZE, BITMAP_SIZE, bkgnd_bits);
        !           428:        if (bkgnd_bitmap == FAILURE) Error("Error storing bitmap");
        !           429:        if (invert_sw == TRUE) {
        !           430:            bkgnd_pixmap = XMakePixmap(bkgnd_bitmap, bg, fg);
        !           431:        }
        !           432:        else {
        !           433:            bkgnd_pixmap = XMakePixmap(bkgnd_bitmap, fg, bg);
        !           434:        }
        !           435:        if (bkgnd_pixmap == FAILURE) Error("Error storing pixmap");
        !           436:        XChangeBackground(RootWindow, bkgnd_pixmap);
        !           437:        Done();
        !           438:     }
        !           439: 
        !           440:     /*
        !           441:      * If we got here then check to see if the default switch is on
        !           442:      * OR if there were no arguments.
        !           443:      */
        !           444:     if (def_sw == TRUE) {
        !           445:        if (name_sw == FALSE) XStoreName(RootWindow, DEF_ROOT_NAME);
        !           446:        if (cursor_sw == FALSE) XUndefineCursor(RootWindow);
        !           447:        XChangeBackground(RootWindow, (Pixmap)0);
        !           448:        Done();
        !           449:     }
        !           450:     else XFlush();
        !           451:     exit(0);
        !           452: }
        !           453: 
        !           454: 
        !           455: 
        !           456: /*
        !           457:  * Clear the root window, flush all output and exit.
        !           458:  */
        !           459: Done()
        !           460: {
        !           461:     XClear(RootWindow);
        !           462:     XFlush();
        !           463:     exit(0);
        !           464: }
        !           465: 
        !           466: 
        !           467: 
        !           468: /*
        !           469:  * Report an internal error.
        !           470:  */
        !           471: Error(description)
        !           472:     char *description;
        !           473: {
        !           474:     printf ("\nxsetroot: %s.\n\n", description);
        !           475:     exit(1);
        !           476: }
        !           477: 
        !           478: 
        !           479: 
        !           480: /*
        !           481:  * Report the syntax for calling xsetroot.
        !           482:  */
        !           483: Syntax(call)
        !           484:     char *call;
        !           485: {
        !           486:     printf("\nUsage: %s [-help] [-def] [-fg <color>] [-bg <color>] [-invert]\n", call);
        !           487:     printf("         [-name <string>] [-cursor <cursor file> <mask file>]\n");
        !           488:     printf("         [-solid <color>] [-gray, -grey] [-bitmap <file>]\n");
        !           489:     printf("         [-mod <x> <y>] [[<host>]:<vs>]\n");
        !           490:     printf("\nNOTE: *** Use only one of [-solid] [-gray, -grey] [-bitmap] [-mod] ***\n\n");
        !           491:     exit(1);
        !           492: }
        !           493: 
        !           494: /* End of xsetroot.c */

unix.superglobalmegacorp.com

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