提交 9152c7d7 编写于 作者: D Dmitry Torokhov 提交者: Jiri Kosina

HID: multitouch: report MT_TOOL_PALM for non-confident touches

According to Microsoft specification [1] for Precision Touchpads (and
Touchscreens) the devices use "confidence" reports to signal accidental
touches, or contacts that are "too large to be a finger". Instead of
simply marking contact inactive in this case (which causes issues if
contact was originally proper and we lost confidence in it later, as
this results in accidental clicks, drags, etc), let's report such
contacts as MT_TOOL_PALM and let userspace decide what to do.

[1] https://docs.microsoft.com/en-us/windows-hardware/design/component-guidelines/touchpad-windows-precision-touchpad-collectionSigned-off-by: NDmitry Torokhov <dmitry.torokhov@gmail.com>
[splitted and rebased]
Signed-off-by: NBenjamin Tissoires <benjamin.tissoires@redhat.com>
Signed-off-by: NJiri Kosina <jkosina@suse.cz>
上级 30576c5f
...@@ -736,6 +736,13 @@ static int mt_touch_input_mapping(struct hid_device *hdev, struct hid_input *hi, ...@@ -736,6 +736,13 @@ static int mt_touch_input_mapping(struct hid_device *hdev, struct hid_input *hi,
cls->name == MT_CLS_WIN_8_DUAL) && cls->name == MT_CLS_WIN_8_DUAL) &&
field->application == HID_DG_TOUCHPAD) field->application == HID_DG_TOUCHPAD)
app->quirks |= MT_QUIRK_CONFIDENCE; app->quirks |= MT_QUIRK_CONFIDENCE;
if (app->quirks & MT_QUIRK_CONFIDENCE)
input_set_abs_params(hi->input,
ABS_MT_TOOL_TYPE,
MT_TOOL_FINGER,
MT_TOOL_PALM, 0, 0);
MT_STORE_FIELD(confidence_state); MT_STORE_FIELD(confidence_state);
return 1; return 1;
case HID_DG_TIPSWITCH: case HID_DG_TIPSWITCH:
...@@ -958,10 +965,12 @@ static int mt_process_slot(struct mt_device *td, struct input_dev *input, ...@@ -958,10 +965,12 @@ static int mt_process_slot(struct mt_device *td, struct input_dev *input,
if (quirks & MT_QUIRK_HOVERING) if (quirks & MT_QUIRK_HOVERING)
inrange_state = *slot->inrange_state; inrange_state = *slot->inrange_state;
active = (*slot->tip_state || inrange_state) && confidence_state; active = *slot->tip_state || inrange_state;
if (app->application == HID_GD_SYSTEM_MULTIAXIS) if (app->application == HID_GD_SYSTEM_MULTIAXIS)
tool = MT_TOOL_DIAL; tool = MT_TOOL_DIAL;
else if (unlikely(!confidence_state))
tool = MT_TOOL_PALM;
input_mt_slot(input, slotnum); input_mt_slot(input, slotnum);
input_mt_report_slot_state(input, tool, active); input_mt_report_slot_state(input, tool, active);
...@@ -993,11 +1002,11 @@ static int mt_process_slot(struct mt_device *td, struct input_dev *input, ...@@ -993,11 +1002,11 @@ static int mt_process_slot(struct mt_device *td, struct input_dev *input,
orientation = -azimuth; orientation = -azimuth;
} }
/*
* divided by two to match visual scale of touch
* for devices with this quirk
*/
if (quirks & MT_QUIRK_TOUCH_SIZE_SCALING) { if (quirks & MT_QUIRK_TOUCH_SIZE_SCALING) {
/*
* divided by two to match visual scale of touch
* for devices with this quirk
*/
major = major >> 1; major = major >> 1;
minor = minor >> 1; minor = minor >> 1;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册