|
@@ -210,6 +210,7 @@ static int mt_input_mapping(struct hid_device *hdev, struct hid_input *hi,
|
|
/* touchscreen emulation */
|
|
/* touchscreen emulation */
|
|
set_abs(hi->input, ABS_X, field, cls->sn_move);
|
|
set_abs(hi->input, ABS_X, field, cls->sn_move);
|
|
td->last_slot_field = usage->hid;
|
|
td->last_slot_field = usage->hid;
|
|
|
|
+ td->last_field_index = field->index;
|
|
return 1;
|
|
return 1;
|
|
case HID_GD_Y:
|
|
case HID_GD_Y:
|
|
if (quirks & MT_QUIRK_EGALAX_XYZ_FIXUP)
|
|
if (quirks & MT_QUIRK_EGALAX_XYZ_FIXUP)
|
|
@@ -221,6 +222,7 @@ static int mt_input_mapping(struct hid_device *hdev, struct hid_input *hi,
|
|
/* touchscreen emulation */
|
|
/* touchscreen emulation */
|
|
set_abs(hi->input, ABS_Y, field, cls->sn_move);
|
|
set_abs(hi->input, ABS_Y, field, cls->sn_move);
|
|
td->last_slot_field = usage->hid;
|
|
td->last_slot_field = usage->hid;
|
|
|
|
+ td->last_field_index = field->index;
|
|
return 1;
|
|
return 1;
|
|
}
|
|
}
|
|
return 0;
|
|
return 0;
|
|
@@ -229,18 +231,22 @@ static int mt_input_mapping(struct hid_device *hdev, struct hid_input *hi,
|
|
switch (usage->hid) {
|
|
switch (usage->hid) {
|
|
case HID_DG_INRANGE:
|
|
case HID_DG_INRANGE:
|
|
td->last_slot_field = usage->hid;
|
|
td->last_slot_field = usage->hid;
|
|
|
|
+ td->last_field_index = field->index;
|
|
return 1;
|
|
return 1;
|
|
case HID_DG_CONFIDENCE:
|
|
case HID_DG_CONFIDENCE:
|
|
td->last_slot_field = usage->hid;
|
|
td->last_slot_field = usage->hid;
|
|
|
|
+ td->last_field_index = field->index;
|
|
return 1;
|
|
return 1;
|
|
case HID_DG_TIPSWITCH:
|
|
case HID_DG_TIPSWITCH:
|
|
hid_map_usage(hi, usage, bit, max, EV_KEY, BTN_TOUCH);
|
|
hid_map_usage(hi, usage, bit, max, EV_KEY, BTN_TOUCH);
|
|
input_set_capability(hi->input, EV_KEY, BTN_TOUCH);
|
|
input_set_capability(hi->input, EV_KEY, BTN_TOUCH);
|
|
td->last_slot_field = usage->hid;
|
|
td->last_slot_field = usage->hid;
|
|
|
|
+ td->last_field_index = field->index;
|
|
return 1;
|
|
return 1;
|
|
case HID_DG_CONTACTID:
|
|
case HID_DG_CONTACTID:
|
|
input_mt_init_slots(hi->input, td->maxcontacts);
|
|
input_mt_init_slots(hi->input, td->maxcontacts);
|
|
td->last_slot_field = usage->hid;
|
|
td->last_slot_field = usage->hid;
|
|
|
|
+ td->last_field_index = field->index;
|
|
return 1;
|
|
return 1;
|
|
case HID_DG_WIDTH:
|
|
case HID_DG_WIDTH:
|
|
hid_map_usage(hi, usage, bit, max,
|
|
hid_map_usage(hi, usage, bit, max,
|
|
@@ -248,6 +254,7 @@ static int mt_input_mapping(struct hid_device *hdev, struct hid_input *hi,
|
|
set_abs(hi->input, ABS_MT_TOUCH_MAJOR, field,
|
|
set_abs(hi->input, ABS_MT_TOUCH_MAJOR, field,
|
|
cls->sn_width);
|
|
cls->sn_width);
|
|
td->last_slot_field = usage->hid;
|
|
td->last_slot_field = usage->hid;
|
|
|
|
+ td->last_field_index = field->index;
|
|
return 1;
|
|
return 1;
|
|
case HID_DG_HEIGHT:
|
|
case HID_DG_HEIGHT:
|
|
hid_map_usage(hi, usage, bit, max,
|
|
hid_map_usage(hi, usage, bit, max,
|
|
@@ -257,6 +264,7 @@ static int mt_input_mapping(struct hid_device *hdev, struct hid_input *hi,
|
|
input_set_abs_params(hi->input,
|
|
input_set_abs_params(hi->input,
|
|
ABS_MT_ORIENTATION, 0, 1, 0, 0);
|
|
ABS_MT_ORIENTATION, 0, 1, 0, 0);
|
|
td->last_slot_field = usage->hid;
|
|
td->last_slot_field = usage->hid;
|
|
|
|
+ td->last_field_index = field->index;
|
|
return 1;
|
|
return 1;
|
|
case HID_DG_TIPPRESSURE:
|
|
case HID_DG_TIPPRESSURE:
|
|
if (quirks & MT_QUIRK_EGALAX_XYZ_FIXUP)
|
|
if (quirks & MT_QUIRK_EGALAX_XYZ_FIXUP)
|
|
@@ -269,13 +277,15 @@ static int mt_input_mapping(struct hid_device *hdev, struct hid_input *hi,
|
|
set_abs(hi->input, ABS_PRESSURE, field,
|
|
set_abs(hi->input, ABS_PRESSURE, field,
|
|
cls->sn_pressure);
|
|
cls->sn_pressure);
|
|
td->last_slot_field = usage->hid;
|
|
td->last_slot_field = usage->hid;
|
|
|
|
+ td->last_field_index = field->index;
|
|
return 1;
|
|
return 1;
|
|
case HID_DG_CONTACTCOUNT:
|
|
case HID_DG_CONTACTCOUNT:
|
|
- td->last_field_index = field->report->maxfield - 1;
|
|
|
|
|
|
+ td->last_field_index = field->index;
|
|
return 1;
|
|
return 1;
|
|
case HID_DG_CONTACTMAX:
|
|
case HID_DG_CONTACTMAX:
|
|
/* we don't set td->last_slot_field as contactcount and
|
|
/* we don't set td->last_slot_field as contactcount and
|
|
* contact max are global to the report */
|
|
* contact max are global to the report */
|
|
|
|
+ td->last_field_index = field->index;
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
/* let hid-input decide for the others */
|
|
/* let hid-input decide for the others */
|
|
@@ -424,23 +434,12 @@ static int mt_event(struct hid_device *hid, struct hid_field *field,
|
|
break;
|
|
break;
|
|
|
|
|
|
default:
|
|
default:
|
|
- if (td->last_field_index
|
|
|
|
- && field->index == td->last_field_index)
|
|
|
|
- /* we reach here when the last field in the
|
|
|
|
- * report is not related to multitouch.
|
|
|
|
- * This is not good. As a temporary solution,
|
|
|
|
- * we trigger our mt event completion and
|
|
|
|
- * ignore the field.
|
|
|
|
- */
|
|
|
|
- break;
|
|
|
|
/* fallback to the generic hidinput handling */
|
|
/* fallback to the generic hidinput handling */
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
if (usage->hid == td->last_slot_field) {
|
|
if (usage->hid == td->last_slot_field) {
|
|
mt_complete_slot(td);
|
|
mt_complete_slot(td);
|
|
- if (!td->last_field_index)
|
|
|
|
- mt_emit_event(td, field->hidinput->input);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
if (field->index == td->last_field_index
|
|
if (field->index == td->last_field_index
|