[PATCH libinput 01/20] touchpad: set ntouches for single-touch pads depending on key bits

Hans de Goede hdegoede at redhat.com
Tue Apr 15 05:27:58 PDT 2014


From: Peter Hutterer <peter.hutterer at who-t.net>

A single-touch touchpad that provides BTN_TOOL_TRIPLETAP has 3 touches, etc.
There aren't a lot of these out there, but some touchpads don't have slots but
do provide two- or three-finger detection.

Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
Signed-off-by: Hans de Goede <hdegoede at redhat.com>
---
 src/evdev-mt-touchpad.c | 22 +++++++++++++++++++++-
 1 file changed, 21 insertions(+), 1 deletion(-)

diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c
index bbbd8f3..8021db2 100644
--- a/src/evdev-mt-touchpad.c
+++ b/src/evdev-mt-touchpad.c
@@ -715,9 +715,29 @@ tp_init_slots(struct tp_dispatch *tp,
 		tp->slot = absinfo->value;
 		tp->has_mt = true;
 	} else {
-		tp->ntouches = 5; /* FIXME: based on DOUBLETAP, etc. */
+		struct map {
+			unsigned int code;
+			int ntouches;
+		} max_touches[] = {
+			{ BTN_TOOL_QUINTTAP, 5 },
+			{ BTN_TOOL_QUADTAP, 4 },
+			{ BTN_TOOL_TRIPLETAP, 3 },
+			{ BTN_TOOL_DOUBLETAP, 2 },
+		};
+		struct map *m;
+
 		tp->slot = 0;
 		tp->has_mt = false;
+		tp->ntouches = 1;
+
+		ARRAY_FOR_EACH(max_touches, m) {
+			if (libevdev_has_event_code(device->evdev,
+						    EV_KEY,
+						    m->code)) {
+				tp->ntouches = m->ntouches;
+				break;
+			}
+		}
 	}
 	tp->touches = calloc(tp->ntouches,
 			     sizeof(struct tp_touch));
-- 
1.9.0



More information about the wayland-devel mailing list