|
|
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.5 86/02/01 16:08:18 tony 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) Error("Couldn't Open display."); ! 99: ! 100: /* ! 101: * Store the target cursor incase we need it. ! 102: */ ! 103: cursor = XCreateCursor( ! 104: target_width, target_height, ! 105: target_bits, target_mask_bits, ! 106: 8, 8, ! 107: BlackPixel, WhitePixel, ! 108: GXcopy ! 109: ); ! 110: if (cursor == FAILURE) { ! 111: Error("Error occured while trying to store target cursor."); ! 112: } ! 113: ! 114: /* ! 115: * Depending on the state of the root and id switches, get the ! 116: * target window from the user. ! 117: */ ! 118: if (root_switch) { ! 119: /* ! 120: * The root window selected on the command line. ! 121: */ ! 122: target_win = RootWindow; ! 123: } ! 124: else { ! 125: if (id != NULL) { ! 126: /* ! 127: * A window id was provided on the command line. ! 128: */ ! 129: (void) sscanf(id, "0x%x", &target_win); ! 130: if (target_win == 0) { ! 131: /* ! 132: * Then the target was entered in decimal. ! 133: */ ! 134: (void) sscanf(id, "%d", &target_win); ! 135: if (target_win == 0) { ! 136: Error("Invalid window id format."); ! 137: } ! 138: } ! 139: } ! 140: else { ! 141: /* ! 142: * No selection was provided on the command line. ! 143: * Allow the user to select a window with the mouse. ! 144: */ ! 145: status = XGrabMouse(RootWindow, cursor, ButtonPressed); ! 146: if (status == FAILURE) Error("Can't grab the mouse."); ! 147: ! 148: printf("\n"); ! 149: printf("xwininfo ==> Please select the window you wish\n"); ! 150: printf(" ==> information on by clicking the\n"); ! 151: printf(" ==> mouse in that window.\n"); ! 152: ! 153: XNextEvent(&event); ! 154: target_win = event.subwindow; ! 155: ! 156: XUngrabMouse(); ! 157: ! 158: if (target_win == 0) { ! 159: /* ! 160: * The user must have indicated the root window. ! 161: */ ! 162: target_win = RootWindow; ! 163: } ! 164: } ! 165: } ! 166: ! 167: status = XQueryMouse(RootWindow, &mse_x, &mse_y, &temp_win); ! 168: if (status == FAILURE) Error("Can't query mouse on Root Window."); ! 169: if (target_win == RootWindow){ ! 170: rel_mse_x = mse_x; ! 171: rel_mse_y = mse_y; ! 172: } ! 173: else { ! 174: status = XQueryMouse(target_win, &rel_mse_x, &rel_mse_y, &temp_win); ! 175: if (status == FAILURE) Error("Can't query mouse on target window."); ! 176: } ! 177: ! 178: status = XQueryWindow(RootWindow, &win_info); ! 179: if (status == FAILURE) Error("Couldn't query root window."); ! 180: root_w = win_info.width; ! 181: root_h = win_info.height; ! 182: ! 183: status = XQueryWindow(target_win, &win_info); ! 184: if (status == FAILURE) Error("Couldn't query target window."); ! 185: lr_rel_x = root_w - (win_info.x + win_info.width + ! 186: (win_info.bdrwidth << 1)); ! 187: lr_rel_y = root_h - (win_info.y + win_info.height + ! 188: (win_info.bdrwidth << 1)); ! 189: ! 190: status = XFetchName(target_win, &win_name); ! 191: if (status == FAILURE) Error("Can't fetch window name."); ! 192: ! 193: status = XQueryTree(target_win, &parent_win, &num_children, &child_list); ! 194: if (status == FAILURE) Error("Can't query window tree."); ! 195: ! 196: (void) XGetResizeHint(target_win, &w0, &h0, &w_inc, &h_inc); ! 197: ! 198: printf("\nxwininfo ==> Window name: '%s'\n", win_name); ! 199: printf(" ==> Window id:"); ! 200: printf(win_fmt, target_win); ! 201: printf(" ==> Parent window id:"); ! 202: printf(win_fmt, parent_win); ! 203: printf(" ==> Number of children: %d\n", num_children); ! 204: if (children) { ! 205: for (i = num_children - 1; i >= 0; i--) { ! 206: printf(" ==> Child window id:"); ! 207: printf(win_fmt, child_list[i]); ! 208: } ! 209: } ! 210: printf(" ==> Associated window id:"); ! 211: printf(win_fmt, win_info.assoc_wind); ! 212: printf(" ==> Window type: "); ! 213: switch (win_info.type) { ! 214: case IsTransparent: ! 215: printf("IsTransparent\n"); ! 216: break; ! 217: case IsOpaque: ! 218: printf("IsOpaque\n"); ! 219: break; ! 220: case IsIcon: ! 221: printf("IsIcon\n"); ! 222: break; ! 223: default: ! 224: printf("Unknown %d?\n", win_info.type); ! 225: break; ! 226: } ! 227: printf(" ==> Window state: "); ! 228: switch (win_info.mapped) { ! 229: case IsMapped: ! 230: printf("IsMapped\n"); ! 231: break; ! 232: case IsUnmapped: ! 233: printf("IsUnmapped\n"); ! 234: break; ! 235: case IsInvisible: ! 236: printf("IsInvisible\n"); ! 237: break; ! 238: default: ! 239: printf("Unknown %d?\n", win_info.mapped); ! 240: break; ! 241: } ! 242: printf(" ==> Upper left X: %d\n", win_info.x); ! 243: printf(" ==> Upper left Y: %d\n", win_info.y); ! 244: printf(" ==> Width: %d\n", win_info.width); ! 245: printf(" ==> Height: %d\n", win_info.height); ! 246: printf(" ==> Border width: %d\n", win_info.bdrwidth); ! 247: printf(" ==> Geometry specification:\n"); ! 248: printf(" ==> Upper left =%dx%d+%d+%d\n", ! 249: win_info.width, win_info.height, win_info.x, win_info.y); ! 250: printf(" ==> Lower right =%dx%d-%d-%d\n", ! 251: win_info.width, win_info.height, lr_rel_x, lr_rel_y); ! 252: printf(" ==> Resize base width: %d\n", w0); ! 253: printf(" ==> Resize base height: %d\n", h0); ! 254: printf(" ==> Resize width increment: %d\n", w_inc); ! 255: printf(" ==> Resize height increment: %d\n", h_inc); ! 256: printf(" ==> Root absolute mouse X Position: %d\n", mse_x); ! 257: printf(" ==> Root absolute mouse Y Position: %d\n", mse_y); ! 258: printf(" ==> Target relative mouse X Position: %d\n", rel_mse_x); ! 259: printf(" ==> Target relative mouse Y Position: %d\n", rel_mse_y); ! 260: printf("\n"); ! 261: ! 262: exit(0); ! 263: } ! 264: ! 265: ! 266: /* ! 267: * Report the syntax for calling xwininfo. ! 268: */ ! 269: Syntax(call) ! 270: char *call; ! 271: { ! 272: fprintf(stderr, "\n"); ! 273: fprintf(stderr, "Usage: %s [-children] [-help] [-id <id>] [-int] ", call); ! 274: fprintf(stderr, "[-root] [[host]:vs]\n\n"); ! 275: exit(0); ! 276: } ! 277: ! 278: ! 279: /* ! 280: * Error - Fatal xwininfo error. ! 281: */ ! 282: Error(string) ! 283: char *string; /* Error description string. */ ! 284: { ! 285: fprintf(stderr, "\nxwininfo: %s", string); ! 286: fprintf(stderr, "\n\n"); ! 287: ! 288: if (errno != 0) { ! 289: perror("xwininfo"); ! 290: fprintf(stderr, "\n"); ! 291: } ! 292: ! 293: exit(1); ! 294: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.