|
|
1.1 ! root 1: /* Copyright 1987, Massachusetts Institute of Technology */ ! 2: ! 3: /* ! 4: * xwininfo.c - MIT Project Athena, X Window system window ! 5: * information utility. ! 6: * ! 7: * This program will report all relavent information ! 8: * about a specific window. ! 9: * ! 10: * Author: Mark Lillibridge, MIT Project Athena ! 11: * 16-Jun-87 ! 12: */ ! 13: ! 14: #include <X11/Xlib.h> ! 15: #include <X11/Xutil.h> ! 16: #include <stdio.h> ! 17: #include <strings.h> ! 18: ! 19: /* Include routines to handle parsing defaults */ ! 20: #include "dsimple.h" ! 21: ! 22: #define TRUE 1 ! 23: #define FALSE 0 ! 24: ! 25: #define FAILURE 0 ! 26: ! 27: Window window; ! 28: static char *window_id_format = " 0x%x"; ! 29: ! 30: /* ! 31: * Report the syntax for calling xwininfo: ! 32: */ ! 33: usage() ! 34: { ! 35: fprintf(stderr, "\n"); ! 36: fprintf(stderr, "Usage: %s [-help] %s [-int] ", ! 37: program_name, SELECT_USAGE); ! 38: fprintf(stderr, "[host:vs] [-tree] [-stats] [-bits] [-events] [-size] [-wm]\n\n"); ! 39: exit(0); ! 40: } ! 41: ! 42: ! 43: main(argc, argv) ! 44: int argc; ! 45: char **argv; ! 46: { ! 47: register int i; ! 48: int tree, stats, bits, events, wm, size = 0; ! 49: ! 50: INIT_NAME; ! 51: ! 52: /* Open display, handle command line arguments */ ! 53: Setup_Display_And_Screen(&argc, argv); ! 54: ! 55: /* Get window selected on command line, if any */ ! 56: window = Select_Window_Args(&argc, argv); ! 57: ! 58: /* Handle our command line arguments */ ! 59: for (i = 1; i < argc; i++) { ! 60: if (!strcmp(argv[i], "-help")) ! 61: usage(); ! 62: if (!strcmp(argv[i], "-int")) { ! 63: window_id_format = " %d"; ! 64: continue; ! 65: } ! 66: if (!strcmp(argv[i], "-tree")) { ! 67: tree = 1; ! 68: continue; ! 69: } ! 70: if (!strcmp(argv[i], "-stats")) { ! 71: stats = 1; ! 72: continue; ! 73: } ! 74: if (!strcmp(argv[i], "-bits")) { ! 75: bits = 1; ! 76: continue; ! 77: } ! 78: if (!strcmp(argv[i], "-events")) { ! 79: events = 1; ! 80: continue; ! 81: } ! 82: if (!strcmp(argv[i], "-wm")) { ! 83: wm = 1; ! 84: continue; ! 85: } ! 86: if (!strcmp(argv[i], "-size")) { ! 87: size = 1; ! 88: continue; ! 89: } ! 90: usage(); ! 91: } ! 92: ! 93: /* If no window selected on command line, let user pick one the hard way */ ! 94: if (!window) { ! 95: printf("\nxwininfo ==> Please select the window you wish\n"); ! 96: printf(" ==> information on by clicking the\n"); ! 97: printf(" ==> mouse in that window.\n"); ! 98: window = Select_Window(dpy); ! 99: } ! 100: ! 101: /* ! 102: * Do the actual displaying as per parameters ! 103: */ ! 104: if (!(tree || bits || events || wm || size)) ! 105: stats = 1; ! 106: ! 107: printf("\nxwininfo ==> Window id:"); ! 108: Display_Window_Id(window); ! 109: if (tree) ! 110: Display_Tree_Info(window); ! 111: if (stats) ! 112: Display_Stats_Info(window); ! 113: if (bits) ! 114: Display_Bits_Info(window); ! 115: if (events) ! 116: Display_Events_Info(window); ! 117: if (wm) ! 118: Display_WM_Info(window); ! 119: if (size) ! 120: Display_Size_Hints(window); ! 121: printf("\n"); ! 122: } ! 123: ! 124: ! 125: /* ! 126: * Lookup: lookup a code in a table. ! 127: */ ! 128: typedef struct { ! 129: long code; ! 130: char *name; ! 131: } binding; ! 132: ! 133: static char _lookup_buffer[100]; ! 134: ! 135: char *Lookup(code, table) ! 136: long code; ! 137: binding *table; ! 138: { ! 139: char *name; ! 140: ! 141: sprintf(_lookup_buffer, "unknown (code = %ld. = 0x%lx)", code, code); ! 142: name = _lookup_buffer; ! 143: ! 144: while (table->name) { ! 145: if (table->code == code) { ! 146: name = table->name; ! 147: break; ! 148: } ! 149: table++; ! 150: } ! 151: ! 152: return(name); ! 153: } ! 154: ! 155: ! 156: /* ! 157: * Routine to display a window id in dec/hex with name if window has one ! 158: */ ! 159: ! 160: Display_Window_Id(window) ! 161: Window window; ! 162: { ! 163: char *win_name; ! 164: ! 165: printf(window_id_format, window); /* print id # in hex/dec */ ! 166: if (!window) { ! 167: printf(" (none)\n"); ! 168: return; ! 169: } ! 170: if (!XFetchName(dpy, window, &win_name)) { /* Get window name if any */ ! 171: printf(" (has no name)\n"); ! 172: return; ! 173: } ! 174: if (win_name) { ! 175: printf(" (%s)\n", win_name); ! 176: free(win_name); ! 177: } else if (window == RootWindow(dpy, screen)) ! 178: printf(" (the root window)\n"); ! 179: else ! 180: printf(" (has no name)\n"); ! 181: } ! 182: ! 183: ! 184: /* ! 185: * Display Stats on window ! 186: */ ! 187: static binding _window_classes[] = { ! 188: { InputOutput, "InputOutput" }, ! 189: { InputOnly, "InputOnly" }, ! 190: { 0, 0 } }; ! 191: ! 192: static binding _map_states[] = { ! 193: { IsUnmapped, "IsUnMapped" }, ! 194: { IsUnviewable, "IsUnviewable" }, ! 195: { IsViewable, "IsViewable" }, ! 196: { 0, 0 } }; ! 197: ! 198: Display_Stats_Info(window) ! 199: Window window; ! 200: { ! 201: XWindowAttributes win_attributes; ! 202: ! 203: if (!XGetWindowAttributes(dpy, window, &win_attributes)) ! 204: Fatal_Error("Can't get window attributes."); ! 205: ! 206: printf("\n ==> Upper left X: %d\n", win_attributes.x); ! 207: printf(" ==> Upper left Y: %d\n", win_attributes.y); ! 208: printf(" ==> Width: %d\n", win_attributes.width); ! 209: printf(" ==> Height: %d\n", win_attributes.height); ! 210: printf(" ==> Depth: %d\n", win_attributes.depth); ! 211: printf(" ==> Border width: %d\n", win_attributes.border_width); ! 212: printf(" ==> Window class: %s\n", Lookup(win_attributes.class, ! 213: _window_classes)); ! 214: printf(" ==> Window Map State: %s\n", ! 215: Lookup(win_attributes.map_state, _map_states)); ! 216: } ! 217: ! 218: ! 219: /* ! 220: * Display bits info: ! 221: */ ! 222: static binding _gravities[] = { ! 223: { UnmapGravity, "UnMapGravity" }, /* WARNING: both of these have*/ ! 224: { ForgetGravity, "ForgetGravity" }, /* the same value - see code */ ! 225: { NorthWestGravity, "NorthWestGravity" }, ! 226: { NorthGravity, "NorthGravity" }, ! 227: { NorthEastGravity, "NorthEastGravity" }, ! 228: { WestGravity, "WestGravity" }, ! 229: { CenterGravity, "CenterGravity" }, ! 230: { EastGravity, "EastGravity" }, ! 231: { SouthWestGravity, "SouthWestGravity" }, ! 232: { SouthGravity, "SouthGravity" }, ! 233: { SouthEastGravity, "SouthEastGravity" }, ! 234: { StaticGravity, "StaticGravity" }, ! 235: { 0, 0 } }; ! 236: ! 237: static binding _backing_store_hint[] = { ! 238: { NotUseful, "NotUseful" }, ! 239: { WhenMapped, "WhenMapped" }, ! 240: { Always, "Always" }, ! 241: { 0, 0 } }; ! 242: ! 243: static binding _bool[] = { ! 244: { 0, "No" }, ! 245: { 1, "Yes" }, ! 246: { 0, 0 } }; ! 247: ! 248: Display_Bits_Info(window) ! 249: Window window; ! 250: { ! 251: XWindowAttributes win_attributes; ! 252: ! 253: if (!XGetWindowAttributes(dpy, window, &win_attributes)) ! 254: Fatal_Error("Can't get window attributes."); ! 255: ! 256: printf("\n ==> Bit gravity: %s\n", ! 257: Lookup(win_attributes.bit_gravity, _gravities+1)); ! 258: printf(" ==> Window gravity: %s\n", ! 259: Lookup(win_attributes.win_gravity, _gravities)); ! 260: printf(" ==> Backing-store hint: %s\n", ! 261: Lookup(win_attributes.backing_store, _backing_store_hint)); ! 262: printf(" ==> Backing-planes to be preserved: 0x%x\n", ! 263: win_attributes.backing_planes); ! 264: printf(" ==> Backing pixel: %d\n", win_attributes.backing_pixel); ! 265: printf(" ==> Save-under?: %s\n", ! 266: Lookup(win_attributes.save_under, _bool)); ! 267: } ! 268: ! 269: ! 270: /* ! 271: * Routine to display all events in an event mask ! 272: */ ! 273: static binding _event_mask_names[] = { ! 274: { KeyPressMask, "KeyPress" }, ! 275: { KeyReleaseMask, "KeyRelease" }, ! 276: { ButtonPressMask, "ButtonPress" }, ! 277: { ButtonReleaseMask, "ButtonRelease" }, ! 278: { EnterWindowMask, "EnterWindow" }, ! 279: { LeaveWindowMask, "LeaveWindow" }, ! 280: { PointerMotionMask, "PointerMotion" }, ! 281: { PointerMotionHintMask, "PointerMotionHint" }, ! 282: { Button1MotionMask, "Button1Motion" }, ! 283: { Button2MotionMask, "Button2Motion" }, ! 284: { Button3MotionMask, "Button3Motion" }, ! 285: { Button4MotionMask, "Button4Motion" }, ! 286: { Button5MotionMask, "Button5Motion" }, ! 287: { ButtonMotionMask, "ButtonMotion" }, ! 288: { KeymapStateMask, "KeymapState" }, ! 289: { ExposureMask, "Exposure" }, ! 290: { VisibilityChangeMask, "VisibilityChange" }, ! 291: { StructureNotifyMask, "StructureNotify" }, ! 292: { ResizeRedirectMask, "ResizeRedirect" }, ! 293: { SubstructureNotifyMask, "SubstructureNotify" }, ! 294: { SubstructureRedirectMask, "SubstructureRedirect" }, ! 295: { FocusChangeMask, "FocusChange" }, ! 296: { PropertyChangeMask, "PropertyChange" }, ! 297: { ColormapChangeMask, "ColormapChange" }, ! 298: { OwnerGrabButtonMask, "OwnerGrabButton" }, ! 299: { 0, 0 } }; ! 300: ! 301: Display_Event_Mask(mask) ! 302: long mask; ! 303: { ! 304: long bit, bit_mask; ! 305: ! 306: for (bit=0, bit_mask=1; bit<sizeof(long)*8; bit++, bit_mask <<= 1) ! 307: if (mask & bit_mask) ! 308: printf(" ==> %s\n", ! 309: Lookup(bit_mask, _event_mask_names)); ! 310: } ! 311: ! 312: ! 313: /* ! 314: * Display info on events ! 315: */ ! 316: Display_Events_Info(window) ! 317: Window window; ! 318: { ! 319: XWindowAttributes win_attributes; ! 320: ! 321: if (!XGetWindowAttributes(dpy, window, &win_attributes)) ! 322: Fatal_Error("Can't get window attributes."); ! 323: ! 324: printf("\n ==> Someone wants these events:\n"); ! 325: Display_Event_Mask(win_attributes.all_event_masks); ! 326: ! 327: printf(" ==> Do not prograte these events:\n"); ! 328: Display_Event_Mask(win_attributes.do_not_propagate_mask); ! 329: ! 330: printf(" ==> Overide redirection?: %s\n", ! 331: Lookup(win_attributes.override_redirect, _bool)); ! 332: } ! 333: ! 334: ! 335: /* left out visual stuff */ ! 336: /* left out colormap */ ! 337: /* left out map_installed */ ! 338: ! 339: ! 340: /* ! 341: * Display root, parent, and children window id's of window ! 342: */ ! 343: Display_Tree_Info(window) ! 344: Window window; ! 345: { ! 346: int i; ! 347: Window root_win, parent_win; ! 348: int num_children; ! 349: Window *child_list; ! 350: ! 351: if (!XQueryTree(dpy, window, &root_win, &parent_win, &child_list, ! 352: &num_children)) ! 353: Fatal_Error("Can't query window tree."); ! 354: ! 355: printf("\n ==> Root window id:"); ! 356: Display_Window_Id(root_win); ! 357: printf(" ==> Parent window id:"); ! 358: Display_Window_Id(parent_win); ! 359: ! 360: printf(" ==> Number of children: %d\n", num_children); ! 361: ! 362: for (i = num_children - 1; i >= 0; i--) { ! 363: printf(" ==> Child window id:"); ! 364: Display_Window_Id(child_list[i]); ! 365: } ! 366: ! 367: free(child_list); ! 368: } ! 369: ! 370: ! 371: /* ! 372: * Display a set of size hints ! 373: */ ! 374: Display_Hints(hints) ! 375: XSizeHints hints; ! 376: { ! 377: long flags; ! 378: ! 379: flags = hints.flags; ! 380: ! 381: if (flags & USPosition) ! 382: printf(" ==> User supplied location: %d, %d\n", ! 383: hints.x, hints.y); ! 384: ! 385: if (flags & PPosition) ! 386: printf(" ==> Program supplied location: %d, %d\n", ! 387: hints.x, hints.y); ! 388: ! 389: if (flags & USSize) ! 390: printf(" ==> User supplied size: %d by %d\n", ! 391: hints.width, hints.height); ! 392: ! 393: if (flags & PSize) ! 394: printf(" ==> Program supplied size: %d by %d\n", ! 395: hints.width, hints.height); ! 396: ! 397: if (flags & PMinSize) ! 398: printf(" ==> Program supplied minimum size: %d by %d\n", ! 399: hints.min_width, hints.min_height); ! 400: ! 401: if (flags & PMaxSize) ! 402: printf(" ==> Program supplied maximum size: %d by %d\n", ! 403: hints.max_width, hints.max_height); ! 404: ! 405: if (flags & PResizeInc) { ! 406: printf(" ==> Program supplied x resize increment: %d\n", ! 407: hints.width_inc); ! 408: printf(" ==> Program supplied y resize increment: %d\n", ! 409: hints.height_inc); ! 410: } ! 411: ! 412: if (flags & PAspect) { ! 413: printf(" ==> Program supplied min aspect ratio: %d/%d\n", ! 414: hints.min_aspect.x, hints.min_aspect.y); ! 415: printf(" ==> Program supplied max aspect ratio: %d/%d\n", ! 416: hints.max_aspect.x, hints.max_aspect.y); ! 417: } ! 418: } ! 419: ! 420: ! 421: /* ! 422: * Display Size Hints info ! 423: */ ! 424: Display_Size_Hints(window) ! 425: Window window; ! 426: { ! 427: XSizeHints hints; ! 428: ! 429: if (!XGetNormalHints(dpy, window, &hints)) ! 430: printf("\n ==> No normal window size hints defined\n"); ! 431: else { ! 432: printf("\n ==> Normal window size hints:\n\n"); ! 433: Display_Hints(hints); ! 434: } ! 435: ! 436: if (!XGetZoomHints(dpy, window, &hints)) ! 437: printf("\n ==> No zoom window size hints defined\n"); ! 438: else { ! 439: printf("\n ==> Zoom window size hints:\n\n"); ! 440: Display_Hints(hints); ! 441: } ! 442: } ! 443: ! 444: ! 445: /* ! 446: * Display Window Manager Info ! 447: */ ! 448: static binding _state_hints[] = { ! 449: { DontCareState, "Don't Care State" }, ! 450: { NormalState, "Normal State" }, ! 451: { ZoomState, "Zoomed State" }, ! 452: { IconicState, "Iconic State" }, ! 453: { InactiveState, "Inactive State" }, ! 454: { 0, 0 } }; ! 455: ! 456: Display_WM_Info(window) ! 457: Window window; ! 458: { ! 459: XWMHints *wmhints; ! 460: long flags; ! 461: ! 462: wmhints = XGetWMHints(dpy, window); ! 463: if (!wmhints) { ! 464: printf("\n ==> No window manager hints defined\n"); ! 465: return; ! 466: } ! 467: flags = wmhints->flags; ! 468: ! 469: printf("\n ==> Window manager hints:\n\n"); ! 470: ! 471: if (flags & InputHint) ! 472: printf(" ==> Application accepts input? %s\n", ! 473: Lookup(wmhints->input, _bool)); ! 474: ! 475: if (flags & IconWindowHint) { ! 476: printf(" ==> Icon window id:"); ! 477: Display_Window_Id(wmhints->icon_window); ! 478: } ! 479: ! 480: if (flags & IconPositionHint) ! 481: printf(" ==> Initial icon position: %d, %d\n", ! 482: wmhints->icon_x, wmhints->icon_y); ! 483: ! 484: if (flags & StateHint) ! 485: printf(" ==> Initial state is %s\n", ! 486: Lookup(wmhints->initial_state, _state_hints)); ! 487: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.