From f9a2fff2248d7254958857677cabfea914ed4853 Mon Sep 17 00:00:00 2001 From: Tiago Vignatti Date: Wed, 5 Aug 2009 21:02:29 +0300 Subject: 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 Signed-off-by: Peter Hutterer --- mi/mieq.c | 67 ++++++++++++++++++++++++++++++++++++--------------------------- 1 file changed, 38 insertions(+), 29 deletions(-) (limited to 'mi') diff --git a/mi/mieq.c b/mi/mieq.c index 6ec2dba08..b27e9da22 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); } } -- cgit v1.2.3