HID: alps: fix multitouch cursor issue
authorMasaki Ota <012nexus@gmail.com>
Tue, 27 Sep 2016 05:04:37 +0000 (14:04 +0900)
committerJiri Kosina <jkosina@suse.cz>
Tue, 27 Sep 2016 11:50:09 +0000 (13:50 +0200)
Issue reproduction procedure:

1. three or more fingers put on Touchpad.
2. release fingers from Touchpad.
3. move the cursor by one finger.
4. the cursor does not move.

Cause:

We do not notify multi fingers state correctly to input subsystem.  For
example, when three fingers release from Touchpad, fingers state is 3 -> 0. It
needs to notify first, second and third finger's releasing state.

Fix this by not breaking out on z axis and move x,y,z input handling
code to the correct place so that it's in fact per-finger.

[jkosina@suse.cz: reword changelog]
Signed-off-by: Masaki Ota <masaki.ota@jp.alps.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
drivers/hid/hid-alps.c

index 048befd..610df92 100644 (file)
@@ -190,16 +190,16 @@ static int alps_raw_event(struct hid_device *hdev,
                        if (z != 0) {
                                input_mt_report_slot_state(hdata->input,
                                        MT_TOOL_FINGER, 1);
+                               input_report_abs(hdata->input,
+                                       ABS_MT_POSITION_X, x);
+                               input_report_abs(hdata->input,
+                                       ABS_MT_POSITION_Y, y);
+                               input_report_abs(hdata->input,
+                                       ABS_MT_PRESSURE, z);
                        } else {
                                input_mt_report_slot_state(hdata->input,
                                        MT_TOOL_FINGER, 0);
-                               break;
                        }
-
-                       input_report_abs(hdata->input, ABS_MT_POSITION_X, x);
-                       input_report_abs(hdata->input, ABS_MT_POSITION_Y, y);
-                       input_report_abs(hdata->input, ABS_MT_PRESSURE, z);
-
                }
 
                input_mt_sync_frame(hdata->input);