On Sun, Mar 01, 2009 at 04:08:57PM -0600, David Fries wrote: > history and bug report: > I just upgraded fvwm and saw an edge bump behavior at the outside > paging border when moving a window. When a window was moved into the > panning window the poiner and window would be bumped so the pointer > was moved outside the panning window. This jumping was annoying and > was causing me to drop windows a pixel or two from the border, which I > would have to pickup and move again.
I don't understand the problem exactly. Can you give me precise instructions with a minimal config file? > This edge bump was introduced in 2.5.24 in virtual.c > revision 1.187 > date: 2007/09/11 18:48:57; author: domivogt; state: Exp; lines: +7 -7 > * Fixed jumping windows under some circumstances when releasing the button in > interactive motion while hitting the desktop's edge. I don't remember that exactly, but I still see a problem when I start moving windows with the keyboard. Windows sometimes move a pixel away from the right or bottom border of the page. My xemacs window is affected, but not my shells. > That change moved the check for if the window was paged to be too > early, in my debugging it is never hit. I moved it to right before xl > and yt are adjusted to be inside the panning windows. Otherwise xl > and yt are updated, but the pointer isn't moved. The real problem for > the jumping windows is in __move_loop. In HandlePaging xl and yt are > pointer locations and __move_loop treats them as window locations. > __move_loop would only transform the result if HandlePaging would > return 1 meaning that the desktop was paged (which in the above commit > disable the non-paging return). > > At least in my tests the 'Fake and event to force window reposition.' > in __move_loop isn't required, maybe it was just masking the > pointer to window location problem. I left it inside #if 0 for > someone else to look at. > > Something shorter for the CVS log or stick the above in them. > > fvwm/virtual.c > Moved the no paging check after delta is calculated but before xl and > yt are updated so they will be at the current pointer location. > > fvwm/move_resize.c > Transform from window to pointer location before calling HandlePaging > and back after the call. Previously it was only transforming when the > desktop was paged causing the window to jump when it wasn't paged. > > -- > David Fries <[email protected]> > http://fries.net/~david/ (PGP encryption key available) > > diff --git a/ChangeLog b/ChangeLog > index c44dbbb..4c1efbf 100644 > --- a/ChangeLog > +++ b/ChangeLog > @@ -1,3 +1,10 @@ > +2009-03-01 David Fries <[email protected]> > + * fvwm/virtual.c (HandlePaging): > + move no page detect check, it wasn't being hit > + * fvwm/move_resize.c (__move_loop): > + transform window position to pointer position and back when calling > + HandlePaging > + > 2009-02-23 Dominik Vogt <dominik(dot)vogt(at)gmx(dot)de> > > * NEWS: > diff --git a/NEWS b/NEWS > index d46bb5f..b718a3a 100644 > --- a/NEWS > +++ b/NEWS > @@ -5,6 +5,11 @@ Note, the changes for the last STABLE release start with > release > > Changes in beta release 2.5.28 (not released yet) > > +* Bug fixes: > + > + - There was a bump behavior when moving the window with the mouse > + and the border of the desktop was hit, fixed. > + > ------------------------------------------------------------------- > > Changes in beta release 2.5.27 (23-Feb-2009) > diff --git a/fvwm/move_resize.c b/fvwm/move_resize.c > index 06e180e..8a56118 100644 > --- a/fvwm/move_resize.c > +++ b/fvwm/move_resize.c > @@ -2404,28 +2404,33 @@ Bool __move_loop( > XEvent le; > > fev_get_last_event(&le); > + /* from window location to pointer position */ > + xl -= XOffset; > + yt -= YOffset; > rc = HandlePaging( > &le, dx, dy, &xl, &yt, &delta_x, &delta_y, > False, False, True, fw->edge_delay_ms_move); > + /* from pointer position to window location */ > + if (delta_x) > + { > + x_virtual_offset = 0; > + } > + xl += XOffset; > + if (delta_y) > + { > + y_virtual_offset = 0; > + } > + yt += YOffset; > + if (do_snap) > + { > + DoSnapAttract( > + fw, Width, Height, &xl, &yt); > + was_snapped = True; > + } > + #if 0 > if (rc == 1) > { > /* Fake an event to force window reposition */ > - if (delta_x) > - { > - x_virtual_offset = 0; > - } > - xl += XOffset; > - if (delta_y) > - { > - y_virtual_offset = 0; > - } > - yt += YOffset; > - if (do_snap) > - { > - DoSnapAttract( > - fw, Width, Height, &xl, &yt); > - was_snapped = True; > - } > fev_make_null_event(&e, dpy); > e.type = MotionNotify; > e.xmotion.time = fev_get_evtime(); > @@ -2434,6 +2439,7 @@ Bool __move_loop( > e.xmotion.same_screen = True; > break; > } > + #endif > } > if (rc == -1) > { > diff --git a/fvwm/virtual.c b/fvwm/virtual.c > index 9539fcf..382a791 100644 > --- a/fvwm/virtual.c > +++ b/fvwm/virtual.c > @@ -621,6 +621,8 @@ static void MapDesk(int desk, Bool grab) > * Check to see if the pointer is on the edge of the screen, and scroll/page > * if needed > * > + * xl, yt: if set is the pointer location relative to the root window > + * > * Returns > * 0: no paging > * 1: paging occured > @@ -798,13 +800,6 @@ int HandlePaging( > *delta_y = 0; > } > > - is_timestamp_valid = False; > - add_time = 0; > - if (*delta_x == 0 && *delta_y == 0) > - { > - return 0; > - } > - > /* Ouch! lots of bounds checking */ > if (Scr.Vx + *delta_x < 0) > { > @@ -868,6 +863,14 @@ int HandlePaging( > *yt = y - *delta_y; > } > > + is_timestamp_valid = False; > + add_time = 0; > + /* not paging means no warp pointer or xl yt update */ > + if (*delta_x == 0 && *delta_y == 0) > + { > + return 0; > + } > + > /* make sure the pointer isn't warped into the panframes */ > if (*xl < edge_thickness) > { > > Ciao Dominik ^_^ ^_^ -- Dominik Vogt
