aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab@redhat.com>2013-01-08 15:04:07 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2013-01-08 15:07:04 +1000
commit454194f4b530af5d7f92a3b28c28495b4faac547 (patch)
tree3cf29e70d669991b0b3bad68d2a67f63f6ba2e01
parentDrop special XKB option handling (diff)
downloadxf86-input-evdev-454194f4b530af5d7f92a3b28c28495b4faac547.tar.gz
xf86-input-evdev-454194f4b530af5d7f92a3b28c28495b4faac547.tar.bz2
xf86-input-evdev-454194f4b530af5d7f92a3b28c28495b4faac547.zip
Force a button if MT axes are present and it is not a gamepad
We expect at least BTN_TOUCH for anything with MT axes, but devices that don't have that need a button class regardless. Some gamepads define MT axes but no buttons, causing a bug in the server when they post a TouchBegin. [ 97436.293] (EE) BUG: triggered 'if (!b || !v)' [ 97436.293] (EE) BUG: exevents.c:929 in UpdateDeviceState() So, ignore it, if it is a joystick (e. g. if it have BTN_JOYSTICK defined). Otherwise, fake a button. This patch basically merges two patches written by Peter Hutterer <peter.hutterer@who-t.net>. Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-rw-r--r--src/evdev.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/src/evdev.c b/src/evdev.c
index 7b355d7..5667dc1 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -2160,8 +2160,20 @@ EvdevProbe(InputInfoPtr pInfo)
xf86IDrvMsg(pInfo, X_PROBED, "Found absolute axes\n");
pEvdev->flags |= EVDEV_ABSOLUTE_EVENTS;
- if (has_mt)
+ if (has_mt) {
xf86IDrvMsg(pInfo, X_PROBED, "Found absolute multitouch axes\n");
+ if (num_buttons == 0) {
+ if (EvdevBitIsSet(pEvdev->key_bitmask, BTN_JOYSTICK)) {
+ xf86IDrvMsg(pInfo, X_INFO, "Device is a Joystick with MT without buttons. Ignoring it.\n");
+ goto out;
+ } else {
+ xf86IDrvMsg(pInfo, X_INFO, "No buttons found, faking one.\n");
+ num_buttons = 1;
+ pEvdev->num_buttons = num_buttons;
+ pEvdev->flags |= EVDEV_BUTTON_EVENTS;
+ }
+ }
+ }
if ((EvdevBitIsSet(pEvdev->abs_bitmask, ABS_X) &&
EvdevBitIsSet(pEvdev->abs_bitmask, ABS_Y))) {
@@ -2276,6 +2288,7 @@ EvdevProbe(InputInfoPtr pInfo)
pEvdev->flags |= EVDEV_RELATIVE_EVENTS;
}
+out:
if (rc)
xf86IDrvMsg(pInfo, X_WARNING, "Don't know how to use device\n");