|
@@ -688,7 +688,6 @@ static int wacom_tpc_irq(struct wacom_wac *wacom, void *wcombo)
|
|
|
struct wacom_features *features = &wacom->features;
|
|
struct wacom_features *features = &wacom->features;
|
|
|
char *data = wacom->data;
|
|
char *data = wacom->data;
|
|
|
int prox = 0, pressure, idx = -1;
|
|
int prox = 0, pressure, idx = -1;
|
|
|
- static int stylusInProx, touchInProx = 1, touchOut;
|
|
|
|
|
struct urb *urb = ((struct wacom_combo *)wcombo)->urb;
|
|
struct urb *urb = ((struct wacom_combo *)wcombo)->urb;
|
|
|
|
|
|
|
|
dbg("wacom_tpc_irq: received report #%d", data[0]);
|
|
dbg("wacom_tpc_irq: received report #%d", data[0]);
|
|
@@ -707,16 +706,12 @@ static int wacom_tpc_irq(struct wacom_wac *wacom, void *wcombo)
|
|
|
prox = data[1] & 0x03;
|
|
prox = data[1] & 0x03;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- if (!stylusInProx) { /* stylus not in prox */
|
|
|
|
|
|
|
+ if (!wacom->shared->stylus_in_proximity) {
|
|
|
if (prox) {
|
|
if (prox) {
|
|
|
- if (touchInProx) {
|
|
|
|
|
- wacom_tpc_touch_in(wacom, wcombo);
|
|
|
|
|
- touchOut = 1;
|
|
|
|
|
- return 1;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ wacom_tpc_touch_in(wacom, wcombo);
|
|
|
} else {
|
|
} else {
|
|
|
- /* 2FGT out-prox */
|
|
|
|
|
if (data[0] == WACOM_REPORT_TPC2FG) {
|
|
if (data[0] == WACOM_REPORT_TPC2FG) {
|
|
|
|
|
+ /* 2FGT out-prox */
|
|
|
idx = (wacom->id[1] & 0x01) - 1;
|
|
idx = (wacom->id[1] & 0x01) - 1;
|
|
|
if (idx == 0) {
|
|
if (idx == 0) {
|
|
|
wacom_tpc_touch_out(wacom, wcombo, idx);
|
|
wacom_tpc_touch_out(wacom, wcombo, idx);
|
|
@@ -727,23 +722,19 @@ static int wacom_tpc_irq(struct wacom_wac *wacom, void *wcombo)
|
|
|
idx = (wacom->id[1] & 0x02) - 1;
|
|
idx = (wacom->id[1] & 0x02) - 1;
|
|
|
if (idx == 1)
|
|
if (idx == 1)
|
|
|
wacom_tpc_touch_out(wacom, wcombo, idx);
|
|
wacom_tpc_touch_out(wacom, wcombo, idx);
|
|
|
- } else /* one finger touch */
|
|
|
|
|
|
|
+ } else {
|
|
|
|
|
+ /* one finger touch */
|
|
|
wacom_tpc_touch_out(wacom, wcombo, 0);
|
|
wacom_tpc_touch_out(wacom, wcombo, 0);
|
|
|
- touchOut = 0;
|
|
|
|
|
- touchInProx = 1;
|
|
|
|
|
- return 1;
|
|
|
|
|
|
|
+ }
|
|
|
|
|
+ wacom->id[0] = 0;
|
|
|
}
|
|
}
|
|
|
- } else if (touchOut || !prox) { /* force touch out-prox */
|
|
|
|
|
|
|
+ } else if (wacom->id[0]) { /* force touch out-prox */
|
|
|
wacom_tpc_touch_out(wacom, wcombo, 0);
|
|
wacom_tpc_touch_out(wacom, wcombo, 0);
|
|
|
- touchOut = 0;
|
|
|
|
|
- touchInProx = 1;
|
|
|
|
|
- return 1;
|
|
|
|
|
}
|
|
}
|
|
|
|
|
+ return 1;
|
|
|
} else if (data[0] == WACOM_REPORT_PENABLED) { /* Penabled */
|
|
} else if (data[0] == WACOM_REPORT_PENABLED) { /* Penabled */
|
|
|
prox = data[1] & 0x20;
|
|
prox = data[1] & 0x20;
|
|
|
|
|
|
|
|
- touchInProx = 0;
|
|
|
|
|
-
|
|
|
|
|
if (!wacom->id[0]) { /* first in prox */
|
|
if (!wacom->id[0]) { /* first in prox */
|
|
|
/* Going into proximity select tool */
|
|
/* Going into proximity select tool */
|
|
|
wacom->tool[0] = (data[1] & 0x0c) ? BTN_TOOL_RUBBER : BTN_TOOL_PEN;
|
|
wacom->tool[0] = (data[1] & 0x0c) ? BTN_TOOL_RUBBER : BTN_TOOL_PEN;
|
|
@@ -751,6 +742,8 @@ static int wacom_tpc_irq(struct wacom_wac *wacom, void *wcombo)
|
|
|
wacom->id[0] = STYLUS_DEVICE_ID;
|
|
wacom->id[0] = STYLUS_DEVICE_ID;
|
|
|
else
|
|
else
|
|
|
wacom->id[0] = ERASER_DEVICE_ID;
|
|
wacom->id[0] = ERASER_DEVICE_ID;
|
|
|
|
|
+
|
|
|
|
|
+ wacom->shared->stylus_in_proximity = true;
|
|
|
}
|
|
}
|
|
|
wacom_report_key(wcombo, BTN_STYLUS, data[1] & 0x02);
|
|
wacom_report_key(wcombo, BTN_STYLUS, data[1] & 0x02);
|
|
|
wacom_report_key(wcombo, BTN_STYLUS2, data[1] & 0x10);
|
|
wacom_report_key(wcombo, BTN_STYLUS2, data[1] & 0x10);
|
|
@@ -763,12 +756,10 @@ static int wacom_tpc_irq(struct wacom_wac *wacom, void *wcombo)
|
|
|
wacom_report_key(wcombo, BTN_TOUCH, data[1] & 0x05);
|
|
wacom_report_key(wcombo, BTN_TOUCH, data[1] & 0x05);
|
|
|
if (!prox) { /* out-prox */
|
|
if (!prox) { /* out-prox */
|
|
|
wacom->id[0] = 0;
|
|
wacom->id[0] = 0;
|
|
|
- /* pen is out so touch can be enabled now */
|
|
|
|
|
- touchInProx = 1;
|
|
|
|
|
|
|
+ wacom->shared->stylus_in_proximity = false;
|
|
|
}
|
|
}
|
|
|
wacom_report_key(wcombo, wacom->tool[0], prox);
|
|
wacom_report_key(wcombo, wacom->tool[0], prox);
|
|
|
wacom_report_abs(wcombo, ABS_MISC, wacom->id[0]);
|
|
wacom_report_abs(wcombo, ABS_MISC, wacom->id[0]);
|
|
|
- stylusInProx = prox;
|
|
|
|
|
return 1;
|
|
return 1;
|
|
|
}
|
|
}
|
|
|
return 0;
|
|
return 0;
|