Commit b3bd7ef3 authored by Ping Cheng's avatar Ping Cheng Committed by Jiri Kosina

HID: wacom: peport In Range event according to the spec

Some Cintiq and Intuos tablets report In Range event. This event is sent before
valid data is reported when tool enters proximity; or before out of proximity
event is reported when tool exits.

While entering proximity, In Range means a pen is detected. This information
can be used for palm/touch rejection on both pen and touch enabled devices.
While exiting, it means the tool has reached its maximum detectable distance.
Signed-off-by: default avatarPing Cheng <pingc@wacom.com>
Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
parent 373a5356
...@@ -443,9 +443,6 @@ static int wacom_intuos_inout(struct wacom_wac *wacom) ...@@ -443,9 +443,6 @@ static int wacom_intuos_inout(struct wacom_wac *wacom)
/* Enter report */ /* Enter report */
if ((data[1] & 0xfc) == 0xc0) { if ((data[1] & 0xfc) == 0xc0) {
if (features->quirks & WACOM_QUIRK_MULTI_INPUT)
wacom->shared->stylus_in_proximity = true;
/* serial number of the tool */ /* serial number of the tool */
wacom->serial[idx] = ((data[3] & 0x0f) << 28) + wacom->serial[idx] = ((data[3] & 0x0f) << 28) +
(data[4] << 20) + (data[5] << 12) + (data[4] << 20) + (data[5] << 12) +
...@@ -554,19 +551,22 @@ static int wacom_intuos_inout(struct wacom_wac *wacom) ...@@ -554,19 +551,22 @@ static int wacom_intuos_inout(struct wacom_wac *wacom)
(features->type == CINTIQ && !(data[1] & 0x40))) (features->type == CINTIQ && !(data[1] & 0x40)))
return 1; return 1;
/* Range Report */ if (features->quirks & WACOM_QUIRK_MULTI_INPUT)
if ((data[1] & 0xfe) == 0x20) { wacom->shared->stylus_in_proximity = true;
/* in Range while exiting */
if (((data[1] & 0xfe) == 0x20) && 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);
if (features->quirks & WACOM_QUIRK_MULTI_INPUT) return 2;
wacom->shared->stylus_in_proximity = true;
} }
/* Exit report */ /* Exit report */
if ((data[1] & 0xfe) == 0x80) { if ((data[1] & 0xfe) == 0x80) {
if (features->quirks & WACOM_QUIRK_MULTI_INPUT) if (features->quirks & WACOM_QUIRK_MULTI_INPUT)
wacom->shared->stylus_in_proximity = false; wacom->shared->stylus_in_proximity = false;
wacom->reporting_data = false;
/* don't report exit if we don't know the ID */ /* don't report exit if we don't know the ID */
if (!wacom->id[idx]) if (!wacom->id[idx])
...@@ -952,6 +952,7 @@ static int wacom_intuos_irq(struct wacom_wac *wacom) ...@@ -952,6 +952,7 @@ static int wacom_intuos_irq(struct wacom_wac *wacom)
input_report_abs(input, ABS_MISC, wacom->id[idx]); /* report tool id */ input_report_abs(input, ABS_MISC, wacom->id[idx]); /* report tool id */
input_report_key(input, wacom->tool[idx], 1); input_report_key(input, wacom->tool[idx], 1);
input_event(input, EV_MSC, MSC_SERIAL, wacom->serial[idx]); input_event(input, EV_MSC, MSC_SERIAL, wacom->serial[idx]);
wacom->reporting_data = true;
return 1; return 1;
} }
......
...@@ -189,6 +189,7 @@ struct wacom_wac { ...@@ -189,6 +189,7 @@ struct wacom_wac {
int tool[2]; int tool[2];
int id[2]; int id[2];
__u32 serial[2]; __u32 serial[2];
bool reporting_data;
struct wacom_features features; struct wacom_features features;
struct wacom_shared *shared; struct wacom_shared *shared;
struct input_dev *input; struct input_dev *input;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment