summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2011-10-26 13:21:18 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2011-11-11 15:50:36 +1000
commit2ce305129ca94394096f4d697d51eb120de2940b (patch)
tree288f80f2151c1790f184e3a19f8f84ed06902a9f /src
parent9411749f76c31a8054ded62a6fb767c8135b4d4e (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>
Diffstat (limited to 'src')
-rw-r--r--src/evdev.c17
-rw-r--r--src/evdev.h1
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,
};