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);