touchpad: always enable palm detection on apple touchpads
authorPeter Hutterer <peter.hutterer@who-t.net>
Mon, 21 Jul 2014 04:20:35 +0000 (14:20 +1000)
committerPeter Hutterer <peter.hutterer@who-t.net>
Mon, 21 Jul 2014 10:20:45 +0000 (20:20 +1000)
They don't set resolution so we can't calculate the size but we know they're
big enough to need palm detection.

And fix the descriptor for the bcm5974. For some reason this was advertising
synaptics coordinates. Fix it to represent (one of) the apple touchpads.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
src/evdev-mt-touchpad-buttons.c
src/evdev-mt-touchpad.c
src/evdev-mt-touchpad.h
test/litest-bcm5974.c
test/touchpad.c

index bd3c0e25c88f5b01bd40c0ac7de4edf24fa59eae..fe33d0b1c3e77a31fd693ac3c6f43f77608476c3 100644 (file)
@@ -521,7 +521,7 @@ tp_init_buttons(struct tp_dispatch *tp,
 
        tp->buttons.motion_dist = diagonal * DEFAULT_BUTTON_MOTION_THRESHOLD;
 
-       if (libevdev_get_id_vendor(device->evdev) == 0x5ac) /* Apple */
+       if (libevdev_get_id_vendor(device->evdev) == VENDOR_ID_APPLE)
                tp->buttons.use_clickfinger = true;
 
        if (tp->buttons.is_clickpad && !tp->buttons.use_clickfinger) {
index 5db204f6dbf12f6bc364c0f0b9c5dfb6976e952f..0755f2cd5a3b61bf5d22047cb6361ea229f731f2 100644 (file)
@@ -757,17 +757,20 @@ tp_init_palmdetect(struct tp_dispatch *tp,
        tp->palm.right_edge = INT_MAX;
        tp->palm.left_edge = INT_MIN;
 
-       /* We don't know how big the touchpad is */
-       if (device->abs.absinfo_x->resolution == 1)
-               return 0;
-
        width = abs(device->abs.absinfo_x->maximum -
                    device->abs.absinfo_x->minimum);
 
-       /* Enable palm detection on touchpads >= 80 mm. Anything smaller
-          probably won't need it, until we find out it does */
-       if (width/device->abs.absinfo_x->resolution < 80)
-               return 0;
+       /* Apple touchpads are always big enough to warrant palm detection */
+       if (evdev_device_get_id_vendor(device) != VENDOR_ID_APPLE) {
+               /* We don't know how big the touchpad is */
+               if (device->abs.absinfo_x->resolution == 1)
+                       return 0;
+
+               /* Enable palm detection on touchpads >= 80 mm. Anything smaller
+                  probably won't need it, until we find out it does */
+               if (width/device->abs.absinfo_x->resolution < 80)
+                       return 0;
+       }
 
        /* palm edges are 5% of the width on each side */
        tp->palm.right_edge = device->abs.absinfo_x->maximum - width * 0.05;
index 47791201d55dae8ff0c31d2e27b1274c5e3decd0..192c401a3d223af2b8c61445c7b1c2f2ed2e48d6 100644 (file)
@@ -33,6 +33,8 @@
 #define TOUCHPAD_HISTORY_LENGTH 4
 #define TOUCHPAD_MIN_SAMPLES 4
 
+#define VENDOR_ID_APPLE 0x5ac
+
 enum touchpad_event {
        TOUCHPAD_EVENT_NONE             = 0,
        TOUCHPAD_EVENT_MOTION           = (1 << 0),
index 10a9eb46b0de62540d2b285002b8bc051af8a7b4..c7bd8573e030cea85b0b888c4f491dd5c176c4e3 100644 (file)
@@ -65,13 +65,18 @@ static struct litest_device_interface interface = {
 };
 
 static struct input_absinfo absinfo[] = {
-       { ABS_X, 1472, 5472, 0, 0, 75 },
-       { ABS_Y, 1408, 4448, 0, 0, 129 },
-       { ABS_PRESSURE, 0, 255, 0, 0, 0 },
-       { ABS_TOOL_WIDTH, 0, 15, 0, 0, 0 },
-       { ABS_MT_SLOT, 0, 1, 0, 0, 0 },
-       { ABS_MT_POSITION_X, 1472, 5472, 0, 0, 75 },
-       { ABS_MT_POSITION_Y, 1408, 4448, 0, 0, 129 },
+       { ABS_X, -4824, 4824, 0, 0, 0 },
+       { ABS_Y, -172, 4290, 0, 0, 0 },
+       { ABS_PRESSURE, 0, 256, 5, 0, 0 },
+       { ABS_TOOL_WIDTH, 0, 16, 0, 0, 0 },
+       { ABS_MT_SLOT, 0, 15, 0, 0, 0 },
+       { ABS_MT_POSITION_X, -4824, 4824, 17, 0, 0 },
+       { ABS_MT_POSITION_Y, -172, 4290, 17, 0, 0 },
+       { ABS_MT_ORIENTATION, -16384, 16384, 3276, 0, 0 },
+       { ABS_MT_TOUCH_MAJOR, 0, 2048, 81, 0, 0 },
+       { ABS_MT_TOUCH_MINOR, 0, 2048, 81, 0, 0 },
+       { ABS_MT_WIDTH_MAJOR, 0, 2048, 81, 0, 0 },
+       { ABS_MT_WIDTH_MINOR, 0, 2048, 81, 0, 0 },
        { ABS_MT_TRACKING_ID, 0, 65535, 0, 0, 0 },
        { ABS_MT_PRESSURE, 0, 255, 0, 0, 0 },
        { .value = -1 },
index 9b232bf401f913b9e9434b164decf54ee5a4370d..0de3cbb2db04852be105a27d8ab19e2bab37453c 100644 (file)
@@ -1247,6 +1247,9 @@ 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 */
+               return 1;
+
        rc = libinput_device_get_size(dev->libinput_device, &width, &height);
 
        return rc == 0 && width >= 80;