From 2ce305129ca94394096f4d697d51eb120de2940b Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Wed, 26 Oct 2011 13:21:18 +1000 Subject: Skip event posting for empty slots. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- src/evdev.c | 17 +++++++++++++---- 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, }; -- cgit v1.2.3