mirror of
https://github.com/FEX-Emu/linux.git
synced 2025-01-09 11:00:52 +00:00
HID: wacom: use wacom_wac_finger_count_touches to set touch_down
Counting number of touching fingers by wacom_wac_finger_count_touches so we don't have to count them inside individual routines. 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:
parent
f3586d2f81
commit
7d059ed01c
@ -1065,6 +1065,28 @@ static int wacom_intuos_bt_irq(struct wacom_wac *wacom, size_t len)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int wacom_wac_finger_count_touches(struct wacom_wac *wacom)
|
||||||
|
{
|
||||||
|
struct input_dev *input = wacom->input;
|
||||||
|
unsigned touch_max = wacom->features.touch_max;
|
||||||
|
int count = 0;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* non-HID_GENERIC single touch input doesn't call this routine */
|
||||||
|
if ((touch_max == 1) && (wacom->features.type == HID_GENERIC))
|
||||||
|
return wacom->hid_data.tipswitch &&
|
||||||
|
!wacom->shared->stylus_in_proximity;
|
||||||
|
|
||||||
|
for (i = 0; i < input->mt->num_slots; i++) {
|
||||||
|
struct input_mt_slot *ps = &input->mt->slots[i];
|
||||||
|
int id = input_mt_get_value(ps, ABS_MT_TRACKING_ID);
|
||||||
|
if (id >= 0)
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
static int wacom_24hdt_irq(struct wacom_wac *wacom)
|
static int wacom_24hdt_irq(struct wacom_wac *wacom)
|
||||||
{
|
{
|
||||||
struct input_dev *input = wacom->input;
|
struct input_dev *input = wacom->input;
|
||||||
@ -1075,7 +1097,6 @@ static int wacom_24hdt_irq(struct wacom_wac *wacom)
|
|||||||
int num_contacts_left = 4; /* maximum contacts per packet */
|
int num_contacts_left = 4; /* maximum contacts per packet */
|
||||||
int byte_per_packet = WACOM_BYTES_PER_24HDT_PACKET;
|
int byte_per_packet = WACOM_BYTES_PER_24HDT_PACKET;
|
||||||
int y_offset = 2;
|
int y_offset = 2;
|
||||||
static int contact_with_no_pen_down_count = 0;
|
|
||||||
|
|
||||||
if (wacom->features.type == WACOM_27QHDT) {
|
if (wacom->features.type == WACOM_27QHDT) {
|
||||||
current_num_contacts = data[63];
|
current_num_contacts = data[63];
|
||||||
@ -1088,10 +1109,8 @@ static int wacom_24hdt_irq(struct wacom_wac *wacom)
|
|||||||
* First packet resets the counter since only the first
|
* First packet resets the counter since only the first
|
||||||
* packet in series will have non-zero current_num_contacts.
|
* packet in series will have non-zero current_num_contacts.
|
||||||
*/
|
*/
|
||||||
if (current_num_contacts) {
|
if (current_num_contacts)
|
||||||
wacom->num_contacts_left = current_num_contacts;
|
wacom->num_contacts_left = current_num_contacts;
|
||||||
contact_with_no_pen_down_count = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
contacts_to_send = min(num_contacts_left, wacom->num_contacts_left);
|
contacts_to_send = min(num_contacts_left, wacom->num_contacts_left);
|
||||||
|
|
||||||
@ -1124,7 +1143,6 @@ static int wacom_24hdt_irq(struct wacom_wac *wacom)
|
|||||||
input_report_abs(input, ABS_MT_WIDTH_MINOR, min(w, h));
|
input_report_abs(input, ABS_MT_WIDTH_MINOR, min(w, h));
|
||||||
input_report_abs(input, ABS_MT_ORIENTATION, w > h);
|
input_report_abs(input, ABS_MT_ORIENTATION, w > h);
|
||||||
}
|
}
|
||||||
contact_with_no_pen_down_count++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
input_mt_sync_frame(input);
|
input_mt_sync_frame(input);
|
||||||
@ -1132,7 +1150,7 @@ static int wacom_24hdt_irq(struct wacom_wac *wacom)
|
|||||||
wacom->num_contacts_left -= contacts_to_send;
|
wacom->num_contacts_left -= contacts_to_send;
|
||||||
if (wacom->num_contacts_left <= 0) {
|
if (wacom->num_contacts_left <= 0) {
|
||||||
wacom->num_contacts_left = 0;
|
wacom->num_contacts_left = 0;
|
||||||
wacom->shared->touch_down = (contact_with_no_pen_down_count > 0);
|
wacom->shared->touch_down = wacom_wac_finger_count_touches(wacom);
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -1145,7 +1163,6 @@ static int wacom_mt_touch(struct wacom_wac *wacom)
|
|||||||
int current_num_contacts = data[2];
|
int current_num_contacts = data[2];
|
||||||
int contacts_to_send = 0;
|
int contacts_to_send = 0;
|
||||||
int x_offset = 0;
|
int x_offset = 0;
|
||||||
static int contact_with_no_pen_down_count = 0;
|
|
||||||
|
|
||||||
/* MTTPC does not support Height and Width */
|
/* MTTPC does not support Height and Width */
|
||||||
if (wacom->features.type == MTTPC || wacom->features.type == MTTPC_B)
|
if (wacom->features.type == MTTPC || wacom->features.type == MTTPC_B)
|
||||||
@ -1155,10 +1172,8 @@ static int wacom_mt_touch(struct wacom_wac *wacom)
|
|||||||
* First packet resets the counter since only the first
|
* First packet resets the counter since only the first
|
||||||
* packet in series will have non-zero current_num_contacts.
|
* packet in series will have non-zero current_num_contacts.
|
||||||
*/
|
*/
|
||||||
if (current_num_contacts) {
|
if (current_num_contacts)
|
||||||
wacom->num_contacts_left = current_num_contacts;
|
wacom->num_contacts_left = current_num_contacts;
|
||||||
contact_with_no_pen_down_count = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* There are at most 5 contacts per packet */
|
/* There are at most 5 contacts per packet */
|
||||||
contacts_to_send = min(5, wacom->num_contacts_left);
|
contacts_to_send = min(5, wacom->num_contacts_left);
|
||||||
@ -1179,7 +1194,6 @@ static int wacom_mt_touch(struct wacom_wac *wacom)
|
|||||||
int y = get_unaligned_le16(&data[offset + x_offset + 9]);
|
int y = get_unaligned_le16(&data[offset + x_offset + 9]);
|
||||||
input_report_abs(input, ABS_MT_POSITION_X, x);
|
input_report_abs(input, ABS_MT_POSITION_X, x);
|
||||||
input_report_abs(input, ABS_MT_POSITION_Y, y);
|
input_report_abs(input, ABS_MT_POSITION_Y, y);
|
||||||
contact_with_no_pen_down_count++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
input_mt_sync_frame(input);
|
input_mt_sync_frame(input);
|
||||||
@ -1187,7 +1201,7 @@ static int wacom_mt_touch(struct wacom_wac *wacom)
|
|||||||
wacom->num_contacts_left -= contacts_to_send;
|
wacom->num_contacts_left -= contacts_to_send;
|
||||||
if (wacom->num_contacts_left <= 0) {
|
if (wacom->num_contacts_left <= 0) {
|
||||||
wacom->num_contacts_left = 0;
|
wacom->num_contacts_left = 0;
|
||||||
wacom->shared->touch_down = (contact_with_no_pen_down_count > 0);
|
wacom->shared->touch_down = wacom_wac_finger_count_touches(wacom);
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -1196,7 +1210,6 @@ static int wacom_tpc_mt_touch(struct wacom_wac *wacom)
|
|||||||
{
|
{
|
||||||
struct input_dev *input = wacom->input;
|
struct input_dev *input = wacom->input;
|
||||||
unsigned char *data = wacom->data;
|
unsigned char *data = wacom->data;
|
||||||
int contact_with_no_pen_down_count = 0;
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < 2; i++) {
|
for (i = 0; i < 2; i++) {
|
||||||
@ -1211,13 +1224,12 @@ static int wacom_tpc_mt_touch(struct wacom_wac *wacom)
|
|||||||
|
|
||||||
input_report_abs(input, ABS_MT_POSITION_X, x);
|
input_report_abs(input, ABS_MT_POSITION_X, x);
|
||||||
input_report_abs(input, ABS_MT_POSITION_Y, y);
|
input_report_abs(input, ABS_MT_POSITION_Y, y);
|
||||||
contact_with_no_pen_down_count++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
input_mt_sync_frame(input);
|
input_mt_sync_frame(input);
|
||||||
|
|
||||||
/* keep touch state for pen event */
|
/* keep touch state for pen event */
|
||||||
wacom->shared->touch_down = (contact_with_no_pen_down_count > 0);
|
wacom->shared->touch_down = wacom_wac_finger_count_touches(wacom);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -1545,29 +1557,6 @@ static int wacom_wac_finger_event(struct hid_device *hdev,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int wacom_wac_finger_count_touches(struct hid_device *hdev)
|
|
||||||
{
|
|
||||||
struct wacom *wacom = hid_get_drvdata(hdev);
|
|
||||||
struct wacom_wac *wacom_wac = &wacom->wacom_wac;
|
|
||||||
struct input_dev *input = wacom_wac->input;
|
|
||||||
unsigned touch_max = wacom_wac->features.touch_max;
|
|
||||||
int count = 0;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if (touch_max == 1)
|
|
||||||
return wacom_wac->hid_data.tipswitch &&
|
|
||||||
!wacom_wac->shared->stylus_in_proximity;
|
|
||||||
|
|
||||||
for (i = 0; i < input->mt->num_slots; i++) {
|
|
||||||
struct input_mt_slot *ps = &input->mt->slots[i];
|
|
||||||
int id = input_mt_get_value(ps, ABS_MT_TRACKING_ID);
|
|
||||||
if (id >= 0)
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return count;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void wacom_wac_finger_report(struct hid_device *hdev,
|
static void wacom_wac_finger_report(struct hid_device *hdev,
|
||||||
struct hid_report *report)
|
struct hid_report *report)
|
||||||
{
|
{
|
||||||
@ -1582,7 +1571,7 @@ static void wacom_wac_finger_report(struct hid_device *hdev,
|
|||||||
input_sync(input);
|
input_sync(input);
|
||||||
|
|
||||||
/* keep touch state for pen event */
|
/* keep touch state for pen event */
|
||||||
wacom_wac->shared->touch_down = wacom_wac_finger_count_touches(hdev);
|
wacom_wac->shared->touch_down = wacom_wac_finger_count_touches(wacom_wac);
|
||||||
}
|
}
|
||||||
|
|
||||||
void wacom_wac_usage_mapping(struct hid_device *hdev,
|
void wacom_wac_usage_mapping(struct hid_device *hdev,
|
||||||
@ -1642,7 +1631,6 @@ static int wacom_bpt_touch(struct wacom_wac *wacom)
|
|||||||
struct input_dev *pad_input = wacom->pad_input;
|
struct input_dev *pad_input = wacom->pad_input;
|
||||||
unsigned char *data = wacom->data;
|
unsigned char *data = wacom->data;
|
||||||
int i;
|
int i;
|
||||||
int contact_with_no_pen_down_count = 0;
|
|
||||||
|
|
||||||
if (data[0] != 0x02)
|
if (data[0] != 0x02)
|
||||||
return 0;
|
return 0;
|
||||||
@ -1670,7 +1658,6 @@ static int wacom_bpt_touch(struct wacom_wac *wacom)
|
|||||||
}
|
}
|
||||||
input_report_abs(input, ABS_MT_POSITION_X, x);
|
input_report_abs(input, ABS_MT_POSITION_X, x);
|
||||||
input_report_abs(input, ABS_MT_POSITION_Y, y);
|
input_report_abs(input, ABS_MT_POSITION_Y, y);
|
||||||
contact_with_no_pen_down_count++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1680,12 +1667,12 @@ static int wacom_bpt_touch(struct wacom_wac *wacom)
|
|||||||
input_report_key(pad_input, BTN_FORWARD, (data[1] & 0x04) != 0);
|
input_report_key(pad_input, BTN_FORWARD, (data[1] & 0x04) != 0);
|
||||||
input_report_key(pad_input, BTN_BACK, (data[1] & 0x02) != 0);
|
input_report_key(pad_input, BTN_BACK, (data[1] & 0x02) != 0);
|
||||||
input_report_key(pad_input, BTN_RIGHT, (data[1] & 0x01) != 0);
|
input_report_key(pad_input, BTN_RIGHT, (data[1] & 0x01) != 0);
|
||||||
wacom->shared->touch_down = (contact_with_no_pen_down_count > 0);
|
wacom->shared->touch_down = wacom_wac_finger_count_touches(wacom);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int wacom_bpt3_touch_msg(struct wacom_wac *wacom, unsigned char *data, int last_touch_count)
|
static void wacom_bpt3_touch_msg(struct wacom_wac *wacom, unsigned char *data)
|
||||||
{
|
{
|
||||||
struct wacom_features *features = &wacom->features;
|
struct wacom_features *features = &wacom->features;
|
||||||
struct input_dev *input = wacom->input;
|
struct input_dev *input = wacom->input;
|
||||||
@ -1693,7 +1680,7 @@ static int wacom_bpt3_touch_msg(struct wacom_wac *wacom, unsigned char *data, in
|
|||||||
int slot = input_mt_get_slot_by_key(input, data[0]);
|
int slot = input_mt_get_slot_by_key(input, data[0]);
|
||||||
|
|
||||||
if (slot < 0)
|
if (slot < 0)
|
||||||
return 0;
|
return;
|
||||||
|
|
||||||
touch = touch && !wacom->shared->stylus_in_proximity;
|
touch = touch && !wacom->shared->stylus_in_proximity;
|
||||||
|
|
||||||
@ -1725,9 +1712,7 @@ static int wacom_bpt3_touch_msg(struct wacom_wac *wacom, unsigned char *data, in
|
|||||||
input_report_abs(input, ABS_MT_POSITION_Y, y);
|
input_report_abs(input, ABS_MT_POSITION_Y, y);
|
||||||
input_report_abs(input, ABS_MT_TOUCH_MAJOR, width);
|
input_report_abs(input, ABS_MT_TOUCH_MAJOR, width);
|
||||||
input_report_abs(input, ABS_MT_TOUCH_MINOR, height);
|
input_report_abs(input, ABS_MT_TOUCH_MINOR, height);
|
||||||
last_touch_count++;
|
|
||||||
}
|
}
|
||||||
return last_touch_count;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void wacom_bpt3_button_msg(struct wacom_wac *wacom, unsigned char *data)
|
static void wacom_bpt3_button_msg(struct wacom_wac *wacom, unsigned char *data)
|
||||||
@ -1752,7 +1737,6 @@ static int wacom_bpt3_touch(struct wacom_wac *wacom)
|
|||||||
unsigned char *data = wacom->data;
|
unsigned char *data = wacom->data;
|
||||||
int count = data[1] & 0x07;
|
int count = data[1] & 0x07;
|
||||||
int i;
|
int i;
|
||||||
int contact_with_no_pen_down_count = 0;
|
|
||||||
|
|
||||||
if (data[0] != 0x02)
|
if (data[0] != 0x02)
|
||||||
return 0;
|
return 0;
|
||||||
@ -1763,15 +1747,13 @@ static int wacom_bpt3_touch(struct wacom_wac *wacom)
|
|||||||
int msg_id = data[offset];
|
int msg_id = data[offset];
|
||||||
|
|
||||||
if (msg_id >= 2 && msg_id <= 17)
|
if (msg_id >= 2 && msg_id <= 17)
|
||||||
contact_with_no_pen_down_count =
|
wacom_bpt3_touch_msg(wacom, data + offset);
|
||||||
wacom_bpt3_touch_msg(wacom, data + offset,
|
|
||||||
contact_with_no_pen_down_count);
|
|
||||||
else if (msg_id == 128)
|
else if (msg_id == 128)
|
||||||
wacom_bpt3_button_msg(wacom, data + offset);
|
wacom_bpt3_button_msg(wacom, data + offset);
|
||||||
|
|
||||||
}
|
}
|
||||||
input_mt_sync_frame(input);
|
input_mt_sync_frame(input);
|
||||||
wacom->shared->touch_down = (contact_with_no_pen_down_count > 0);
|
wacom->shared->touch_down = wacom_wac_finger_count_touches(wacom);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user