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