|
|
1.1 root 1: /* Copyright 1987, Massachusetts Institute of Technology */
2:
3: #include <X11/Xlib.h>
4: #include <X11/Xutil.h>
5: #include <stdio.h>
6:
7: /*
8: * xsetroot.c MIT Project Athena, X Window system root window
9: * parameter setting utility. This program will set
10: * various parameters of the X root window.
11: *
12: * Author: Mark Lillibridge, MIT Project Athena
13: * 11-Jun-87
14: */
15:
16: /* Include routines to handle parsing defaults */
17: #include "wsimple.h"
18:
19: #include "X11/bitmaps/gray"
20:
21: usage()
22: {
23: outl("%s: usage: %s [-fg <color>] [-bg <color>] [-rv] [-help] [-def] [-name <string>] [-cursor <cursor file> <mask file>] [-solid <color>] [-gray] [-grey] [-bitmap <filename>] [-mod <x> <y>] [<host>:<display>]\n\nNOTE: *** Use only one of -solid, -gray, -grey, -bitmap, and -mod ***\n\n", program_name, program_name);
24: exit(1);
25: }
26:
27: extern Pixmap MakeModulaBitmap();
28:
29: main(argc, argv)
30: int argc;
31: char **argv;
32: {
33: int excl = 0;
34: int restore_defaults = 0;
35: char *name = 0;
36: char *cursor_file = 0;
37: char *cursor_mask = 0;
38: Cursor cursor;
39: char *solid_color = 0;
40: int gray = 0;
41: char *bitmap_file = 0;
42: int mod_x = -1;
43: int mod_y = -1;
44: register int i;
45: Pixmap bitmap;
46: int ww, hh;
47:
48: INIT_NAME;
49:
50: /* Handle command line arguments, open the display */
51: Get_X_Options(&argc, argv);
52:
53: for (i = 1; i < argc; i++) {
54: if (!strcmp("-", argv[i]))
55: continue;
56: if (!strcmp("-help", argv[i]))
57: usage();
58: if (!strcmp("-def", argv[i])) {
59: restore_defaults = 1;
60: continue;
61: }
62: if (!strcmp("-name", argv[i])) {
63: if (++i>=argc) usage();
64: name = argv[i];
65: continue;
66: }
67: if (!strcmp("-cursor", argv[i])) {
68: if (i++>=argc) usage();
69: cursor_file = argv[i];
70: if (i++>=argc) usage();
71: cursor_mask = argv[i];
72: continue;
73: }
74: if (!strcmp("-solid", argv[i])) {
75: if (i++>=argc) usage();
76: solid_color = argv[i];
77: excl++;
78: continue;
79: }
80: if (!strcmp("-gray", argv[i]) || !strcmp("-grey", argv[i])) {
81: gray = 1;
82: excl++;
83: continue;
84: }
85: if (!strcmp("-bitmap", argv[i])) {
86: if (++i>=argc) usage();
87: bitmap_file = argv[i];
88: excl++;
89: continue;
90: }
91: if (!strcmp("-mod", argv[i])) {
92: if (++i>=argc) usage();
93: mod_x = atoi(argv[i]);
94: if (++i>=argc) usage();
95: mod_y = atoi(argv[i]);
96: excl++;
97: continue;
98: }
99: usage();
100: }
101:
102: /* Check for multiple use of exclusive options */
103: if (excl > 1)
104: usage();
105:
106: /* If there are no arguments then restore defaults. */
107: if (argc == 1 || (argc == 2 && !strcmp(argv[1],"-")))
108: restore_defaults = 1;
109:
110: /* Resolve the X options */
111: Resolve_X_Options();
112:
113: /* Handle a cursor file */
114: if (cursor_file) {
115: cursor = CreateCursorFromFiles(cursor_file, cursor_mask, fore_color,
116: back_color);
117:
118: XDefineCursor(dpy, RootWindow(dpy, screen), cursor);
119:
120: XFreeCursor(dpy, cursor);
121: }
122:
123: /* Handle -gray and -grey options */
124: if (gray)
125: SetBackgroundToData(gray_bits, gray_width, gray_height);
126:
127: /* Handle -solid option */
128: if (solid_color)
129: XSetWindowBackground(dpy, RootWindow(dpy, screen),
130: Resolve_Color(RootWindow(dpy, screen),
131: solid_color));
132:
133: /* Handle -bitmap option */
134: if (bitmap_file) {
135: bitmap = ReadBitmapFile(RootWindow(dpy, screen), bitmap_file,
136: &ww, &hh, 0, 0);
137: SetBackgroundToBitmap(bitmap, ww, hh);
138: }
139:
140: /* Handle set background to a modula pattern */
141: if (mod_x != -1)
142: SetBackgroundToBitmap(MakeModulaBitmap(mod_x, mod_y), 16, 16);
143:
144: /* Handle set name */
145: if (name)
146: XStoreName(dpy, RootWindow(dpy, screen), name);
147:
148: /* Handle restore defaults */
149: if (restore_defaults) {
150: if (!cursor_file)
151: XUndefineCursor(dpy, RootWindow(dpy, screen));
152: if (!excl)
153: XSetWindowBackgroundPixmap(dpy, RootWindow(dpy, screen), (Pixmap) 0);
154: }
155:
156: /* Clear the root window, flush all output and exit. */
157: XClearWindow(dpy, RootWindow(dpy, screen));
158: XCloseDisplay(dpy);
159: }
160:
161:
162: /*
163: * SetBackgroundToBitmap: Set the root window background to a caller supplied
164: * bitmap.
165: */
166: SetBackgroundToBitmap(bitmap, width, height)
167: Pixmap bitmap;
168: int width, height;
169: {
170: Pixmap pix;
171: GC gc;
172: XGCValues gc_init;
173: long temp;
174:
175: gc_init.foreground = Resolve_Color(RootWindow(dpy,screen),fore_color);
176: gc_init.background = Resolve_Color(RootWindow(dpy,screen),back_color);
177: if (reverse) {
178: temp=gc_init.foreground;
179: gc_init.foreground=gc_init.background;
180: gc_init.background=temp;
181: }
182: gc = XCreateGC(dpy, RootWindow(dpy, screen),GCForeground|GCBackground,
183: &gc_init);
184:
185: pix = Bitmap_To_Pixmap(dpy, RootWindow(dpy, screen), gc, bitmap,
186: width, height);
187:
188: XSetWindowBackgroundPixmap(dpy, RootWindow(dpy, screen), pix);
189: }
190:
191:
192: /*
193: * SetBackgroundToData: As SetBackgroundToBitmap but uses the data for
194: * a bitmap instead of an actual bitmap. Data format
195: * is that used by XCreateBitmapFromData.
196: */
197: SetBackgroundToData(data, width, height)
198: char *data;
199: int width, height;
200: {
201: Pixmap bitmap;
202:
203: bitmap = XCreateBitmapFromData(dpy, RootWindow(dpy, screen),
204: data, width, height);
205:
206: SetBackgroundToBitmap(bitmap, width, height);
207: }
208:
209:
210: /*
211: * CreateCursorFromFiles: make a cursor of the right colors from two bitmap
212: * files.
213: */
214: #define BITMAP_HOT_DEFAULT 8
215:
216: CreateCursorFromFiles(cursor_file, mask_file, fore_color, back_color)
217: char *cursor_file, *mask_file;
218: char *fore_color, *back_color;
219: {
220: Pixmap cursor_bitmap, mask_bitmap;
221: int width, height, ww, hh, x_hot, y_hot;
222: Cursor cursor;
223: XColor fg, bg, temp, NameToXColor();
224:
225: fg = NameToXColor(fore_color);
226: bg = NameToXColor(back_color);
227: if (reverse) {
228: temp = fg; fg = bg; bg = temp;
229: }
230:
231: cursor_bitmap = ReadBitmapFile(RootWindow(dpy, screen),
232: cursor_file, &width, &height,
233: &x_hot, &y_hot);
234: mask_bitmap = ReadBitmapFile(RootWindow(dpy, screen), mask_file,
235: &ww, &hh, 0, 0);
236:
237: if (width != ww || height != hh)
238: Fatal_Error("Dimensions of cursor bitmap and cursor mask bitmap are different!");
239:
240: if (x_hot == -1) {
241: x_hot = BITMAP_HOT_DEFAULT;
242: y_hot = BITMAP_HOT_DEFAULT;
243: }
244:
245: cursor = XCreatePixmapCursor(dpy, cursor_bitmap, mask_bitmap, &fg, &bg,
246: x_hot, y_hot);
247:
248: return(cursor);
249: }
250:
251:
252: /*
253: * MakeModulaBitmap: Returns a modula bitmap based on an x & y mod.
254: */
255: Pixmap MakeModulaBitmap(mod_x, mod_y)
256: int mod_x, mod_y;
257: {
258: int i;
259: long pattern_line = 0;
260: char modula_data[16*16/8];
261:
262: if (mod_x<1)
263: mod_x=1;
264: if (mod_y<1)
265: mod_y=1;
266:
267: for (i=0; i<16; i++) {
268: pattern_line <<=1;
269: if (i % mod_x == 0) pattern_line |= 0x0001;
270: }
271: for (i=0; i<16; i++) {
272: if (i % mod_y) {
273: modula_data[i*2] = 0xff;
274: modula_data[i*2+1] = 0xff;
275: } else {
276: modula_data[i*2] = pattern_line & 0xff;
277: modula_data[i*2+1] = (pattern_line>>8) & 0xff;
278: }
279: }
280:
281:
282: return(XCreateBitmapFromData(dpy, RootWindow(dpy, screen), modula_data,
283: 16, 16));
284: }
285:
286:
287: /*
288: * NameToXColor: Convert the name of a color to its Xcolor value.
289: */
290: XColor NameToXColor(name)
291: char *name;
292: {
293: XColor c;
294: Colormap cmap;
295:
296: cmap = DefaultColormap(dpy, screen);
297:
298: if (!XParseColor(dpy, cmap, name, &c))
299: Fatal_Error("unknown color or bad color format: %s", name);
300:
301: return(c);
302: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.