aboutsummaryrefslogtreecommitdiff
path: root/x11-wm/tvtwm/files/patch-twm.c
diff options
context:
space:
mode:
authorKirill Ponomarev <krion@FreeBSD.org>2009-10-22 11:19:26 +0000
committerKirill Ponomarev <krion@FreeBSD.org>2009-10-22 11:19:26 +0000
commita460ef1b57ca21eb40d427c78619bfcd6d097d4a (patch)
tree34305ddfea671063af1b27256b3b57e27035a85a /x11-wm/tvtwm/files/patch-twm.c
parent513c24c19d7370aa7a6a172794ffedefc82ced20 (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.c229
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
++ }
++ }
++
++}
++