Nasty user mouse/keyboard move & resizing bugs from pointer warping


I've been looking at the following bugs:

  bug 124582 - (Mouse/keyboard) snap resizing erroneously snaps wrong
               directions too
  bug 122670 - Jerky/random resizing of windows via keyboard
  bug 154706 - bouncing weirdness at screen edge with keyboard move or

All three of them are caused by warping the pointer (well, plus some
other mouse-related stuff that could easily be fixed up), and although
154706 can be fixed and the other two made far less severe (i.e. so
that they are only annoying problems instead of
nearly-make-it-unusable problems) within the current framework, they
can't be fully fixed without doing something different.

The problem is that warping the pointer causes various events,
MotionNotify in particular.  We update moves and resizes in response
to these "mouse movements" (despite being fabricated) and it breaks
stuff.  Although we can fix up the display->grab_* vars quite a bit so
that most MotionNotify events won't cause weirdness, we will
eventually get a MotionNotify event corresponding to some by-then
ancient pointer warp when several other resizes have already occurred.

We have four options, as far as I can tell:
  (1) Decide that the approximate fix-ups are good enough (check out
      the constraints_experiments branch if you want to play around with
      it, but be warned that there are other important regressions and
      bugs in that branch).
  (2) Stop warping the pointer (possibly hide it and show a fake
      pointer instead)
  (3) Find a way to warp the pointer in a way that doesn't generate
      mouse events (i.e. not with XWarpPointer() as we currently do)
  (4) Make keyboard and mouse moving/resizing orthogonal--after the
      user move/resize operation has started (e.g. due to pressing
      Alt+F7 or Alt+F8), allow either keyboard or mouse events to
      trigger updates, but as soon as one kind of event has happened
      ignore all events of the other kind (except maybe stuff to end
      the grab_op, such as hitting the Escape key or clicking).

Thoughts, opinions, ideas?


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]