|
|
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 */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.