[PATCH 1/2] mi: fix cursor warping screens

Vignatti Tiago (Nokia-D/Helsinki) tiago.vignatti at nokia.com
Thu Aug 6 09:36:13 PDT 2009


On Thu, Aug 06, 2009 at 03:11:16AM +0200, Peter Hutterer wrote:
> On Wed, Aug 05, 2009 at 09:18:55PM +0300, y at mgw-mx09.nokia.com wrote:
> > From: Tiago Vignatti <tiago.vignatti at nokia.com>
> > 
> > The server was processing ET_RawMotion type when the cursor was wrapping to
> > another screen and getting wrong valuator values. This fix such issue
> > considering only ET_Motion, ET_KeyPress, ET_KeyRelease, ET_ButtonPress and
> > ET_ButtonRelease types when the cursor detects a new screen.
> > 
> > Signed-off-by: Tiago Vignatti <tiago.vignatti at nokia.com>
> > ---
> >  mi/mieq.c |   24 ++++++++++++++++--------
> >  1 files changed, 16 insertions(+), 8 deletions(-)
> > 
> > diff --git a/mi/mieq.c b/mi/mieq.c
> > index 6ec2dba..b52ed84 100644
> > --- a/mi/mieq.c
> > +++ b/mi/mieq.c
> > @@ -367,14 +367,22 @@ mieqProcessDeviceEvent(DeviceIntPtr dev,
> >      /* Custom event handler */
> >      handler = miEventQueue.handlers[event->any.type];
> >  
> > -    if (dev && screen && screen != DequeueScreen(dev) && !handler) {
> > -        /* Assumption - screen switching can only occur on motion events. */
> > -        DequeueScreen(dev) = screen;
> > -        x = event->device.root_x;
> > -        y = event->device.root_y;
> > -        NewCurrentScreen (dev, DequeueScreen(dev), x, y);
> > -    }
> > -    else {
> > +    switch (event->any.type) {
> > +        /* Catch events that include valuator information and check if they
> > +         * are changing the screen */
> > +        case ET_Motion:
> > +        case ET_KeyPress:
> > +        case ET_KeyRelease:
> > +        case ET_ButtonPress:
> > +        case ET_ButtonRelease:
> > +            if (dev && screen && screen != DequeueScreen(dev) && !handler) {
> > +                DequeueScreen(dev) = screen;
> > +                x = event->device.root_x;
> > +                y = event->device.root_y;
> > +                NewCurrentScreen (dev, DequeueScreen(dev), x, y);
> > +                break;
> > +            }
> 
> please always add a comment when an intentional fallthrough is used in a
> switch statement.

I agree with you Peter. The readability of this chunk (and all
mieqProcessInputEvents) is pretty bad :(


> anyway, having a return instead of a break after the dequeue stuff means we
> wouldn't need the large default block. 

yeah, return there makes more sense. But I guess you meant we indeed need the
default block, but not for catch that kinds of events (ET_Motion, ET_KeyPress,
etc).

 
> This whole thing looks odd though. If the screen switch happens on a button
> or key release event, the event isn't processed and we'd end up with a stuck
> button or key.

agreed.


> I think the return is only supposed to happen on a ET_Motion, with the other
> events falling through to the default case.

What about this patched attached? This fix the cursor warping screens and keep
processing those kind of events (it doesn't return on ET_Motion as you stated).


            Tiago
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-mi-fix-cursor-warping-screens.patch
Type: text/x-diff
Size: 0 bytes
Desc: not available
Url : http://lists.x.org/archives/xorg-devel/attachments/20090806/d0156f02/attachment-0001.patch 


More information about the xorg-devel mailing list