| From: Benjamin Tissoires <benjamin.tissoires@redhat.com> |
| Date: Thu, 16 Apr 2015 13:01:46 -0400 |
| Subject: [PATCH] Input - synaptics: pin 3 touches when the firmware reports 3 |
| fingers |
| |
| Synaptics PS/2 touchpad can send only 2 touches in a report. They can |
| detect 4 or 5 and this information is valuable. |
| |
| In commit 63c4fda (Input: synaptics - allocate 3 slots to keep stability |
| in image sensors), we allocate 3 slots, but we still continue to report |
| the 2 available fingers. That means that the client sees 2 used slots while |
| there is a total of 3 fingers advertised by BTN_TOOL_TRIPLETAP. |
| |
| For old kernels this is not a problem because max_slots was 2 and libinput/ |
| xorg-synaptics knew how to deal with that. Now that max_slot is 3, the |
| clients ignore BTN_TOOL_TRIPLETAP and count the actual used slots (so 2). |
| It then gets confused when receiving the BTN_TOOL_TRIPLETAP and DOUBLETAP |
| information, and goes wild. |
| |
| We can pin the 3 slots until we get a total number of fingers below 2. |
| |
| Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1212230 |
| |
| Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com> |
| |
| drivers/input/mouse/synaptics.c | 8 ++++++++ |
| 1 file changed, 8 insertions(+) |
| |
| diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c |
| index 3a32caf06bf1..58102970f94f 100644 |
| |
| |
| @@ -940,6 +940,14 @@ static void synaptics_report_mt_data(struct psmouse *psmouse, |
| input_report_abs(dev, ABS_MT_PRESSURE, hw[i]->z); |
| } |
| |
| + /* keep (slot count <= num_fingers) by pinning all slots */ |
| + if (num_fingers >= 3) { |
| + for (i = 0; i < 3; i++) { |
| + input_mt_slot(dev, i); |
| + input_mt_report_slot_state(dev, MT_TOOL_FINGER, true); |
| + } |
| + } |
| + |
| input_mt_drop_unused(dev); |
| |
| /* Don't use active slot count to generate BTN_TOOL events. */ |