|
|
1.1 root 1: #include <X/mit-copyright.h>
2:
3: /* Copyright 1985, Massachusetts Institute of Technology */
4:
5: /*
6: * xwud.c - MIT Project Athena, X Window system window raster image
7: * undumper.
8: *
9: * This program will read a raster image of a window from stdin or a file
10: * and display it on an X display.
11: *
12: * Author: Tony Della Fera, DEC
13: */
14:
15: #ifndef lint
16: static char *rcsid_xwud_c = "$Header: xwud.c,v 10.7 86/02/01 15:23:08 tony Rel $";
17: #endif
18:
19: #include <X/Xlib.h>
20: #include <stdio.h>
21: #include <strings.h>
22:
23: extern char *calloc();
24:
25: #include "../xwd/XWDFile.h"
26:
27: typedef enum _bool {FALSE, TRUE} Bool;
28:
29: #define MAX(a, b) (a) > (b) ? (a) : (b)
30: #define MIN(a, b) (a) < (b) ? (a) : (b)
31: #define ABS(a) (a) < 0 ? -(a) : (a)
32:
33: #define FAILURE 0
34:
35: extern int errno;
36:
37: main(argc, argv)
38: int argc;
39: char **argv;
40: {
41: register int i;
42: int status;
43: unsigned buffer_size;
44: int win_name_size;
45: char *str_index;
46: char *file_name;
47: char display[256];
48: char *win_name;
49: char *buffer;
50: Bool standard_in = TRUE;
51:
52: Display *dpy;
53: Window image_win;
54: Pixmap image_pixmap;
55: XEvent event;
56:
57: XWDFileHeader header;
58:
59: FILE *in_file = stdin;
60:
61: for (i = 1; i < argc; i++) {
62: str_index = (char *)index (argv[i], ':');
63: if(str_index != NULL) {
64: (void) strncpy(display,argv[i],sizeof(display));
65: continue;
66: }
67: str_index = (char *) index (argv [i], '-');
68: if (str_index == NULL) Syntax(argv[0]);
69: if (strncmp(argv[i], "-help", 5) == 0) {
70: Syntax(argv[0]);
71: }
72: if (strncmp(argv[i], "-in", 4) == 0) {
73: if (++i >= argc) Syntax(argv[0]);
74: file_name = argv[i];
75: standard_in = FALSE;
76: continue;
77: }
78: Syntax(argv[0]);
79: }
80:
81: if (!standard_in) {
82: /*
83: * Open the output file.
84: */
85: in_file = fopen(file_name, "r");
86: if (in_file == NULL) {
87: Error("Can't open output file as specified.");
88: }
89: }
90:
91: /*
92: * Open the display.
93: */
94: if ((dpy = XOpenDisplay(display)) == NULL) {
95: Error("Error occured while trying open display.");
96: }
97:
98: /*
99: * Read in header information.
100: */
101: status = fread((char *)&header, sizeof(header), 1, in_file);
102: if (status != 1) Error("Unable to read dump file header.");
103:
104: /*
105: * check to see if the dump file is in the proper format.
106: */
107: if (header.file_version != XWD_FILE_VERSION) {
108: Error("XWD file format version missmatch.");
109: }
110:
111: /*
112: * Check to see if we are in the right pixmap format for the
113: * display type.
114: */
115: if ((dpy->dplanes == 1) && (header.pixmap_format != XYFormat)) {
116: Error("Windump is in ZFormat which is not valid on a monochrome display.");
117: }
118:
119: /*
120: * Calloc window name.
121: */
122: win_name_size = abs(header.header_size - sizeof(header));
123: win_name = calloc((unsigned) win_name_size, sizeof(char));
124: if (win_name == NULL) Error("Can't calloc window name storage.");
125:
126: /*
127: * Read in window name.
128: */
129: status = fread(win_name, sizeof(char), win_name_size, in_file);
130: if (status != win_name_size) {
131: Error("Unable to read window name from dump file.");
132: }
133:
134: /*
135: * Determine the pixmap size.
136: */
137: if (header.pixmap_format == XYFormat) {
138: buffer_size = XYPixmapSize(
139: header.pixmap_width,
140: header.pixmap_height,
141: header.display_planes
142: );
143: }
144: else if (header.display_planes < 9) {
145: buffer_size = BZPixmapSize(
146: header.pixmap_width,
147: header.pixmap_height
148: );
149: }
150: else {
151: buffer_size = WZPixmapSize(
152: header.pixmap_width,
153: header.pixmap_height
154: );
155: }
156:
157: /*
158: * Calloc the buffer.
159: */
160: buffer = calloc(buffer_size, 1);
161: if (buffer == NULL) Error("Can't calloc data buffer.");
162:
163: /*
164: * Read in the pixmap buffer.
165: */
166: status = fread(buffer, sizeof(char), (int)buffer_size, in_file);
167: if (status != buffer_size) Error("Unable to read pixmap from dump file.");
168:
169: /*
170: * Close the input file.
171: */
172: (void) fclose(in_file);
173:
174: /*
175: * Undump pixmap.
176: */
177: if (header.pixmap_format == XYFormat) {
178: image_pixmap = XStorePixmapXY(
179: header.pixmap_width,
180: header.pixmap_height,
181: buffer
182: );
183: }
184: else {
185: image_pixmap = XStorePixmapZ(
186: header.pixmap_width,
187: header.pixmap_height,
188: buffer
189: );
190: }
191:
192: /*
193: * Create the image window.
194: */
195: image_win = XCreateWindow(
196: RootWindow,
197: header.window_x, header.window_y,
198: header.pixmap_width, header.pixmap_height,
199: 0, (Pixmap) 0,
200: (Pixmap) 0
201: );
202: if (image_win == FAILURE) Error("Can't create image window.");
203:
204: /*
205: * Select mouse ButtonPressed on the window, this is how we determine
206: * when to stop displaying the window.
207: */
208: XSelectInput(image_win, (ButtonPressed | ExposeWindow));
209:
210: /*
211: * Store the window name string.
212: */
213: XStoreName(image_win, win_name);
214:
215: /*
216: * Map the image window.
217: */
218: XMapWindow(image_win);
219:
220: /*
221: * Set up a while loop to maintain the image.
222: */
223: while (TRUE) {
224: /*
225: * Blit the pixmap into the window.
226: */
227: XPixmapPut(
228: image_win,
229: 0, 0, 0, 0,
230: header.pixmap_width, header.pixmap_height,
231: image_pixmap,
232: GXcopy,
233: AllPlanes
234: );
235:
236: /*
237: * Wait on mouse input event to terminate.
238: */
239: XNextEvent(&event);
240: if (event.type == ButtonPressed) break;
241: }
242:
243: /*
244: * Destroy the image window.
245: */
246: XDestroyWindow(image_win);
247:
248: /*
249: * Free the pixmap buffer.
250: */
251: free(buffer);
252:
253: /*
254: * Free window name string.
255: */
256: free(win_name);
257: exit(0);
258: }
259:
260:
261: /*
262: * Report the syntax for calling xwud.
263: */
264: Syntax(call)
265: char *call;
266: {
267: fprintf(
268: stderr,
269: "\nUsage: %s [-debug] [-help] [-in <file>] [[host]:vs]\n\n",
270: call
271: );
272: exit(0);
273: }
274:
275:
276: /*
277: * Error - Fatal xwud error.
278: */
279: Error(string)
280: char *string; /* Error description string. */
281: {
282: fprintf(stderr, "\nxwud: Error => %s", string);
283: fprintf(stderr, "\n\n");
284:
285: if (errno != 0) {
286: perror("xwud");
287: fprintf(stderr, "\n");
288: }
289:
290: exit(1);
291: }
292:
293: /* End of xwud.c */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.