diff options
author | Kirill Ponomarev <krion@FreeBSD.org> | 2009-10-22 11:19:26 +0000 |
---|---|---|
committer | Kirill Ponomarev <krion@FreeBSD.org> | 2009-10-22 11:19:26 +0000 |
commit | a460ef1b57ca21eb40d427c78619bfcd6d097d4a (patch) | |
tree | 34305ddfea671063af1b27256b3b57e27035a85a /x11-wm/tvtwm/files/patch-twm.c | |
parent | 513c24c19d7370aa7a6a172794ffedefc82ced20 (diff) |
- Fix windows behaviour after restart
- Fix virtual screen behaviour after restart
- Fix printing issue with Firefox3 which caused tvtwm to restart
PR: ports/139490
Submitted by: Kurt Jaeger <pi@opsec.eu>
Notes
Notes:
svn path=/head/; revision=243210
Diffstat (limited to 'x11-wm/tvtwm/files/patch-twm.c')
-rw-r--r-- | x11-wm/tvtwm/files/patch-twm.c | 229 |
1 files changed, 229 insertions, 0 deletions
diff --git a/x11-wm/tvtwm/files/patch-twm.c b/x11-wm/tvtwm/files/patch-twm.c new file mode 100644 index 000000000000..3ee4f71f5fa0 --- /dev/null +++ b/x11-wm/tvtwm/files/patch-twm.c @@ -0,0 +1,229 @@ +--- 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 ++ } ++ } ++ ++} ++ |