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 */
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue