clyde@ut-ngp.UUCP (04/02/87)
Here is something I put together to pull in windows which were off screen. This usually happens when you iconify a window too close to the edge of the screen. So this program will pull them back to a visible place on the display. --------------- CUT HERE --------------------- /* * xfixwindows - a program to find any off-screen windows and * move them sufficently on-screen to be grabbed with the mouse. * * Compilation info: * cc -o xfixwindows -O xfixwindows.c -lX * * Clyde Hoover * Computation Center, University of Texas at Austin * March 1987 */ #include <stdio.h> #include <X/Xlib.h> #define fatal(M) { perror(M); exit(1); } #define emptystack() StackTop = 0 #define push(W) WindowStack[++StackTop] = (W) int StackTop = 0; /* Top of window display stack */ Window WindowStack[64]; /* The window display stack */ int silent = 0; /* Mode */ main(argc, argv) int argc; char *argv[]; { char *display_name = 0; /* Server name */ Display *d; /* X server */ int nchildren; /* # of windows */ Window parent_win, /* Parent of root window */ *child_list; /* List of child windows */ WindowInfo win_info, /* Window info */ root_info; /* Root window info */ extern char *getenv(); display_name = getenv("DISPLAY"); if ((d = XOpenDisplay(display_name)) == NULL) fatal("Can't open display"); /* Get root window sizing info */ if (XQueryWindow(RootWindow, &root_info) == 0) fatal("Can't get root window info"); /* get a list of children of the root window */ if (XQueryTree(RootWindow, &parent_win, &nchildren, &child_list) == 0) fatal("Can't query window tree"); /* scan list */ for ( ; nchildren-- > 0; child_list++) { if (XQueryWindow(*child_list, &win_info) == 0) continue; /* * Check & fix the immediate root child window */ fixwindow(*child_list, &win_info, root_info.width, root_info.height); /* * Follow the chain of associated windows until the end * or until a previously seen window is found. */ emptystack(); push(*child_list); while (win_info.assoc_wind) { if (instack(win_info.assoc_wind)) break; push(win_info.assoc_wind); if (XQueryWindow(win_info.assoc_wind, &win_info)) fixwindow(win_info.assoc_wind, &win_info, root_info.width, root_info.height); else break; } } exit(0); } /* * instack - look for the given window in window display stack * * Returns: 1 if found * 0 if not */ instack(w) Window w; /* Window to look for */ { register int i = StackTop; /* Temp */ while (i) if (WindowStack[i--] == w) return(1); return(0); } /* * fixwindow - 'fix' position of this window if needed */ fixwindow(id, info, maxw, maxh) Window id; /* Window to 'fix' */ WindowInfo *info; /* Window information block */ int maxw, /* X limit for display */ maxh; /* Y limit for display */ { int newx, /* New X window coordinate */ newy; /* New Y window coordinate */ int fudge = 16; /* Window boundary fudge factor */ /* * See if this is a type of window that we don't care about */ if (info->type == IsUnmapped || info->mapped == IsInvisible || info->type == IsTransparent) return; newx = info->x; newy = info->y; /* * The 'fudge' factor here is how much of the outer (right & bottom) * edge of the display can't be accessed by the cursor, since * its hot-spot can be anywhere. We would really like to know what * the cursor shape is and where its hotspot is in order to make * this fudge factor correct, but no such luck - so we guess. */ /* * Make X origin within the display */ if (info->x < 0 || info->x > (maxw - fudge)) { if (info->x < 0) newx = 0; else newx = maxw - info->width; } /* * Make Y origin within the display */ if (info->y < 0 || info->y > (maxh - fudge)) { if (info->y < 0) newy = 0; else newy = maxh - info->height; } if (newx == info->x && newy == info->y) return; if (!silent) { char *wstate, *wtype, *win_name; /* Temp */ XFetchName(id, &win_name); switch(info->mapped) { case IsMapped: wstate = "mapped"; break; case IsUnmapped: wstate = "unmapped"; break; case IsInvisible: wstate = "invisible"; break; default: wstate = "unknown map"; break; } switch(info->type) { case IsTransparent: wtype = "transparent"; break; case IsOpaque: wtype = "opaque"; break; case IsIcon: wtype = "icon"; break; default: wtype = "unknown type"; break; } printf("Window %d \"%s\" [%s %s] at %d,%d -- moving to %d,%d\n", id, win_name, wstate, wtype, info->x, info->y, newx, newy); } XMoveWindow(id, newx, newy); /* Move the window */ } ---- end ---- -- Shouter-To-Dead-Parrots @ Univ. of Texas Computation Center; Austin, Texas clyde@ngp.cc.utexas.edu; ...!ut-sally!ut-ngp!clyde "It's a sort of a threat, you see. I've never been very good at them myself, but I've told they can be very effective."