HID: wacom - Cleanup touch arbitration logic

stylus_in_proximity was introduced to support touch arbitration
before in range was supported. With in range event, the logic
changed. stylus_in_proximity should be set for both in prox and
in range events.

To finish a clean touch arbitration logic, we should send touch
up (if it was down) before posting any general pen events.

Signed-off-by: Ping Cheng <pingc@wacom.com>
Reviewed-by: Jason Gerecke <jason.gerecke@wacom.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
This commit is contained in:
Ping Cheng 2016-01-08 17:16:06 -08:00 committed by Jiri Kosina
parent 4750f5fe29
commit c1b03f5511
1 changed files with 15 additions and 9 deletions

View File

@ -674,19 +674,22 @@ static int wacom_intuos_inout(struct wacom_wac *wacom)
wacom->tool[idx] = BTN_TOOL_PEN; wacom->tool[idx] = BTN_TOOL_PEN;
break; break;
} }
wacom->shared->stylus_in_proximity = true;
return 1; return 1;
} }
wacom->shared->stylus_in_proximity = true; /* in Range */
if (wacom->shared->touch_down) if ((data[1] & 0xfe) == 0x20) {
return 1; wacom->shared->stylus_in_proximity = true;
/* in Range while exiting */ /* in Range while exiting */
if (((data[1] & 0xfe) == 0x20) && wacom->reporting_data) { if (wacom->reporting_data) {
input_report_key(input, BTN_TOUCH, 0); input_report_key(input, BTN_TOUCH, 0);
input_report_abs(input, ABS_PRESSURE, 0); input_report_abs(input, ABS_PRESSURE, 0);
input_report_abs(input, ABS_DISTANCE, wacom->features.distance_max); input_report_abs(input, ABS_DISTANCE, wacom->features.distance_max);
return 2; return 2;
}
return 1;
} }
/* Exit report */ /* Exit report */
@ -871,6 +874,9 @@ static int wacom_intuos_general(struct wacom_wac *wacom)
data[0] != WACOM_REPORT_INTUOS_PEN) data[0] != WACOM_REPORT_INTUOS_PEN)
return 0; return 0;
if (wacom->shared->touch_down)
return 1;
/* don't report events if we don't know the tool ID */ /* don't report events if we don't know the tool ID */
if (!wacom->id[idx]) { if (!wacom->id[idx]) {
/* but reschedule a read of the current tool */ /* but reschedule a read of the current tool */