diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2011-10-26 13:21:18 +1000 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2011-11-11 15:50:36 +1000 |
commit | 2ce305129ca94394096f4d697d51eb120de2940b (patch) | |
tree | 288f80f2151c1790f184e3a19f8f84ed06902a9f | |
parent | 9411749f76c31a8054ded62a6fb767c8135b4d4e (diff) |
Skip event posting for empty slots.
ABS_MT_SLOT comes before any other events. The following order of events
is common for protocol B devices (and mtdev):
...
EV_SYN
ABS_MT_SLOT → posting here means we miss on the position information
ABS_MT_POSITION_X
ABS_MT_POSITION_Y
ABS_MT_SLOT
ABS_MT_POSITION_X
ABS_MT_POSITION_Y
EV_SYN
Store the stot state as SLOT_EMPTY after posting an event (i.e. EV_SYN and
ABS_MT_SLOT) and then don't post until the next slot/syn event.
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-rw-r--r-- | src/evdev.c | 17 | ||||
-rw-r--r-- | src/evdev.h | 1 |
2 files changed, 14 insertions, 4 deletions
diff --git a/src/evdev.c b/src/evdev.c index b55a0aa..13b1e10 100644 --- a/src/evdev.c +++ b/src/evdev.c @@ -709,6 +709,10 @@ EvdevProcessTouch(InputInfoPtr pInfo) if (pEvdev->cur_slot < 0 || !pEvdev->mt_mask) return; + /* If the ABS_MT_SLOT is the first event we get after EV_SYN, skip this */ + if (pEvdev->slot_state == SLOTSTATE_EMPTY) + return; + if (pEvdev->slot_state == SLOTSTATE_CLOSE) type = XI_TouchEnd; else if (pEvdev->slot_state == SLOTSTATE_OPEN) @@ -733,14 +737,19 @@ EvdevProcessTouchEvent(InputInfoPtr pInfo, struct input_event *ev) if (ev->code == ABS_MT_SLOT) { EvdevProcessTouch(pInfo); pEvdev->cur_slot = ev->value; - } else if (ev->code == ABS_MT_TRACKING_ID) { + } else + { + if (pEvdev->slot_state == SLOTSTATE_EMPTY) + pEvdev->slot_state = SLOTSTATE_UPDATE; + if (ev->code == ABS_MT_TRACKING_ID) { if (ev->value >= 0) pEvdev->slot_state = SLOTSTATE_OPEN; else pEvdev->slot_state = SLOTSTATE_CLOSE; - } else { - map = pEvdev->axis_map[ev->code] - pEvdev->num_vals; - valuator_mask_set(pEvdev->mt_mask, map, ev->value); + } else { + map = pEvdev->axis_map[ev->code] - pEvdev->num_vals; + valuator_mask_set(pEvdev->mt_mask, map, ev->value); + } } } #else diff --git a/src/evdev.h b/src/evdev.h index 165aea4..27e404c 100644 --- a/src/evdev.h +++ b/src/evdev.h @@ -103,6 +103,7 @@ enum fkeymode { enum SlotState { SLOTSTATE_OPEN = 8, SLOTSTATE_CLOSE, + SLOTSTATE_UPDATE, SLOTSTATE_EMPTY, }; |