Fix for Mantis bug 0004 reported by nikty

"Window Maker does remember the size of windows, but for maximized windows it does not keep the position. When a maximized window appears it is shifted to the right for a few pixels (firefox, thunar) or both to the right and to the bottom (openoffice, vlc, virtualbox)."

  To reproduce:

* Launch some application which remembers its position. I used Thunar as suggested in the bug report.

  * Maximize!

  * Kill the application.

  * Launch it again.

* Maximize! The expected behaviour is that nothing would happen because the window should have started right where it was before. Observed behaviour is that it moves a few pixels.

After the patch we can verify that the maximize operation is idempotent with regards to geometry.

Tested with and without Xinerama, with and without a panel strutting one edge.
From 370cc696ec9c73dbcdd0de4aff1bbc2823ec09ef Mon Sep 17 00:00:00 2001
From: Iain Patterson <[email protected]>
Date: Fri, 9 Nov 2012 14:39:57 -0800
Subject: [PATCH] Maximized windows appear misplaced

Bug report from nikty:

"Window Maker does remember the size of windows, but for maximized windows it 
does not keep the position.
When a maximized window appears it is shifted to the right for a few pixels 
(firefox, thunar) or both to the right and to the bottom (openoffice, vlc, 
virtualbox)."

We weren't accounting for the window border when calculating whether the window 
would position correctly.
---
 src/window.c | 23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)

diff --git a/src/window.c b/src/window.c
index 199613c..9970c1a 100644
--- a/src/window.c
+++ b/src/window.c
@@ -1144,6 +1144,29 @@ WWindow *wManageWindow(WScreen *scr, Window window)
                        y -= wwin->frame->top_width + wwin->frame->bottom_width;
        }
 
+       /* wWindowConfigure() will account for the window border
+        * when placing so the window would be shifted without
+        * the adjustment below
+        */
+       if (HAS_BORDER(wwin)) {
+               WMRect rect;
+               WArea usableArea;
+               int head;
+
+               rect.pos.x = x;
+               rect.pos.y = y;
+               rect.size.width = 1;
+               rect.size.height = 1;
+
+               head = wGetHeadForRect(scr, rect);
+               usableArea = wGetUsableAreaForHead(scr, head, NULL, True);
+
+               if (x >= usableArea.x1 + 2 * FRAME_BORDER_WIDTH)
+                       x -= 2 * FRAME_BORDER_WIDTH;
+               if (y >= usableArea.y1 + 2 * FRAME_BORDER_WIDTH)
+                       y -= 2 * FRAME_BORDER_WIDTH;
+       }
+
        /*
         * wWindowConfigure() will init the client window's size
         * (wwin->client.{width,height}) and all other geometry
-- 
1.7.11.4

Reply via email to