#include /* Copyright 1985, Massachusetts Institute of Technology */ /* * xwininfo.c - MIT Project Athena, X Window system window * information utility. * * This program will report all relavent information * about a specific window. * * Author: Tony Della Fera, DEC * 27-Nov-84 */ #ifndef lint static char *rcsid_xhost_c = "$Header: xwininfo.c,v 10.5 86/02/01 16:08:18 tony Rel $"; #endif #include #include #include "../cursors/target.cursor" #include "../cursors/target_mask.cursor" #include typedef enum _bool {FALSE, TRUE} Bool; #define MAX(a, b) (a) > (b) ? (a) : (b) #define MIN(a, b) (a) < (b) ? (a) : (b) #define ABS(a) (a) < 0 ? -(a) : (a) #define FAILURE 0 char *index(); extern int errno; main(argc, argv) int argc; char **argv; { int mse_x, mse_y; int rel_mse_x, rel_mse_y; int w0, h0, w_inc, h_inc; int lr_rel_x, lr_rel_y; int root_w, root_h; int num_children; int status; char display[256]; char *strind = NULL; char *win_name = NULL; char *id = NULL; char *win_fmt = " 0x%x\n"; Bool children = FALSE; Bool root_switch = FALSE; register int i; Window target_win; Window temp_win; Window parent_win; Window *child_list; WindowInfo win_info; Cursor cursor; XButtonPressedEvent event; display[0] = '\0'; for (i = 1; i < argc; i++) { strind = index(argv[i], ':'); if (strind != NULL) { (void) strncpy(display, argv[i], sizeof(display)); continue; } strind = index (argv [i], '-'); if (strind == NULL) Syntax(argv[0]); if (strncmp(argv [i], "-children", 9) == 0) { children = TRUE; continue; } if (strncmp(argv [i], "-help", 5) == 0) { Syntax(argv[0]); } if (strncmp(argv [i], "-id", 3) == 0) { if (++i >= argc) Syntax(argv[0]); id = argv[i]; continue; } if (strncmp(argv [i], "-int", 4) == 0) { win_fmt = " %d\n"; continue; } if (strncmp(argv [i], "-root", 5) == 0) { root_switch = TRUE; continue; } Syntax(argv[0]); } if (XOpenDisplay(display) == NULL) Error("Couldn't Open display."); /* * Store the target cursor incase we need it. */ cursor = XCreateCursor( target_width, target_height, target_bits, target_mask_bits, 8, 8, BlackPixel, WhitePixel, GXcopy ); if (cursor == FAILURE) { Error("Error occured while trying to store target cursor."); } /* * Depending on the state of the root and id switches, get the * target window from the user. */ if (root_switch) { /* * The root window selected on the command line. */ target_win = RootWindow; } else { if (id != NULL) { /* * A window id was provided on the command line. */ (void) sscanf(id, "0x%x", &target_win); if (target_win == 0) { /* * Then the target was entered in decimal. */ (void) sscanf(id, "%d", &target_win); if (target_win == 0) { Error("Invalid window id format."); } } } else { /* * No selection was provided on the command line. * Allow the user to select a window with the mouse. */ status = XGrabMouse(RootWindow, cursor, ButtonPressed); if (status == FAILURE) Error("Can't grab the mouse."); printf("\n"); printf("xwininfo ==> Please select the window you wish\n"); printf(" ==> information on by clicking the\n"); printf(" ==> mouse in that window.\n"); XNextEvent(&event); target_win = event.subwindow; XUngrabMouse(); if (target_win == 0) { /* * The user must have indicated the root window. */ target_win = RootWindow; } } } status = XQueryMouse(RootWindow, &mse_x, &mse_y, &temp_win); if (status == FAILURE) Error("Can't query mouse on Root Window."); if (target_win == RootWindow){ rel_mse_x = mse_x; rel_mse_y = mse_y; } else { status = XQueryMouse(target_win, &rel_mse_x, &rel_mse_y, &temp_win); if (status == FAILURE) Error("Can't query mouse on target window."); } status = XQueryWindow(RootWindow, &win_info); if (status == FAILURE) Error("Couldn't query root window."); root_w = win_info.width; root_h = win_info.height; status = XQueryWindow(target_win, &win_info); if (status == FAILURE) Error("Couldn't query target window."); lr_rel_x = root_w - (win_info.x + win_info.width + (win_info.bdrwidth << 1)); lr_rel_y = root_h - (win_info.y + win_info.height + (win_info.bdrwidth << 1)); status = XFetchName(target_win, &win_name); if (status == FAILURE) Error("Can't fetch window name."); status = XQueryTree(target_win, &parent_win, &num_children, &child_list); if (status == FAILURE) Error("Can't query window tree."); (void) XGetResizeHint(target_win, &w0, &h0, &w_inc, &h_inc); printf("\nxwininfo ==> Window name: '%s'\n", win_name); printf(" ==> Window id:"); printf(win_fmt, target_win); printf(" ==> Parent window id:"); printf(win_fmt, parent_win); printf(" ==> Number of children: %d\n", num_children); if (children) { for (i = num_children - 1; i >= 0; i--) { printf(" ==> Child window id:"); printf(win_fmt, child_list[i]); } } printf(" ==> Associated window id:"); printf(win_fmt, win_info.assoc_wind); printf(" ==> Window type: "); switch (win_info.type) { case IsTransparent: printf("IsTransparent\n"); break; case IsOpaque: printf("IsOpaque\n"); break; case IsIcon: printf("IsIcon\n"); break; default: printf("Unknown %d?\n", win_info.type); break; } printf(" ==> Window state: "); switch (win_info.mapped) { case IsMapped: printf("IsMapped\n"); break; case IsUnmapped: printf("IsUnmapped\n"); break; case IsInvisible: printf("IsInvisible\n"); break; default: printf("Unknown %d?\n", win_info.mapped); break; } printf(" ==> Upper left X: %d\n", win_info.x); printf(" ==> Upper left Y: %d\n", win_info.y); printf(" ==> Width: %d\n", win_info.width); printf(" ==> Height: %d\n", win_info.height); printf(" ==> Border width: %d\n", win_info.bdrwidth); printf(" ==> Geometry specification:\n"); printf(" ==> Upper left =%dx%d+%d+%d\n", win_info.width, win_info.height, win_info.x, win_info.y); printf(" ==> Lower right =%dx%d-%d-%d\n", win_info.width, win_info.height, lr_rel_x, lr_rel_y); printf(" ==> Resize base width: %d\n", w0); printf(" ==> Resize base height: %d\n", h0); printf(" ==> Resize width increment: %d\n", w_inc); printf(" ==> Resize height increment: %d\n", h_inc); printf(" ==> Root absolute mouse X Position: %d\n", mse_x); printf(" ==> Root absolute mouse Y Position: %d\n", mse_y); printf(" ==> Target relative mouse X Position: %d\n", rel_mse_x); printf(" ==> Target relative mouse Y Position: %d\n", rel_mse_y); printf("\n"); exit(0); } /* * Report the syntax for calling xwininfo. */ Syntax(call) char *call; { fprintf(stderr, "\n"); fprintf(stderr, "Usage: %s [-children] [-help] [-id ] [-int] ", call); fprintf(stderr, "[-root] [[host]:vs]\n\n"); exit(0); } /* * Error - Fatal xwininfo error. */ Error(string) char *string; /* Error description string. */ { fprintf(stderr, "\nxwininfo: %s", string); fprintf(stderr, "\n\n"); if (errno != 0) { perror("xwininfo"); fprintf(stderr, "\n"); } exit(1); }