aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/evdev/evdev.c
diff options
context:
space:
mode:
authorVladimir Kondratyev <wulf@FreeBSD.org>2021-08-24 22:48:33 +0000
committerVladimir Kondratyev <wulf@FreeBSD.org>2021-08-24 22:48:33 +0000
commit66bd52f5e241bd2548015f847f12cdff69176c40 (patch)
treed0fa10a7c098dcc82c0cb3eb7f554e601ab5cb5e /sys/dev/evdev/evdev.c
parent059360287e3344f48f5a7839e2d6d54016b18b19 (diff)
evdev: Make MT tracking IDs monotonically increasing sequence.
MFC after: 2 weeks
Diffstat (limited to 'sys/dev/evdev/evdev.c')
-rw-r--r--sys/dev/evdev/evdev.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/sys/dev/evdev/evdev.c b/sys/dev/evdev/evdev.c
index d6f6cc2e003f..b5eed0e5f02f 100644
--- a/sys/dev/evdev/evdev.c
+++ b/sys/dev/evdev/evdev.c
@@ -701,15 +701,23 @@ evdev_modify_event(struct evdev_dev *evdev, uint16_t type, uint16_t code,
break;
case EV_ABS:
- fuzz = evdev->ev_absinfo[code].fuzz;
- if (fuzz == 0 || code == ABS_MT_SLOT)
+ if (code == ABS_MT_SLOT)
break;
else if (!ABS_IS_MT(code))
old_value = evdev->ev_absinfo[code].value;
- else if (bit_test(evdev->ev_abs_flags, ABS_MT_SLOT))
+ else if (!bit_test(evdev->ev_abs_flags, ABS_MT_SLOT))
+ /* Pass MT protocol type A events as is */
+ break;
+ else if (code == ABS_MT_TRACKING_ID) {
+ *value = evdev_mt_reassign_id(evdev,
+ evdev_mt_get_last_slot(evdev), *value);
+ break;
+ } else
old_value = evdev_mt_get_value(evdev,
evdev_mt_get_last_slot(evdev), code);
- else /* Pass MT protocol type A events as is */
+
+ fuzz = evdev->ev_absinfo[code].fuzz;
+ if (fuzz == 0)
break;
abs_change = abs(*value - old_value);