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: Ping Cheng <pingc@wacom.com> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
This commit is contained in:
parent
373a5356df
commit
b3bd7ef397
2 changed files with 9 additions and 7 deletions
|
@ -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)
|
||||||
(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)
|
||||||
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 {
|
||||||
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;
|
||||||
|
|
Loading…
Add table
Reference in a new issue