|
|
1.1 root 1: .bp
2: .SH
3: Appendix A - Example X Programs
4: .XS
5: Appendix A - Example X Programs
6: .XE
7: .SH
8: Xrefresh - Refresh the Entire Screen.
9: .PP
10: .IN "Example Programs" "xrefresh"
11: The following program (\fIxrefresh\fP) is the simplest X application to date.
12: It is useful if your screen has gotten trashed,
13: either by a program error
14: (for example, using the \fIRootWindow\fP when you didn't mean to),
15: or by the system putting messages out underneath you.
16: .IN "Examples of Use" "XOpenDisplay"
17: .IN "Examples of Use" "XCreateWindow"
18: .IN "Examples of Use" "XMapWindow"
19: .IN "Examples of Use" "XDestroyWindow"
20: .IN "Examples of Use" "XFlush"
21: .nf
22: .DS
23: .TA .5i 3i
24: .ta .5i 3i
25: .cs R36
26: #include <X/Xlib.h>
27: #include <stdio.h>
28: /*
29: * Copyright 1985, Massachusetts Institute of Technology.
30: * This program just throws up a window over the whole screen, causing
31: * exposure events to be generated on all windows. This may be useful
32: * to cause the whole screen to be repainted when it has somehow gotten
33: * trashed.
34: */
35:
36: main(argc, argv)
37: int argc;
38: char **argv;
39: {
40: Window w;
41:
42: if (XOpenDisplay(argc ? argv[1] : "\\0") == NULL)
43: fprintf (stderr, "Could not open Display!\\n");
44:
45: .IN "Examples of Use" "DisplayWidth"
46: .IN "Examples of Use" "DisplayHeight"
47: .IN "Examples of Use" "BlackPixmap"
48: w = XCreateWindow(RootWindow, 0, 0, DisplayWidth(), DisplayHeight(),
49: 0, (Pixmap) 0, (Pixmap) 0);
50: XMapWindow(w); /* put it up on the screen */
51: XDestroyWindow(w); /* throw it away */
52:
53: XFlush(); /* and make sure the server sees it*/
54: }
55: .cs R
56: .DE
57: .fi
58: .PP
59: In short, \fIxrefresh\fP connects to the display, creates a window with a black
60: background and zero width border over the root window, maps it to
61: the screen, and destroys the window.
62: The side effects of this will be to send exposure events to the client programs
63: who have selected exposure events on all mapped unobscured windows.
64: This causes most clients to repaint their windows.
65: The call to \fIXFlush\fP is necessary since no input call occurs after the
66: \fIXDestroyWindow\fP call to flush the output buffer.
67: Since the background pixmap is 0, the window will be covered with the
68: background pixmap, for a pleasing effect.
69: The most common X programming mistake is to forget to flush the
70: output buffer when first experimenting with X.
71: .SH
72: Xfd - Display a Font in a Window
73: .IN "Example Programs" "xrefresh"
74: .PP
75: The following program is more ambitious, as it parses many
76: arguments and defaults before creating a simple window to paint text in.
77: .nf
78: .DS
79: .TA .5i 1i 1.5i 2i 2.5i 3i 3.5i 4i 4.5i 5i 5.5i 6i 6.5i 7i 7.5i 8i
80: .ta .5i 1i 1.5i 2i 2.5i 3i 3.5i 4i 4.5i 5i 5.5i 6i 6.5i 7i 7.5i 8i
81: .cs R36
82: /* Copyright 1985, Massachusetts Institute of Technology */
83: #include <Xlib/Xlib.h>
84: #include <stdio.h>
85: #include <strings.h>
86:
87: short gray_bits[16] = {
88: 0xaaaa, 0x5555, 0xaaaa, 0x5555,
89: 0xaaaa, 0x5555, 0xaaaa, 0x5555,
90: 0xaaaa, 0x5555, 0xaaaa, 0x5555,
91: 0xaaaa, 0x5555, 0xaaaa, 0x5555};
92:
93:
94: char chars[9];
95: int last_line;
96:
97: main(argc, argv)
98: int argc;
99: char **argv;
100: {
101: Window w; /* window id of the window */
102: FontInfo *fontInfo; /* font to be displayed */
103: int width;
104: char *fontname = "vtsingle";
105: register char *option;
106: char *border_color, *back_color, *fore_color; /* strings */
107: int border_width;
108: int reverse = 0;
109: char *geometry; /* user supplied geometry spec */
110: char def[32]; /* default size */
111: int defwidth, defheight;
112: char display[128];
113: register int i;
114: OpaqueFrame window; /* frame for the window */
115: Pixmap border_pixmap;
116: int background; /* color of background */
117: int foreground; /* color of graph */
118: int highlight; /* color of text, scale */
119: Color cdef; /* color structure */
120: .IN "Examples of Use" "Color"
121:
122: .IN "Examples of Use" "XGetDefault"
123: if ((option = XGetDefault(argv[0],"ReverseVideo")) != NULL )
124: if (strcmp (option, "on") == 0)
125: reverse = 1;
126: if ((option = XGetDefault(argv[0],"BorderWidth")) != NULL)
127: border_width = atoi(option);
128: if ((border_color = XGetDefault(argv[0],"Border")) == NULL)
129: border_color = XGetDefault(argv[0],"BorderColor");
130: back_color = XGetDefault(argv[0],"Background");
131: fore_color = XGetDefault(argv[0],"Foreground");
132: display[0] = '\\0';
133:
134: for (i = 1; i < argc; i++) { /* Parse line */
135: if (argv[i][0] == '=') {
136: geometry = argv[i];
137: continue;
138: }
139: if (index(argv[i], ':') != NULL) { /* host:display */
140: (void)strncpy(display, argv[i], sizeof(display));
141: continue;
142: }
143: if (strcmp(argv[i], "-rv") == 0) { /* black on white */
144: reverse = 1;
145: continue;
146: }
147: if (strcmp(argv[i], "-bw") == 0) { /* border width */
148: if (++i >= argc) usage(argv[0]);
149: border_width = atoi(argv[i]);
150: continue;
151: }
152: if (strcmp(argv[i], "-bd") == 0) { /* border color */
153: if (++i >= argc) usage(argv[0]);
154: border_color = argv[i];
155: continue;
156: }
157: if (strcmp(argv[i], "-fg") == 0) { /* foreground color */
158: if (++i >= argc) usage(argv[0]);
159: fore_color = argv[i];
160: continue;
161: }
162: if (strcmp(argv[i], "-bg") == 0) { /* background color */
163: if (++i >= argc) usage(argv[0]);
164: back_color = argv[i];
165: continue;
166: }
167: if (argv[i][0] == '-') usage (argv[0]);
168: fontname = argv[i];
169: }
170: .IN "Examples of Use" "XOpenDisplay"
171: if (!XOpenDisplay(display)) {
172: fprintf (stderr, "%s: Could not open display %s!\\n", argv[0], display);
173: exit(1);
174: }
175: .IN "Examples of Use" "XOpenFont"
176: if (!(fontInfo = XOpenFont (fontname))) {
177: fprintf (stderr, "%s: Could not open font %s!\\n", argv[0], fontname);
178: exit(1);
179: }
180: last_line = (unsigned char)(fontInfo->lastchar)/8;
181: width = ComputeWidth (fontInfo);
182:
183: /* if DisplayCells are greater than 2, then on color display */
184: .IN "Examples of Use" "XParseColor"
185: .IN "Examples of Use" "XGetHardwareColor"
186: .IN "Examples of Use" "DisplayCells"
187: if (border_color && DisplayCells() > 2 &&
188: XParseColor(border_color, &cdef) && XGetHardwareColor(&cdef))
189: .IN "Examples of Use" "XMakeTile"
190: border_pixmap = XMakeTile(cdef.pixel);
191: else if (border_color && strcmp(border_color, "black") == 0)
192: .IN "Examples of Use" "BlackPixmap"
193: border_pixmap = BlackPixmap;
194: else if (border_color && strcmp(border_color, "white") == 0)
195: .IN "Examples of Use" "WhitePixmap"
196: border_pixmap = WhitePixmap;
197: else
198: .IN "Examples of Use" "XStorePixmap"
199: border_pixmap = XMakePixmap (XStoreBitmap (16, 16, gray_bits),
200: BlackPixel, WhitePixel);
201: .IN "Examples of Use" "WhitePixel"
202: .IN "Examples of Use" "BlackPixel"
203: if (back_color && DisplayCells() > 2 &&
204: XParseColor(back_color, &cdef) && XGetHardwareColor(&cdef)) {
205: background = cdef.pixel;
206: } else if (back_color && strcmp(back_color, "white") == 0) {
207: background = WhitePixel;
208: reverse = 0;
209: } else if (back_color && strcmp(back_color, "black") == 0) {
210: background = BlackPixel;
211: reverse = 0;
212: } else
213: background = BlackPixel;
214:
215: if (fore_color && DisplayCells() > 2 &&
216: XParseColor(fore_color, &cdef) && XGetHardwareColor(&cdef)) {
217: foreground = cdef.pixel;
218: } else if (fore_color && strcmp(fore_color, "black") == 0) {
219: foreground = BlackPixel;
220: reverse = 0;
221: } else if (fore_color && strcmp(fore_color, "white") == 0) {
222: foreground = WhitePixel;
223: reverse = 0;
224: } else
225: foreground = WhitePixel;
226:
227: if (reverse) {
228: highlight = background;
229: background = foreground;
230: foreground = highlight;
231: }
232:
233: .IN "Examples of Use" "XMakeTile"
234: .IN "Examples of Use" "OpaqueFrame"
235: window.bdrwidth = border_width;
236: window.border = border_pixmap;
237: window.background = XMakeTile(background);
238:
239: defwidth = width + 10;
240: defheight = fontInfo->height * (last_line + 1) + 10;
241: (void) sprintf(def, "=%dx%d+300+300", defwidth, defheight);
242: .IN "Examples of Use" "XCreate"
243: w = XCreate ("Font Display", argv[0], geometry, def, &window,
244: defwidth, defheight);
245:
246: if (!w) {
247: fprintf (stderr, "XCreateWindow failed\\n");
248: exit(1);
249: }
250: .IN "Examples of Use" "XSelectInput"
251: XSelectInput (w, ExposeWindow | ButtonPressed);
252: .IN "Examples of Use" "XMapWindow"
253: XMapWindow (w);
254: while (1) {
255: XEvent event;
256: int i, j;
257: .IN "Examples of Use" "XWindowEvent"
258: XWindowEvent (w, ExposeWindow | ButtonPressed, &event);
259: if(event.type == ButtonPressed) exit(0);
260: for (i=0;i<=last_line;i++) {
261: for (j=0;j<8;j++)
262: chars[j] = (char)((8*i)+j);
263: .IN "Examples of Use" "XText"
264: XText (w, 5, 5+(i*fontInfo->height), chars, 8,
265: fontInfo->id, foreground, background);
266: }
267: }
268: }
269:
270: usage (program)
271: char *program;
272: {
273: fprintf(stderr,
274: "usage: %s [host:display] [=geom]
275: [-fw] [-rv] [-bw] [-bd] [-fg] [-bg] fontname\\n", program);
276: exit(1);
277: }
278:
279: ComputeWidth (fontInfo)
280: FontInfo *fontInfo;
281: {
282: int maxwidth, i, j;
283:
284: /* Horrible hack needed for first line because line starts
285: with \\0, and XStringWidth considers \\0 to terminate string */
286: for (j=1;j<8;j++)
287: chars[j] = j;
288: .IN "Examples of Use" "XStringWidth"
289: maxwidth = XStringWidth (&chars[1], fontInfo, 0, 0);
290: /* add the width of the '\\0' character, if it has one */
291: if (fontInfo->firstchar == '\\0')
292: maxwidth += (fontInfo->fixedwidth ?
293: fontInfo->width : fontInfo->widths[0]);
294:
295: /* now measure the width of remaining lines */
296: for (i=1;i<=last_line;i++) {
297: int this_width;
298: for (j=0;j<8;j++)
299: chars[j] = (char)((8*i)+j);
300: this_width = XStringWidth (chars, fontInfo, 0, 0);
301: if (this_width > maxwidth)
302: maxwidth = this_width;
303: }
304: return (maxwidth);
305: }
306: .cs R
307: .DE
308: .fi
309: .PP
310: After parsing all the arguments,
311: the program allocates colors if on a color display for the foreground
312: and background text colors, and the background and border pixmaps.
313: It then creates the window, making sure that it is the right size,
314: and then maps it to the screen.
315: The fact the window was mapped to the screen generates an expose
316: window event.
317: The program repaints the window on each expose window event,
318: and exits if any mouse button event is detected on the window.
319: .EH ''\fB- ii -\fP''
320: .OH ''\fB- ii -\fP''
321: .bp
322: .XS
323: Index
324: .XE
325: .PX
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.