|
|
1.1 ! root 1: #include <X/mit-copyright.h> ! 2: ! 3: /* Copyright 1985, Massachusetts Institute of Technology */ ! 4: ! 5: /* ! 6: * xwininfo.c - MIT Project Athena, X Window system window ! 7: * information utility. ! 8: * ! 9: * This program will report all relavent information ! 10: * about a specific window. ! 11: * ! 12: * Author: Tony Della Fera, DEC ! 13: * 27-Nov-84 ! 14: */ ! 15: #ifndef lint ! 16: static char *rcsid_xhost_c = "$Header: xwininfo.c,v 10.6 86/11/19 19:59:23 jg Rel $"; ! 17: #endif ! 18: ! 19: #include <X/Xlib.h> ! 20: #include <stdio.h> ! 21: #include "../cursors/target.cursor" ! 22: #include "../cursors/target_mask.cursor" ! 23: #include <strings.h> ! 24: ! 25: typedef enum _bool {FALSE, TRUE} Bool; ! 26: ! 27: #define MAX(a, b) (a) > (b) ? (a) : (b) ! 28: #define MIN(a, b) (a) < (b) ? (a) : (b) ! 29: #define ABS(a) (a) < 0 ? -(a) : (a) ! 30: ! 31: #define FAILURE 0 ! 32: ! 33: char *index(); ! 34: ! 35: extern int errno; ! 36: ! 37: main(argc, argv) ! 38: int argc; ! 39: char **argv; ! 40: { ! 41: int mse_x, mse_y; ! 42: int rel_mse_x, rel_mse_y; ! 43: int w0, h0, w_inc, h_inc; ! 44: int lr_rel_x, lr_rel_y; ! 45: int root_w, root_h; ! 46: int num_children; ! 47: int status; ! 48: char display[256]; ! 49: char *strind = NULL; ! 50: char *win_name = NULL; ! 51: char *id = NULL; ! 52: char *win_fmt = " 0x%x\n"; ! 53: Bool children = FALSE; ! 54: Bool root_switch = FALSE; ! 55: register int i; ! 56: ! 57: Window target_win; ! 58: Window temp_win; ! 59: Window parent_win; ! 60: Window *child_list; ! 61: WindowInfo win_info; ! 62: Cursor cursor; ! 63: XButtonPressedEvent event; ! 64: ! 65: display[0] = '\0'; ! 66: ! 67: for (i = 1; i < argc; i++) { ! 68: strind = index(argv[i], ':'); ! 69: if (strind != NULL) { ! 70: (void) strncpy(display, argv[i], sizeof(display)); ! 71: continue; ! 72: } ! 73: strind = index (argv [i], '-'); ! 74: if (strind == NULL) Syntax(argv[0]); ! 75: if (strncmp(argv [i], "-children", 9) == 0) { ! 76: children = TRUE; ! 77: continue; ! 78: } ! 79: if (strncmp(argv [i], "-help", 5) == 0) { ! 80: Syntax(argv[0]); ! 81: } ! 82: if (strncmp(argv [i], "-id", 3) == 0) { ! 83: if (++i >= argc) Syntax(argv[0]); ! 84: id = argv[i]; ! 85: continue; ! 86: } ! 87: if (strncmp(argv [i], "-int", 4) == 0) { ! 88: win_fmt = " %d\n"; ! 89: continue; ! 90: } ! 91: if (strncmp(argv [i], "-root", 5) == 0) { ! 92: root_switch = TRUE; ! 93: continue; ! 94: } ! 95: Syntax(argv[0]); ! 96: } ! 97: ! 98: if (XOpenDisplay(display) == NULL) { ! 99: fprintf(stderr, "%s: Can't open display '%s'\n", ! 100: argv[0], XDisplayName(display)); ! 101: exit(1); ! 102: } ! 103: ! 104: /* ! 105: * Store the target cursor incase we need it. ! 106: */ ! 107: cursor = XCreateCursor( ! 108: target_width, target_height, ! 109: target_bits, target_mask_bits, ! 110: 8, 8, ! 111: BlackPixel, WhitePixel, ! 112: GXcopy ! 113: ); ! 114: if (cursor == FAILURE) { ! 115: Error("Error occured while trying to store target cursor."); ! 116: } ! 117: ! 118: /* ! 119: * Depending on the state of the root and id switches, get the ! 120: * target window from the user. ! 121: */ ! 122: if (root_switch) { ! 123: /* ! 124: * The root window selected on the command line. ! 125: */ ! 126: target_win = RootWindow; ! 127: } ! 128: else { ! 129: if (id != NULL) { ! 130: /* ! 131: * A window id was provided on the command line. ! 132: */ ! 133: (void) sscanf(id, "0x%x", &target_win); ! 134: if (target_win == 0) { ! 135: /* ! 136: * Then the target was entered in decimal. ! 137: */ ! 138: (void) sscanf(id, "%d", &target_win); ! 139: if (target_win == 0) { ! 140: Error("Invalid window id format."); ! 141: } ! 142: } ! 143: } ! 144: else { ! 145: /* ! 146: * No selection was provided on the command line. ! 147: * Allow the user to select a window with the mouse. ! 148: */ ! 149: status = XGrabMouse(RootWindow, cursor, ButtonPressed); ! 150: if (status == FAILURE) Error("Can't grab the mouse."); ! 151: ! 152: printf("\n"); ! 153: printf("xwininfo ==> Please select the window you wish\n"); ! 154: printf(" ==> information on by clicking the\n"); ! 155: printf(" ==> mouse in that window.\n"); ! 156: ! 157: XNextEvent(&event); ! 158: target_win = event.subwindow; ! 159: ! 160: XUngrabMouse(); ! 161: ! 162: if (target_win == 0) { ! 163: /* ! 164: * The user must have indicated the root window. ! 165: */ ! 166: target_win = RootWindow; ! 167: } ! 168: } ! 169: } ! 170: ! 171: status = XQueryMouse(RootWindow, &mse_x, &mse_y, &temp_win); ! 172: if (status == FAILURE) Error("Can't query mouse on Root Window."); ! 173: if (target_win == RootWindow){ ! 174: rel_mse_x = mse_x; ! 175: rel_mse_y = mse_y; ! 176: } ! 177: else { ! 178: status = XQueryMouse(target_win, &rel_mse_x, &rel_mse_y, &temp_win); ! 179: if (status == FAILURE) Error("Can't query mouse on target window."); ! 180: } ! 181: ! 182: status = XQueryWindow(RootWindow, &win_info); ! 183: if (status == FAILURE) Error("Couldn't query root window."); ! 184: root_w = win_info.width; ! 185: root_h = win_info.height; ! 186: ! 187: status = XQueryWindow(target_win, &win_info); ! 188: if (status == FAILURE) Error("Couldn't query target window."); ! 189: lr_rel_x = root_w - (win_info.x + win_info.width + ! 190: (win_info.bdrwidth << 1)); ! 191: lr_rel_y = root_h - (win_info.y + win_info.height + ! 192: (win_info.bdrwidth << 1)); ! 193: ! 194: status = XFetchName(target_win, &win_name); ! 195: if (status == FAILURE) Error("Can't fetch window name."); ! 196: ! 197: status = XQueryTree(target_win, &parent_win, &num_children, &child_list); ! 198: if (status == FAILURE) Error("Can't query window tree."); ! 199: ! 200: (void) XGetResizeHint(target_win, &w0, &h0, &w_inc, &h_inc); ! 201: ! 202: printf("\nxwininfo ==> Window name: '%s'\n", win_name); ! 203: printf(" ==> Window id:"); ! 204: printf(win_fmt, target_win); ! 205: printf(" ==> Parent window id:"); ! 206: printf(win_fmt, parent_win); ! 207: printf(" ==> Number of children: %d\n", num_children); ! 208: if (children) { ! 209: for (i = num_children - 1; i >= 0; i--) { ! 210: printf(" ==> Child window id:"); ! 211: printf(win_fmt, child_list[i]); ! 212: } ! 213: } ! 214: printf(" ==> Associated window id:"); ! 215: printf(win_fmt, win_info.assoc_wind); ! 216: printf(" ==> Window type: "); ! 217: switch (win_info.type) { ! 218: case IsTransparent: ! 219: printf("IsTransparent\n"); ! 220: break; ! 221: case IsOpaque: ! 222: printf("IsOpaque\n"); ! 223: break; ! 224: case IsIcon: ! 225: printf("IsIcon\n"); ! 226: break; ! 227: default: ! 228: printf("Unknown %d?\n", win_info.type); ! 229: break; ! 230: } ! 231: printf(" ==> Window state: "); ! 232: switch (win_info.mapped) { ! 233: case IsMapped: ! 234: printf("IsMapped\n"); ! 235: break; ! 236: case IsUnmapped: ! 237: printf("IsUnmapped\n"); ! 238: break; ! 239: case IsInvisible: ! 240: printf("IsInvisible\n"); ! 241: break; ! 242: default: ! 243: printf("Unknown %d?\n", win_info.mapped); ! 244: break; ! 245: } ! 246: printf(" ==> Upper left X: %d\n", win_info.x); ! 247: printf(" ==> Upper left Y: %d\n", win_info.y); ! 248: printf(" ==> Width: %d\n", win_info.width); ! 249: printf(" ==> Height: %d\n", win_info.height); ! 250: printf(" ==> Border width: %d\n", win_info.bdrwidth); ! 251: printf(" ==> Geometry specification:\n"); ! 252: printf(" ==> Upper left =%dx%d+%d+%d\n", ! 253: win_info.width, win_info.height, win_info.x, win_info.y); ! 254: printf(" ==> Lower right =%dx%d-%d-%d\n", ! 255: win_info.width, win_info.height, lr_rel_x, lr_rel_y); ! 256: printf(" ==> Resize base width: %d\n", w0); ! 257: printf(" ==> Resize base height: %d\n", h0); ! 258: printf(" ==> Resize width increment: %d\n", w_inc); ! 259: printf(" ==> Resize height increment: %d\n", h_inc); ! 260: printf(" ==> Root absolute mouse X Position: %d\n", mse_x); ! 261: printf(" ==> Root absolute mouse Y Position: %d\n", mse_y); ! 262: printf(" ==> Target relative mouse X Position: %d\n", rel_mse_x); ! 263: printf(" ==> Target relative mouse Y Position: %d\n", rel_mse_y); ! 264: printf("\n"); ! 265: ! 266: exit(0); ! 267: } ! 268: ! 269: ! 270: /* ! 271: * Report the syntax for calling xwininfo. ! 272: */ ! 273: Syntax(call) ! 274: char *call; ! 275: { ! 276: fprintf(stderr, "\n"); ! 277: fprintf(stderr, "Usage: %s [-children] [-help] [-id <id>] [-int] ", call); ! 278: fprintf(stderr, "[-root] [[host]:vs]\n\n"); ! 279: exit(0); ! 280: } ! 281: ! 282: ! 283: /* ! 284: * Error - Fatal xwininfo error. ! 285: */ ! 286: Error(string) ! 287: char *string; /* Error description string. */ ! 288: { ! 289: fprintf(stderr, "\nxwininfo: %s", string); ! 290: fprintf(stderr, "\n\n"); ! 291: ! 292: if (errno != 0) { ! 293: perror("xwininfo"); ! 294: fprintf(stderr, "\n"); ! 295: } ! 296: ! 297: exit(1); ! 298: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.