Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Input: update input_mt_report_pointer_emulation to support hovering

For devices that are incapable of reporting per-contact distance and can
only report ABS_DISTANCE, just distance is not enough for upper layers of
OS to determine whether contact is leaving the area or if it is continuing
hovering, we need BTN_TOOL_FINGER for that:

Contact State
Inactive Hovering Active
(far away) (inside hover area) (touching surface)
BTN_TOUCH 0 0 1
BTN_TOOL_FINGER 0 1 1
ABS_DISTANCE N/A 1 0

Signed-off-by: KT Liao <kt.liao@emc.com.tw>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>

authored by

KT Liao and committed by
Dmitry Torokhov
0fd80a77 cd467299

+16 -1
+16 -1
drivers/input/input-mt.c
··· 218 218 } 219 219 220 220 input_event(dev, EV_KEY, BTN_TOUCH, count > 0); 221 - if (use_count) 221 + 222 + if (use_count) { 223 + if (count == 0 && 224 + !test_bit(ABS_MT_DISTANCE, dev->absbit) && 225 + test_bit(ABS_DISTANCE, dev->absbit) && 226 + input_abs_get_val(dev, ABS_DISTANCE) != 0) { 227 + /* 228 + * Force reporting BTN_TOOL_FINGER for devices that 229 + * only report general hover (and not per-contact 230 + * distance) when contact is in proximity but not 231 + * on the surface. 232 + */ 233 + count = 1; 234 + } 235 + 222 236 input_mt_report_finger_count(dev, count); 237 + } 223 238 224 239 if (oldest) { 225 240 int x = input_mt_get_value(oldest, ABS_MT_POSITION_X);