On Thu, Aug 06, 2009 at 07:36:13PM +0300, Vignatti Tiago (Nokia-D/Helsinki) wrote: > From 537a0a954dea9d2dd8260090822acc1010070326 Mon Sep 17 00:00:00 2001 > From: Tiago Vignatti <[email protected]> > Date: Wed, 5 Aug 2009 21:02:29 +0300 > Subject: [PATCH] mi: fix cursor warping screens > > 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, keeping the > "normal" processing of device events. > > Signed-off-by: Tiago Vignatti <[email protected]> > --- > mi/mieq.c | 24 ++++++++++++++++-------- > 1 files changed, 16 insertions(+), 8 deletions(-) > > diff --git a/mi/mieq.c b/mi/mieq.c > index 6ec2dba..da110c3 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); > + } > + /* No break here. Intentional fallthrough */ > + default: > master = CopyGetMasterEvent(dev, event, &mevent); > > if (master) > -- > 1.5.6.3
How about the patch attached. It ends up being the same logic but the code looks nicer (even though the patch doesn't). Instead of the fallthrough into the default statement, the default block is moved out of the switch. This leaves one remaining issue though. Previously, the code would not process motion events if a screen switch takes place. I've already explained why we can't drop button and key events but - should we still drop motion events? i.e. do we need a if (type == motion) return; after the NewCurrentScreen? Cheers, Peter
>From 8fa7ba401cd257508d3b7db286dc87d3cf070b82 Mon Sep 17 00:00:00 2001 From: Tiago Vignatti <[email protected]> Date: Wed, 5 Aug 2009 21:02:29 +0300 Subject: [PATCH] mi: fix cursor warping screens 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, keeping the "normal" processing of device events. Signed-off-by: Tiago Vignatti <[email protected]> Signed-off-by: Peter Hutterer <[email protected]> --- mi/mieq.c | 67 ++++++++++++++++++++++++++++++++++-------------------------- 1 files changed, 38 insertions(+), 29 deletions(-) diff --git a/mi/mieq.c b/mi/mieq.c index 6ec2dba..b27e9da 100644 --- a/mi/mieq.c +++ b/mi/mieq.c @@ -367,39 +367,48 @@ 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); + 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; + default: + break; } - else { - master = CopyGetMasterEvent(dev, event, &mevent); + master = CopyGetMasterEvent(dev, event, &mevent); - if (master) - master->u.lastSlave = dev; + if (master) + master->u.lastSlave = dev; - /* If someone's registered a custom event handler, let them - * steal it. */ - if (handler) - { - int screenNum = dev && DequeueScreen(dev) ? DequeueScreen(dev)->myNum : (screen ? screen->myNum : 0); - handler(screenNum, event, dev); - /* Check for the SD's master in case the device got detached - * during event processing */ - if (master && dev->u.master) - handler(screenNum, &mevent, master); - } else - { - /* process slave first, then master */ - dev->public.processInputProc(event, dev); + /* If someone's registered a custom event handler, let them + * steal it. */ + if (handler) + { + int screenNum = dev && DequeueScreen(dev) ? DequeueScreen(dev)->myNum : (screen ? screen->myNum : 0); + handler(screenNum, event, dev); + /* Check for the SD's master in case the device got detached + * during event processing */ + if (master && dev->u.master) + handler(screenNum, &mevent, master); + } else + { + /* process slave first, then master */ + dev->public.processInputProc(event, dev); - /* Check for the SD's master in case the device got detached - * during event processing */ - if (master && dev->u.master) - master->public.processInputProc(&mevent, master); - } + /* Check for the SD's master in case the device got detached + * during event processing */ + if (master && dev->u.master) + master->public.processInputProc(&mevent, master); } } -- 1.6.3.rc1.2.g0164.dirty
_______________________________________________ xorg-devel mailing list [email protected] http://lists.x.org/mailman/listinfo/xorg-devel
