From c7e48a1306e3f9a1d1f41e4fcc51eac2601b8b79 Mon Sep 17 00:00:00 2001 From: Peter Korsgaard Date: Mon, 23 May 2011 12:02:09 +0200 Subject: [PATCH] evdev: handle touchscreens without BTN_TOUCH Some touchscreens (like the Lumio crystaltouch in single touch mode) send BTN_LEFT rather than BTN_TOUCH: Input driver version is 1.0.1 Input device ID: bus 0x3 vendor 0x202e product 0x5 version 0x111 Input device name: "LUMIO Inc LUMIO CrystalTouch ver 1.1C" Supported events: Event type 0 (Sync) Event type 1 (Key) Event code 272 (LeftBtn) Event code 273 (RightBtn) Event code 274 (MiddleBtn) Event type 2 (Relative) Event code 9 (Misc) Event type 3 (Absolute) Event code 0 (X) Value 650 Min 0 Max 4095 Event code 1 (Y) Value 3221 Min 0 Max 4095 Event type 4 (Misc) Event code 4 (ScanCode) Testing ... (interrupt to exit) Event: time 1305882024.934011, type 4 (Misc), code 4 (ScanCode), value 90001 Event: time 1305882024.934017, type 1 (Key), code 272 (LeftBtn), value 1 Event: time 1305882024.934029, type 3 (Absolute), code 0 (X), value 270 Event: time 1305882024.934034, type 3 (Absolute), code 1 (Y), value 1513 Event: time 1305882024.934039, type 2 (Relative), code 9 (Misc), value 1 This causes evdev to handle these device as a mouse rather than a touchscreen, which naturally doesn't work very well. We already internally translate BTN_TOUCH as BTN_LEFT, so accept this kind of devices as touchscreens by checking for devices with absolute X/Y and NO relative X/Y axes. Signed-off-by: Peter Korsgaard --- src/evdev.c | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/evdev.c b/src/evdev.c index b1a822b..4f9307f 100644 --- a/src/evdev.c +++ b/src/evdev.c @@ -1683,8 +1683,10 @@ EvdevProbe(InputInfoPtr pInfo) pEvdev->flags |= EVDEV_BUTTON_EVENTS; } } else if (TestBit(ABS_PRESSURE, pEvdev->abs_bitmask) || - TestBit(BTN_TOUCH, pEvdev->key_bitmask)) { - if (has_lmr || TestBit(BTN_TOOL_FINGER, pEvdev->key_bitmask)) { + TestBit(BTN_TOUCH, pEvdev->key_bitmask) || + !(TestBit(REL_X, pEvdev->rel_bitmask) && + TestBit(REL_Y, pEvdev->rel_bitmask))) { + if (TestBit(BTN_TOOL_FINGER, pEvdev->key_bitmask)) { xf86IDrvMsg(pInfo, X_PROBED, "Found absolute touchpad.\n"); pEvdev->flags |= EVDEV_TOUCHPAD; } else { -- 1.7.5.1