2009/3/15 Jason Weber <baboon.im...@gmail.com>:
> 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);

Reply via email to