On Mon, Mar 16, 2009 at 01:14:20AM +0000, Thomas Adam wrote:
> 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,
You can test Xinerama if you configure fvwm with
--enable-xinerame-emulation.
> 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);
Ciao
Dominik ^_^ ^_^
--
Dominik Vogt