|
|
1.1 ! root 1: #include <X/mit-copyright.h> ! 2: ! 3: /* Copyright 1985, Massachusetts Institute of Technology */ ! 4: ! 5: /* ! 6: * xwd.c MIT Project Athena, X Window system window raster image dumper. ! 7: * ! 8: * This program will dump a raster image of the contents of a window into a ! 9: * file for output on graphics printers or for other uses. ! 10: * ! 11: * Author: Tony Della Fera, DEC ! 12: * 17-Jun-85 ! 13: */ ! 14: ! 15: #ifndef lint ! 16: static char *rcsid_xwd_c = "$Header: xwd.c,v 10.6 86/02/01 16:07:54 tony Rel $"; ! 17: #endif ! 18: ! 19: #include <X/Xlib.h> ! 20: #include <sys/types.h> ! 21: #include <stdio.h> ! 22: #include <strings.h> ! 23: ! 24: char *calloc(); ! 25: ! 26: typedef enum _bool {FALSE, TRUE} Bool; ! 27: ! 28: #include "../cursors/target.cursor" ! 29: #include "../cursors/target_mask.cursor" ! 30: ! 31: #include "XWDFile.h" ! 32: ! 33: #define MAX(a, b) (a) > (b) ? (a) : (b) ! 34: #define MIN(a, b) (a) < (b) ? (a) : (b) ! 35: #define ABS(a) (a) < 0 ? -(a) : (a) ! 36: ! 37: #define FAILURE 0 ! 38: ! 39: #define FEEP_VOLUME 0 ! 40: ! 41: extern int errno; ! 42: ! 43: main(argc, argv) ! 44: int argc; ! 45: char **argv; ! 46: { ! 47: register int i; ! 48: int status; ! 49: unsigned buffer_size; ! 50: int virt_x, virt_y; ! 51: int virt_width, virt_height; ! 52: int pixmap_format = XYFormat; ! 53: int win_name_size; ! 54: int header_size; ! 55: char *str_index; ! 56: char *file_name; ! 57: char display[256]; ! 58: char *win_name; ! 59: char *buffer; ! 60: Bool nobdrs = FALSE; ! 61: Bool debug = FALSE; ! 62: Bool standard_out = TRUE; ! 63: ! 64: Display *dpy; ! 65: Window target_win; ! 66: Window image_win; ! 67: WindowInfo win_info; ! 68: Cursor cursor; ! 69: XButtonEvent rep; ! 70: ! 71: XWDFileHeader header; ! 72: ! 73: FILE *out_file = stdout; ! 74: ! 75: for (i = 1; i < argc; i++) { ! 76: str_index = (char *)index (argv[i], ':'); ! 77: if(str_index != NULL) { ! 78: (void) strncpy(display,argv[i],sizeof(display)); ! 79: continue; ! 80: } ! 81: str_index = (char *) index (argv [i], '-'); ! 82: if (str_index == NULL) Syntax(argv[0]); ! 83: if (strncmp(argv[i], "-nobdrs", 6) == 0) { ! 84: nobdrs = TRUE; ! 85: continue; ! 86: } ! 87: if (strncmp(argv[i], "-debug", 6) == 0) { ! 88: debug = TRUE; ! 89: continue; ! 90: } ! 91: if (strncmp(argv[i], "-help", 5) == 0) { ! 92: Syntax(argv[0]); ! 93: } ! 94: if (strncmp(argv[i], "-out", 4) == 0) { ! 95: if (++i >= argc) Syntax(argv[0]); ! 96: file_name = argv[i]; ! 97: standard_out = FALSE; ! 98: continue; ! 99: } ! 100: if (strncmp(argv[i], "-z", 2) == 0) { ! 101: pixmap_format = ZFormat; ! 102: continue; ! 103: } ! 104: Syntax(argv[0]); ! 105: } ! 106: ! 107: if (!standard_out) { ! 108: /* ! 109: * Open the output file. ! 110: */ ! 111: out_file = fopen(file_name, "w"); ! 112: if (out_file == NULL) { ! 113: Error("Can't open output file as specified."); ! 114: } ! 115: } ! 116: ! 117: /* ! 118: * Open the display. ! 119: */ ! 120: if (debug) printf("xwd: Opening display.\n"); ! 121: if ((dpy = XOpenDisplay(display)) == NULL) { ! 122: Error("Error occured while trying open display."); ! 123: } ! 124: ! 125: /* ! 126: * Store the cursor incase we need it. ! 127: */ ! 128: if (debug) printf("xwd: Storing target cursor.\n"); ! 129: cursor = XCreateCursor( ! 130: target_width, target_height, ! 131: target_bits, target_mask_bits, ! 132: 8, 8, ! 133: BlackPixel, WhitePixel, ! 134: GXcopy ! 135: ); ! 136: if (cursor == FAILURE) { ! 137: Error("Error occured while trying to store target cursor."); ! 138: } ! 139: ! 140: /* ! 141: * Check to see if we are in the right pixmap format for the ! 142: * display type. ! 143: */ ! 144: if ((dpy->dplanes == 1) && (pixmap_format == ZFormat)) { ! 145: Error("ZFormat is not valid on a monochrome display."); ! 146: } ! 147: ! 148: /* ! 149: * Let the user select the target window. ! 150: */ ! 151: status = XGrabMouse(RootWindow, cursor, ButtonPressed); ! 152: if (status == FAILURE) Error("Can't grab the mouse."); ! 153: XNextEvent(&rep); ! 154: XUngrabMouse(); ! 155: target_win = rep.subwindow; ! 156: if (target_win == 0) { ! 157: /* ! 158: * The user must have indicated the root window. ! 159: */ ! 160: if (debug) printf("xwd: Root window selected as target.\n"); ! 161: target_win = RootWindow; ! 162: } ! 163: else if (debug) printf("xwd: Window 0x%x slected as target.\n", target_win); ! 164: ! 165: /* ! 166: * Inform the user not to alter the screen. ! 167: */ ! 168: XFeep(FEEP_VOLUME); ! 169: ! 170: /* ! 171: * Get the parameters of the window being dumped. ! 172: */ ! 173: if (debug) printf("xwd: Getting target window information.\n"); ! 174: status = XQueryWindow(target_win, &win_info); ! 175: if (status == FAILURE) Error("Can't query target window."); ! 176: status = XFetchName(target_win, &win_name); ! 177: if (status == FAILURE) Error("Can't fetch target window name."); ! 178: win_name_size = strlen(win_name) + sizeof(char); ! 179: /* sizeof(char) is included for the null string terminator. */ ! 180: ! 181: /* ! 182: * Calculate the virtual x, y, width and height of the window pane image ! 183: * (this depends on wether or not the borders are included. ! 184: */ ! 185: if (nobdrs) { ! 186: if (debug) printf("xwd: Image without borders selected.\n"); ! 187: image_win = target_win; ! 188: virt_x = 0; ! 189: virt_y = 0; ! 190: virt_width = win_info.width; ! 191: virt_height = win_info.height; ! 192: } ! 193: else { ! 194: if (debug) printf("xwd: Image with borders selected.\n"); ! 195: image_win = RootWindow; ! 196: virt_x = win_info.x; ! 197: virt_y = win_info.y; ! 198: virt_width = win_info.width + (win_info.bdrwidth << 1); ! 199: virt_height = win_info.height + (win_info.bdrwidth << 1); ! 200: } ! 201: ! 202: /* ! 203: * Determine the pixmap size. ! 204: */ ! 205: if (pixmap_format == XYFormat) { ! 206: buffer_size = XYPixmapSize(virt_width, virt_height, dpy->dplanes); ! 207: if (debug) { ! 208: printf("xwd: Pixmap in XYFormat, size %d bytes.\n", buffer_size); ! 209: } ! 210: } ! 211: else if (dpy->dplanes < 9) { ! 212: buffer_size = BZPixmapSize(virt_width, virt_height); ! 213: if (debug) { ! 214: printf("xwd: Pixmap in byte ZFormat, size %d bytes.\n", buffer_size); ! 215: } ! 216: } ! 217: else { ! 218: buffer_size = WZPixmapSize(virt_width, virt_height); ! 219: if (debug) { ! 220: printf("xwd: Pixmap in word ZFormat, size %d bytes.\n", buffer_size); ! 221: } ! 222: } ! 223: ! 224: ! 225: /* ! 226: * Calloc the buffer. ! 227: */ ! 228: if (debug) printf("xwd: Calloc'ing data buffer.\n"); ! 229: buffer = calloc(buffer_size , 1); ! 230: if (buffer == NULL) Error("Can't calloc data buffer."); ! 231: ! 232: /* ! 233: * Snarf the pixmap out of the frame buffer. ! 234: */ ! 235: if (debug) printf("xwd: Getting pixmap.\n"); ! 236: if (pixmap_format == XYFormat) { ! 237: (void) XPixmapGetXY( ! 238: image_win, ! 239: virt_x, virt_y, ! 240: virt_width, virt_height, ! 241: (short *)buffer ! 242: ); ! 243: } ! 244: else { ! 245: (void) XPixmapGetZ( ! 246: image_win, ! 247: virt_x, virt_y, ! 248: virt_width, virt_height, ! 249: (caddr_t)buffer ! 250: ); ! 251: } ! 252: ! 253: /* ! 254: * Inform the user that the image has been retrieved. ! 255: */ ! 256: XFeep(FEEP_VOLUME); ! 257: XFeep(FEEP_VOLUME); ! 258: XFlush(); ! 259: ! 260: /* ! 261: * Calculate header size. ! 262: */ ! 263: if (debug) printf("xwd: Calculating header size.\n"); ! 264: header_size = sizeof(header) + win_name_size; ! 265: ! 266: /* ! 267: * Writ out header information. ! 268: */ ! 269: if (debug) printf("xwd: Constructing and dumping file header.\n"); ! 270: header.header_size = header_size; ! 271: header.file_version = XWD_FILE_VERSION; ! 272: header.display_type = dpy->dtype; ! 273: header.display_planes = dpy->dplanes; ! 274: header.pixmap_format = pixmap_format; ! 275: header.pixmap_width = virt_width; ! 276: header.pixmap_height = virt_height; ! 277: header.window_width = win_info.width; ! 278: header.window_height = win_info.height; ! 279: header.window_x = win_info.x; ! 280: header.window_y = win_info.y; ! 281: header.window_bdrwidth = win_info.bdrwidth; ! 282: header.padding = 0; ! 283: ! 284: (void) fwrite((char *)&header, sizeof(header), 1, out_file); ! 285: (void) fwrite(win_name, win_name_size, 1, out_file); ! 286: ! 287: /* ! 288: * Write out the buffer. ! 289: */ ! 290: if (debug) printf("xwd: Dumping pixmap.\n"); ! 291: (void) fwrite(buffer, (int) buffer_size, 1, out_file); ! 292: ! 293: /* ! 294: * Close the output file. ! 295: */ ! 296: if (debug) printf("xwd: Closing output file.\n"); ! 297: (void) fclose(out_file); ! 298: ! 299: /* ! 300: * Free the pixmap buffer. ! 301: */ ! 302: if (debug) printf("xwd: Freeing pixmap buffer.\n"); ! 303: free(buffer); ! 304: ! 305: /* ! 306: * Free window name string. ! 307: */ ! 308: if (debug) printf("xwd: Freeing window name string.\n"); ! 309: free(win_name); ! 310: exit(0); ! 311: } ! 312: ! 313: ! 314: /* ! 315: * Report the syntax for calling xwd. ! 316: */ ! 317: Syntax(call) ! 318: char *call; ! 319: { ! 320: fprintf( ! 321: stderr, ! 322: "\nUsage: %s [-debug] [-help] [-nobdrs] [-out <file>]\n", ! 323: call ! 324: ); ! 325: fprintf(stderr, " [-z] [[host]:vs]\n\n"); ! 326: exit(0); ! 327: } ! 328: ! 329: ! 330: /* ! 331: * Error - Fatal xwd error. ! 332: */ ! 333: Error(string) ! 334: char *string; /* Error description string. */ ! 335: { ! 336: fprintf(stderr, "\nxwd: Error => %s", string); ! 337: fprintf(stderr, "\n\n"); ! 338: ! 339: if (errno != 0) { ! 340: perror("xwd"); ! 341: fprintf(stderr, "\n"); ! 342: } ! 343: ! 344: exit(1); ! 345: } ! 346: ! 347: /* End of xwd.c */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.