summaryrefslogtreecommitdiff
authorDerek Upham <sand@blarg.net>2009-05-21 07:15:28 (GMT)
committer Peter Hutterer <peter.hutterer@who-t.net>2009-07-29 23:44:33 (GMT)
commit4dda242d56a7830d5b44d7e58cf6a95f62a617ce (patch) (side-by-side diff)
tree3c5ba30447f77833e77dfa9b82113d597a993af7
parent4efe0d272ed6ef7bda4cc005ad6033f2b1916fdc (diff)
downloadxf86-input-evdev-4dda242d56a7830d5b44d7e58cf6a95f62a617ce.zip
xf86-input-evdev-4dda242d56a7830d5b44d7e58cf6a95f62a617ce.tar.gz
evdev: Prevent driver from processing motion events that it has not configured. #21832
The current implementation initializes itself to support relative motion events, or absolute motion events, or neither. But the event-handling code attempts to process all events, no matter what the initialization was. This patch reproduces the flag tests found during init, to skip events that the driver doesn't support. Signed-off-by: Derek Upham <sand@blarg.net> Signed-off-by: Julien Cristau <jcristau@debian.org> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> (cherry picked from commit 0a3657d2ee62f4086e9687218cb33835ba61a0b3)
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--src/evdev.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/src/evdev.c b/src/evdev.c
index 3a9fb0e..490fa44 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -362,6 +362,10 @@ EvdevProcessEvent(InputInfoPtr pInfo, struct input_event *ev)
switch (ev->type) {
case EV_REL:
+ /* Ignore EV_REL events if we never set up for them. */
+ if (!(pEvdev->flags & EVDEV_RELATIVE_EVENTS))
+ break;
+
/* Handle mouse wheel emulation */
if (EvdevWheelEmuFilterMotion(pInfo, ev))
break;
@@ -392,6 +396,10 @@ EvdevProcessEvent(InputInfoPtr pInfo, struct input_event *ev)
break;
case EV_ABS:
+ /* Ignore EV_ABS events if we never set up for them. */
+ if (!(pEvdev->flags & EVDEV_ABSOLUTE_EVENTS))
+ break;
+
if (ev->code > ABS_MAX)
break;
pEvdev->vals[pEvdev->axis_map[ev->code]] = value;
@@ -1179,9 +1187,13 @@ EvdevInit(DeviceIntPtr device)
FIXME: somebody volunteer to fix this.
*/
- if (pEvdev->flags & EVDEV_RELATIVE_EVENTS)
+ if (pEvdev->flags & EVDEV_RELATIVE_EVENTS) {
EvdevAddRelClass(device);
- else if (pEvdev->flags & EVDEV_ABSOLUTE_EVENTS)
+ if (pEvdev->flags & EVDEV_ABSOLUTE_EVENTS)
+ xf86Msg(X_INFO,"%s: relative axes found, ignoring absolute "
+ "axes.\n", device->name);
+ pEvdev->flags &= ~EVDEV_ABSOLUTE_EVENTS;
+ } else if (pEvdev->flags & EVDEV_ABSOLUTE_EVENTS)
EvdevAddAbsClass(device);
#ifdef HAVE_PROPERTIES