[PATCH libinput 05/11] touchpad: be finer-grained about when to pair touchpads/keyboard for DWT

Peter Hutterer peter.hutterer at who-t.net
Mon May 25 15:52:52 PDT 2015


Check a couple of easy yes/no definitives that cover most Lenovo laptops,
and avoid false positives on Wacoms.

Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
---
 src/evdev-mt-touchpad.c | 54 +++++++++++++++++++++++++++++++++++--------------
 src/evdev-mt-touchpad.h |  2 --
 src/libinput-util.h     |  3 +++
 test/device.c           |  2 +-
 test/touchpad.c         |  2 +-
 5 files changed, 44 insertions(+), 19 deletions(-)

diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c
index 7a5c363..c908ead 100644
--- a/src/evdev-mt-touchpad.c
+++ b/src/evdev-mt-touchpad.c
@@ -982,15 +982,43 @@ tp_keyboard_event(uint64_t time, struct libinput_event *event, void *data)
 			   time + timeout);
 }
 
+static bool
+tp_want_dwt(struct evdev_device *touchpad,
+	    struct evdev_device *keyboard)
+{
+	unsigned int bus_tp = libevdev_get_id_bustype(touchpad->evdev),
+		     bus_kbd = libevdev_get_id_bustype(keyboard->evdev);
+
+	if (bus_tp == BUS_BLUETOOTH || bus_kbd == BUS_BLUETOOTH)
+		return false;
+
+	/* evemu will set the right bus type */
+	if (bus_tp == BUS_VIRTUAL || bus_kbd == BUS_VIRTUAL)
+		return false;
+
+	/* If the touchpad is on serio, the keyboard is too, so ignore any
+	   other devices */
+	if (bus_tp == BUS_I8042 && bus_kbd != bus_tp)
+		return false;
+
+	/* Wacom makes touchpads, but not internal ones */
+	if (libevdev_get_id_vendor(touchpad->evdev) == VENDOR_ID_WACOM)
+		return false;
+
+	/* everything else we don't really know, so we have to assume
+	   they go together */
+
+	return true;
+}
+
 static void
 tp_interface_device_added(struct evdev_device *device,
 			  struct evdev_device *added_device)
 {
 	struct tp_dispatch *tp = (struct tp_dispatch*)device->dispatch;
 	unsigned int bus_tp = libevdev_get_id_bustype(device->evdev),
-		     bus_trp = libevdev_get_id_bustype(added_device->evdev),
-		     bus_kbd = libevdev_get_id_bustype(added_device->evdev);
-	bool tp_is_internal, trp_is_internal, kbd_is_internal;
+		     bus_trp = libevdev_get_id_bustype(added_device->evdev);
+	bool tp_is_internal, trp_is_internal;
 
 	tp_is_internal = bus_tp != BUS_USB && bus_tp != BUS_BLUETOOTH;
 	trp_is_internal = bus_trp != BUS_USB && bus_trp != BUS_BLUETOOTH;
@@ -1006,18 +1034,14 @@ tp_interface_device_added(struct evdev_device *device,
 					tp_trackpoint_event, tp);
 	}
 
-	if (added_device->tags & EVDEV_TAG_KEYBOARD) {
-		/* FIXME: detect external keyboard better */
-		kbd_is_internal = bus_tp != BUS_BLUETOOTH &&
-				  bus_kbd == bus_tp;
-		if (tp_is_internal && kbd_is_internal &&
-		    tp->dwt.keyboard == NULL) {
-			libinput_device_add_event_listener(&added_device->base,
-						&tp->dwt.keyboard_listener,
-						tp_keyboard_event, tp);
-			tp->dwt.keyboard = added_device;
-			tp->dwt.keyboard_active = false;
-		}
+	if (added_device->tags & EVDEV_TAG_KEYBOARD &&
+	    tp->dwt.keyboard == NULL &&
+	    tp_want_dwt(device, added_device)) {
+		libinput_device_add_event_listener(&added_device->base,
+					&tp->dwt.keyboard_listener,
+					tp_keyboard_event, tp);
+		tp->dwt.keyboard = added_device;
+		tp->dwt.keyboard_active = false;
 	}
 
 	if (tp->sendevents.current_mode !=
diff --git a/src/evdev-mt-touchpad.h b/src/evdev-mt-touchpad.h
index 1b644e0..9eeb5fb 100644
--- a/src/evdev-mt-touchpad.h
+++ b/src/evdev-mt-touchpad.h
@@ -32,8 +32,6 @@
 #define TOUCHPAD_HISTORY_LENGTH 4
 #define TOUCHPAD_MIN_SAMPLES 4
 
-#define VENDOR_ID_APPLE 0x5ac
-
 /* Convert mm to a distance normalized to DEFAULT_MOUSE_DPI */
 #define TP_MM_TO_DPI_NORMALIZED(mm) (DEFAULT_MOUSE_DPI/25.4 * mm)
 
diff --git a/src/libinput-util.h b/src/libinput-util.h
index 74226b9..89f5230 100644
--- a/src/libinput-util.h
+++ b/src/libinput-util.h
@@ -30,6 +30,9 @@
 
 #include "libinput.h"
 
+#define VENDOR_ID_APPLE 0x5ac
+#define VENDOR_ID_WACOM 0x56a
+
 void
 set_logging_enabled(int enabled);
 
diff --git a/test/device.c b/test/device.c
index 0b589cc..5156a3e 100644
--- a/test/device.c
+++ b/test/device.c
@@ -69,7 +69,7 @@ START_TEST(device_sendevents_config_touchpad)
 	expected = LIBINPUT_CONFIG_SEND_EVENTS_DISABLED;
 
 	/* The wacom devices in the test suite are external */
-	if (libevdev_get_id_vendor(dev->evdev) != 0x56a) /* wacom */
+	if (libevdev_get_id_vendor(dev->evdev) != VENDOR_ID_WACOM)
 		expected |=
 			LIBINPUT_CONFIG_SEND_EVENTS_DISABLED_ON_EXTERNAL_MOUSE;
 
diff --git a/test/touchpad.c b/test/touchpad.c
index c8ecb32..7acea40 100644
--- a/test/touchpad.c
+++ b/test/touchpad.c
@@ -3200,7 +3200,7 @@ touchpad_has_palm_detect_size(struct litest_device *dev)
 	double width, height;
 	int rc;
 
-	if (libinput_device_get_id_vendor(dev->libinput_device) == 0x5ac) /* Apple */
+	if (libinput_device_get_id_vendor(dev->libinput_device) == ID_VENDOR_APPLE)
 		return 1;
 
 	rc = libinput_device_get_size(dev->libinput_device, &width, &height);
-- 
2.4.1



More information about the wayland-devel mailing list