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 <tiago.vignatti@nokia.com> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
parent
d573cc46d3
commit
f9a2fff224
67
mi/mieq.c
67
mi/mieq.c
|
@ -367,39 +367,48 @@ mieqProcessDeviceEvent(DeviceIntPtr dev,
|
||||||
/* Custom event handler */
|
/* Custom event handler */
|
||||||
handler = miEventQueue.handlers[event->any.type];
|
handler = miEventQueue.handlers[event->any.type];
|
||||||
|
|
||||||
if (dev && screen && screen != DequeueScreen(dev) && !handler) {
|
switch (event->any.type) {
|
||||||
/* Assumption - screen switching can only occur on motion events. */
|
/* Catch events that include valuator information and check if they
|
||||||
DequeueScreen(dev) = screen;
|
* are changing the screen */
|
||||||
x = event->device.root_x;
|
case ET_Motion:
|
||||||
y = event->device.root_y;
|
case ET_KeyPress:
|
||||||
NewCurrentScreen (dev, DequeueScreen(dev), x, y);
|
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)
|
if (master)
|
||||||
master->u.lastSlave = dev;
|
master->u.lastSlave = dev;
|
||||||
|
|
||||||
/* If someone's registered a custom event handler, let them
|
/* If someone's registered a custom event handler, let them
|
||||||
* steal it. */
|
* steal it. */
|
||||||
if (handler)
|
if (handler)
|
||||||
{
|
{
|
||||||
int screenNum = dev && DequeueScreen(dev) ? DequeueScreen(dev)->myNum : (screen ? screen->myNum : 0);
|
int screenNum = dev && DequeueScreen(dev) ? DequeueScreen(dev)->myNum : (screen ? screen->myNum : 0);
|
||||||
handler(screenNum, event, dev);
|
handler(screenNum, event, dev);
|
||||||
/* Check for the SD's master in case the device got detached
|
/* Check for the SD's master in case the device got detached
|
||||||
* during event processing */
|
* during event processing */
|
||||||
if (master && dev->u.master)
|
if (master && dev->u.master)
|
||||||
handler(screenNum, &mevent, master);
|
handler(screenNum, &mevent, master);
|
||||||
} else
|
} else
|
||||||
{
|
{
|
||||||
/* process slave first, then master */
|
/* process slave first, then master */
|
||||||
dev->public.processInputProc(event, dev);
|
dev->public.processInputProc(event, dev);
|
||||||
|
|
||||||
/* Check for the SD's master in case the device got detached
|
/* Check for the SD's master in case the device got detached
|
||||||
* during event processing */
|
* during event processing */
|
||||||
if (master && dev->u.master)
|
if (master && dev->u.master)
|
||||||
master->public.processInputProc(&mevent, master);
|
master->public.processInputProc(&mevent, master);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue