summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCaibin Chen <tigersoldi@gmail.com>2015-12-13 22:27:55 -0800
committerPeter Hutterer <peter.hutterer@who-t.net>2016-01-11 10:11:32 +1000
commitb3f11180e337d6cd7fd997685b65e5ed48acc661 (patch)
tree858bc7c841ba42cb34f6da4149959c21fed97833 /src
parenta340736e9b9399f630ff4b436930c1dee26cb803 (diff)
touchpad: fix DWT pairing for Macbook Pro 2015
Label internal keyboards through the udev hwdb and only pair the internal (usb) Apple touchpads with those keyboards labelled as such. https://bugs.freedesktop.org/show_bug.cgi?id=93367 Co-authored-by: Peter Hutterer <peter.hutterer@who-t.net> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Diffstat (limited to 'src')
-rw-r--r--src/evdev-mt-touchpad.c9
-rw-r--r--src/evdev.c1
-rw-r--r--src/evdev.h1
-rw-r--r--src/libinput-util.h1
4 files changed, 12 insertions, 0 deletions
diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c
index d78a54b0..aa123cd4 100644
--- a/src/evdev-mt-touchpad.c
+++ b/src/evdev-mt-touchpad.c
@@ -1285,6 +1285,8 @@ tp_want_dwt(struct evdev_device *touchpad,
{
unsigned int bus_tp = libevdev_get_id_bustype(touchpad->evdev),
bus_kbd = libevdev_get_id_bustype(keyboard->evdev);
+ unsigned int vendor_tp = evdev_device_get_id_vendor(touchpad);
+ unsigned int vendor_kbd = evdev_device_get_id_vendor(keyboard);
if (tp_dwt_device_is_blacklisted(touchpad) ||
tp_dwt_device_is_blacklisted(keyboard))
@@ -1295,6 +1297,13 @@ tp_want_dwt(struct evdev_device *touchpad,
if (bus_tp == BUS_I8042 && bus_kbd != bus_tp)
return false;
+ /* For Apple touchpads, always use its internal keyboard */
+ if (vendor_tp == VENDOR_ID_APPLE) {
+ return vendor_kbd == vendor_tp &&
+ keyboard->model_flags &
+ EVDEV_MODEL_APPLE_INTERNAL_KEYBOARD;
+ }
+
/* everything else we don't really know, so we have to assume
they go together */
diff --git a/src/evdev.c b/src/evdev.c
index 37080725..a6d8a604 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -1662,6 +1662,7 @@ evdev_read_model_flags(struct evdev_device *device)
{ "LIBINPUT_MODEL_SYNAPTICS_SERIAL_TOUCHPAD", EVDEV_MODEL_SYNAPTICS_SERIAL_TOUCHPAD },
{ "LIBINPUT_MODEL_JUMPING_SEMI_MT", EVDEV_MODEL_JUMPING_SEMI_MT },
{ "LIBINPUT_MODEL_ELANTECH_TOUCHPAD", EVDEV_MODEL_ELANTECH_TOUCHPAD },
+ { "LIBINPUT_MODEL_APPLE_INTERNAL_KEYBOARD", EVDEV_MODEL_APPLE_INTERNAL_KEYBOARD },
{ NULL, EVDEV_MODEL_DEFAULT },
};
const struct model_map *m = model_map;
diff --git a/src/evdev.h b/src/evdev.h
index 36bf7b42..97177ec2 100644
--- a/src/evdev.h
+++ b/src/evdev.h
@@ -108,6 +108,7 @@ enum evdev_device_model {
EVDEV_MODEL_JUMPING_SEMI_MT = (1 << 10),
EVDEV_MODEL_ELANTECH_TOUCHPAD = (1 << 11),
EVDEV_MODEL_LENOVO_X220_TOUCHPAD_FW81 = (1 << 12),
+ EVDEV_MODEL_APPLE_INTERNAL_KEYBOARD = (1 << 13),
};
struct mt_slot {
diff --git a/src/libinput-util.h b/src/libinput-util.h
index a627e5d4..25de8e5d 100644
--- a/src/libinput-util.h
+++ b/src/libinput-util.h
@@ -38,6 +38,7 @@
#define VENDOR_ID_APPLE 0x5ac
#define VENDOR_ID_WACOM 0x56a
#define VENDOR_ID_SYNAPTICS_SERIAL 0x002
+#define PRODUCT_ID_APPLE_KBD_TOUCHPAD 0x273
#define PRODUCT_ID_SYNAPTICS_SERIAL 0x007
/* The HW DPI rate we normalize to before calculating pointer acceleration */