--- twm.c-orig 2009-10-10 20:22:14.000000000 +0200 +++ twm.c 2009-10-10 20:31:33.000000000 +0200 @@ -185,6 +185,9 @@ static int CatchRedirectError(); /* for settting RedirectError */ static int TwmErrorHandler(); /* for everything else */ static void SetRootProperties(); /* leave note on root window */ +static void DisplayHints(XSizeHints *); /* PI-FIX */ +static void calcgeo(Display *, Drawable, int *, int *, int *, int *); /* PI-FIX */ + char Info[INFO_LINES][INFO_SIZE]; /* info strings to print */ int InfoLines; char *InitFile = NULL; @@ -248,6 +251,14 @@ int i, j, sync = FALSE; unsigned long valuemask; /* mask for create windows */ XSetWindowAttributes attributes; /* attributes for create windows */ +/* PI-FIX */ + XSizeHints mywmhints; + long mylong; + int res; + int minx = 0, miny = 0; + int *relx, *rely; + int rx, ry; +/* PI-FIX */ int numManaged, firstscrn, lastscrn, scrnum; extern ColormapWindow *CreateColormapWindow(); SIGNAL_T QueueRestartTwm(); @@ -631,6 +640,67 @@ Scr->iconmgr.twm_win->isicon = TRUE; /* + * allocate some space for relx, rely values + */ + relx = (int *) malloc(nchildren * sizeof(int)); + rely = (int *) malloc(nchildren * sizeof(int)); + + /* + * print a lot of information for each children + */ + for (i = 0; i < nchildren; i++) { + if (children[i]) { + XWMHints *wmhintsp = XGetWMHints (dpy, children[i]); + +#ifdef DEBUG + if (wmhintsp) { + if (wmhintsp->flags) { + printf(" wmhints i: %d w: 0x%x flags: %d ", + i,children[i], wmhintsp->flags + ); + if ( wmhintsp->flags & StateHint ) { + printf("state: %d ",wmhintsp->initial_state); + } + printf("\n"); + } + } + res = XGetWMNormalHints(dpy, children[i], &mywmhints, &mylong); + if (res != 0) { + DisplayHints(&mywmhints); + } + res = XGetWMSizeHints(dpy, children[i], &mywmhints, &mylong, + XA_WM_ZOOM_HINTS); + if ( res != 0 ) { + DisplayHints(&mywmhints); + } + else { + printf(" no zoom hints\n"); + } +#endif + calcgeo(dpy, children[i], &minx, &miny, &rx, &ry); + relx[i] = rx; + rely[i] = ry; + } + } + +#ifdef DEBUG + printf("minx: %d miny: %d\n", minx, miny); +#endif + + /* + * move each children in the positive + */ + for (i = 0; i < nchildren; i++) { + if (children[i]) { + if ( children[i] != Scr->Panner && + children[i] != Scr->VirtualDesktop) { + /* HACK: only relx gets corrected */ + res = XMoveWindow(dpy, children[i], relx[i]-minx, rely[i]); + } + } + } + + /* * weed out icon windows */ for (i = 0; i < nchildren; i++) { @@ -786,6 +856,7 @@ { XClientMessageEvent ev; +printf("restart requested\n"); ev.type = ClientMessage; ev.window = Scr->Root; ev.message_type = _XA_TWM_RESTART; @@ -1248,3 +1319,125 @@ _XA_TWM_MACHINE = XInternAtom (dpy, "_TWM_MACHINE", False); } + +/* stolen from xwininfo */ +/* + * Display a set of size hints + */ +static void +DisplayHints(XSizeHints *hints) +{ + long flags; + + flags = hints->flags; + + if (flags & USPosition) + printf(" User supplied location: %d, %d\n", + hints->x, hints->y); + + if (flags & PPosition) + printf(" Program supplied location: %d, %d\n", + hints->x, hints->y); + + if (flags & USSize) { + printf(" User supplied size: %d by %d\n", + hints->width, hints->height); + } + + if (flags & PSize) + printf(" Program supplied size: %d by %d\n", + hints->width, hints->height); + + if (flags & PMinSize) + printf(" Program supplied minimum size: %d by %d\n", + hints->min_width, hints->min_height); + + if (flags & PMaxSize) + printf(" Program supplied maximum size: %d by %d\n", + hints->max_width, hints->max_height); + + if (flags & PBaseSize) { + printf(" Program supplied base size: %d by %d\n", + hints->base_width, hints->base_height); + } + + if (flags & PResizeInc) { + printf(" Program supplied x resize increment: %d\n", + hints->width_inc); + printf(" Program supplied y resize increment: %d\n", + hints->height_inc); + if (hints->width_inc != 0 && hints->height_inc != 0) { + if (flags & USSize) + printf(" User supplied size in resize increments: %d/%d by %d/%d\n", + hints->width, hints->width_inc, + hints->height, hints->height_inc); + if (flags & PSize) + printf(" Program supplied size in resize increments: %d/%d by %d/%d\n", + hints->width, hints->width_inc, + hints->height, hints->height_inc); + if (flags & PMinSize) + printf(" Program supplied minimum size in resize increments: %d/%d by %d/%d\n", + hints->min_width, hints->width_inc, + hints->min_height, hints->height_inc); + if (flags & PBaseSize) + printf(" Program supplied base size in resize increments: %d/%d by %d/%d\n", + hints->base_width, hints->width_inc, + hints->base_height, hints->height_inc); + } + } + + if (flags & PAspect) { + printf(" Program supplied min aspect ratio: %d/%d\n", + hints->min_aspect.x, hints->min_aspect.y); + printf(" Program supplied max aspect ratio: %d/%d\n", + hints->max_aspect.x, hints->max_aspect.y); + } + + if (flags & PWinGravity) { + printf(" Program supplied window gravity: %d\n", + hints->win_gravity); + } +} + +/* stolen from xwininfo */ +/* + * print geometry + */ +static void +calcgeo(Display *dpy, Drawable d, int *minxp, int *minyp, int *rxp, int *ryp) +{ + int rel_x, rel_y, abs_x, abs_y; + unsigned int width, height, border, depth; + Window root; + Window child; + + if (XGetGeometry(dpy, d, &root, + &rel_x, &rel_y, &width, &height, &border, &depth)) { + +#ifdef DEBUG + printf (" %ux%u+%d+%d", width, height, rel_x, rel_y); +#endif + *rxp = rel_x; + *ryp = rel_y; +#ifdef DEBUG + printf(" vorher min: %d %d", *minxp, *minyp); +#endif + if ( *minxp > rel_x ) { + *minxp = rel_x; + } + if ( *minyp > rel_y ) { + *minyp = rel_y; + } +#ifdef DEBUG + printf(" nachher min: %d %d\n", *minxp, *minyp); +#endif + if (XTranslateCoordinates (dpy, d, root, + 0 ,0, &abs_x, &abs_y, &child)) { +#ifdef DEBUG + printf (" +%d+%d\n", abs_x - border, abs_y - border); +#endif + } + } + +} +