2009/3/15 Jason Weber <[email protected]>:
> Start with one empty unified screen, two side by side monitors using
> twinview (same card, different plugs).
>
> Instance a new window, say a xterm.
>
> Slide it left and right so that the left or right edge passes from
> one monitor to the other. I believe that the window edge is supposed to
> snap with strong preference to keep the window on only one monitor.
>
> The only thing I know of that might be unusual is that my
> monitors' horizontal resolutions are different.
Well as long as X reports things correctly then FVWM will honour that,
so I think this a red-herring. I'm not in a position to test this
myself as I am sans Xinerama, but does the following patch do anything
to help "fix" this? I warn you it's complete theory on my part, so
expect a quirk or fifty. ;)
-- Thomas Adam
P.S. Also Cc'ed fvwm-workers which is what you should have done from
the outset.
Index: fvwm/move_resize.c
===================================================================
RCS file: /home/cvs/fvwm/fvwm/fvwm/move_resize.c,v
retrieving revision 1.304
diff -u -r1.304 move_resize.c
--- fvwm/move_resize.c 7 Dec 2007 18:52:21 -0000 1.304
+++ fvwm/move_resize.c 16 Mar 2009 01:11:21 -0000
@@ -2076,8 +2076,23 @@
/* snap to screen egdes */
if ((fw->snap_mode & SNAP_SCREEN) && fw->snap_proximity > 0)
{
+ /* TA: 20090315: Make sure windows being told to snap to a
+ * screen; honour Xinerama screens separately -- and don't
+ * treat the screen area as one huge screen.
+ */
+ rectangle screen;
+ int screen_width;
+
+ screen_width = Scr.MyDisplayWidth;
+
+ /* Get the parameters for the screen */
+ FScreenGetScrRect(NULL, FSCREEN_CURRENT, &screen.x, &screen.y,
+ &screen.width, &screen.height);
+ if (screen.width > 0)
+ screen_width = screen.width;
+
/* horizontally */
- if (!(Scr.MyDisplayWidth < (*px) ||
+ if (!(screen_width < (*px) ||
(*px + self.width) < 0))
{
dist = abs(Scr.MyDisplayHeight - (*py + self.height));
@@ -2119,23 +2134,23 @@
(*py + self.height) < 0))
{
dist = abs(
- Scr.MyDisplayWidth - (*px + self.width));
+ screen_width - (*px + self.width));
if (dist < closestRight)
{
closestRight = dist;
- if (*px + self.width >= Scr.MyDisplayWidth &&
+ if (*px + self.width >= screen_width &&
*px + self.width <
- Scr.MyDisplayWidth + fw->snap_proximity)
+ screen_width + fw->snap_proximity)
{
- nxl = Scr.MyDisplayWidth - self.width;
+ nxl = screen_width - self.width;
}
if (*px + self.width >=
- Scr.MyDisplayWidth - fw->snap_proximity &&
- *px + self.width < Scr.MyDisplayWidth)
+ screen_width - fw->snap_proximity &&
+ *px + self.width < screen_width)
{
- nxl = Scr.MyDisplayWidth - self.width;
+ nxl = screen_width - self.width;
}
}
dist = abs(*px);