[PATCH libinput] touchpad: unify internal/external touchpad tagging

Peter Hutterer peter.hutterer at who-t.net
Thu Jun 30 03:46:17 UTC 2016


To unify this we need to move the tagging process forward so tp_init() can
rely on it for config setup. This means moving it to the touchpad init code.
Other than that no real functional changes, the rules stay the same:
* serial/i2c/etc. are considered internal touchpads
* Bluetooth is always external
* USB is external for Logitech devices
* USB is external for Wacom devices
* USB is internal for Apple touchpads

And if we can't figure it out, we assume it's external and log a message so we
can put a quirk in place.

https://bugs.freedesktop.org/show_bug.cgi?id=96735

Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
---
 src/evdev-mt-touchpad.c | 65 +++++++++++++++++++++++++++++++++++++++----------
 src/evdev.c             |  1 -
 src/evdev.h             |  9 +++----
 3 files changed, 55 insertions(+), 20 deletions(-)

diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c
index 96e78b9..21d83ad 100644
--- a/src/evdev-mt-touchpad.c
+++ b/src/evdev-mt-touchpad.c
@@ -1421,11 +1421,10 @@ tp_dwt_device_is_blacklisted(struct evdev_device *device)
 	unsigned int bus = libevdev_get_id_bustype(device->evdev);
 
 	/* evemu will set the right bus type */
-	if (bus == BUS_BLUETOOTH || bus == BUS_VIRTUAL)
+	if (bus == BUS_VIRTUAL)
 		return true;
 
-	/* Wacom makes touchpads, but not internal ones */
-	if (device->model_flags & EVDEV_MODEL_WACOM_TOUCHPAD)
+	if (device->tags & EVDEV_TAG_EXTERNAL_TOUCHPAD)
 		return true;
 
 	return false;
@@ -1449,10 +1448,6 @@ tp_want_dwt(struct evdev_device *touchpad,
 	if (bus_tp == BUS_I8042 && bus_kbd != bus_tp)
 		return false;
 
-	/* Logitech does not have internal touchpads */
-	if (vendor_tp == VENDOR_ID_LOGITECH)
-		return false;
-
 	/* For Apple touchpads, always use its internal keyboard */
 	if (vendor_tp == VENDOR_ID_APPLE) {
 		return vendor_kbd == vendor_tp &&
@@ -1573,11 +1568,25 @@ tp_interface_device_removed(struct evdev_device *device,
 	tp_resume(tp, device);
 }
 
-void
+static inline void
+evdev_tag_touchpad_internal(struct evdev_device *device)
+{
+	device->tags |= EVDEV_TAG_INTERNAL_TOUCHPAD;
+	device->tags &= ~EVDEV_TAG_EXTERNAL_TOUCHPAD;
+}
+
+static inline void
+evdev_tag_touchpad_external(struct evdev_device *device)
+{
+	device->tags |= EVDEV_TAG_EXTERNAL_TOUCHPAD;
+	device->tags &= ~EVDEV_TAG_INTERNAL_TOUCHPAD;
+}
+
+static void
 evdev_tag_touchpad(struct evdev_device *device,
 		   struct udev_device *udev_device)
 {
-	int bustype;
+	int bustype, vendor;
 
 	/* simple approach: touchpads on USB or Bluetooth are considered
 	 * external, anything else is internal. Exception is Apple -
@@ -1585,11 +1594,39 @@ evdev_tag_touchpad(struct evdev_device *device,
 	 * external USB touchpads anyway.
 	 */
 	bustype = libevdev_get_id_bustype(device->evdev);
-	if (bustype == BUS_USB) {
+	vendor = libevdev_get_id_vendor(device->evdev);
+
+	switch (bustype) {
+	case BUS_USB:
 		if (device->model_flags & EVDEV_MODEL_APPLE_TOUCHPAD)
-			 device->tags |= EVDEV_TAG_INTERNAL_TOUCHPAD;
-	} else if (bustype != BUS_BLUETOOTH)
-		device->tags |= EVDEV_TAG_INTERNAL_TOUCHPAD;
+			 evdev_tag_touchpad_internal(device);
+		break;
+	case BUS_BLUETOOTH:
+		evdev_tag_touchpad_external(device);
+		break;
+	default:
+		evdev_tag_touchpad_internal(device);
+		break;
+	}
+
+	switch (vendor) {
+	/* Logitech does not have internal touchpads */
+	case VENDOR_ID_LOGITECH:
+		evdev_tag_touchpad_external(device);
+		break;
+	}
+
+	/* Wacom makes touchpads, but not internal ones */
+	if (device->model_flags & EVDEV_MODEL_WACOM_TOUCHPAD)
+		evdev_tag_touchpad_external(device);
+
+	if ((device->tags &
+	    (EVDEV_TAG_EXTERNAL_TOUCHPAD|EVDEV_TAG_INTERNAL_TOUCHPAD)) == 0) {
+		log_bug_libinput(evdev_libinput_context(device),
+				 "%s: Internal or external? Please file a bug.\n",
+				 device->devname);
+		evdev_tag_touchpad_external(device);
+	}
 }
 
 static struct evdev_dispatch_interface tp_interface = {
@@ -2309,6 +2346,8 @@ evdev_mt_touchpad_create(struct evdev_device *device)
 {
 	struct tp_dispatch *tp;
 
+	evdev_tag_touchpad(device, device->udev_device);
+
 	tp = zalloc(sizeof *tp);
 	if (!tp)
 		return NULL;
diff --git a/src/evdev.c b/src/evdev.c
index b4a1088..fdbaba1 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -2243,7 +2243,6 @@ evdev_configure_device(struct evdev_device *device)
 			 "input device '%s', %s is a touchpad\n",
 			 device->devname, devnode);
 
-		evdev_tag_touchpad(device, device->udev_device);
 		return device->dispatch == NULL ? -1 : 0;
 	}
 
diff --git a/src/evdev.h b/src/evdev.h
index ca13318..f0fb2f9 100644
--- a/src/evdev.h
+++ b/src/evdev.h
@@ -68,8 +68,9 @@ enum evdev_device_seat_capability {
 enum evdev_device_tags {
 	EVDEV_TAG_EXTERNAL_MOUSE = (1 << 0),
 	EVDEV_TAG_INTERNAL_TOUCHPAD = (1 << 1),
-	EVDEV_TAG_TRACKPOINT = (1 << 2),
-	EVDEV_TAG_KEYBOARD = (1 << 3),
+	EVDEV_TAG_EXTERNAL_TOUCHPAD = (1 << 2),
+	EVDEV_TAG_TRACKPOINT = (1 << 3),
+	EVDEV_TAG_KEYBOARD = (1 << 4),
 };
 
 enum evdev_middlebutton_state {
@@ -334,10 +335,6 @@ struct evdev_dispatch *
 evdev_tablet_pad_create(struct evdev_device *device);
 
 void
-evdev_tag_touchpad(struct evdev_device *device,
-		   struct udev_device *udev_device);
-
-void
 evdev_device_led_update(struct evdev_device *device, enum libinput_led leds);
 
 int
-- 
2.7.4



More information about the wayland-devel mailing list