summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeil Roberts <neil@linux.intel.com>2013-09-20 15:03:29 +0100
committerKristian Høgsberg <krh@bitplanet.net>2013-09-22 13:58:33 -0700
commitf65c486090941958ad78a3a29741cf7e94aa2a31 (patch)
tree5540440ad2d2d41ae7e9789d6985e6d5eb80b35b
parent4df790e505648510ce06636111ce0daf2302ee46 (diff)
downloadweston-f65c486090941958ad78a3a29741cf7e94aa2a31.tar.gz
weston-f65c486090941958ad78a3a29741cf7e94aa2a31.tar.bz2
weston-f65c486090941958ad78a3a29741cf7e94aa2a31.zip
evdev: Flush motion events when the slot changes, not just after sync
If two fingers are released almost simultaneously then evdev can send the touch up events in one bunch without sending a sync event in-between. However, the evdev_device struct only keeps track of one pending touch up event so in this case the second touch up event would override the first and it would be lost. This patch changes it to also flush the events whenever the slot changes so that it will flush the previous touch up event before trying to queue the next one. https://bugs.freedesktop.org/show_bug.cgi?id=67563
-rw-r--r--src/evdev-touchpad.c2
-rw-r--r--src/evdev.c7
-rw-r--r--src/evdev.h2
3 files changed, 6 insertions, 5 deletions
diff --git a/src/evdev-touchpad.c b/src/evdev-touchpad.c
index 600df073..aa9df62c 100644
--- a/src/evdev-touchpad.c
+++ b/src/evdev-touchpad.c
@@ -493,7 +493,7 @@ touchpad_update_state(struct touchpad_dispatch *touchpad, uint32_t time)
touchpad->device->rel.dx = wl_fixed_from_double(dx);
touchpad->device->rel.dy = wl_fixed_from_double(dy);
touchpad->device->pending_events |=
- EVDEV_RELATIVE_MOTION | EVDEV_SYN;
+ EVDEV_RELATIVE_MOTION | EVDEV_SYN_OR_SLOT;
} else if (touchpad->finger_state == TOUCHPAD_FINGERS_TWO) {
if (dx != 0.0)
notify_axis(touchpad->device->seat,
diff --git a/src/evdev.c b/src/evdev.c
index 2367d56b..3ccdd3ca 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -110,6 +110,7 @@ evdev_process_touch(struct evdev_device *device, struct input_event *e)
switch (e->code) {
case ABS_MT_SLOT:
device->mt.slot = e->value;
+ device->pending_events |= EVDEV_SYN_OR_SLOT;
break;
case ABS_MT_TRACKING_ID:
if (e->value >= 0)
@@ -261,11 +262,11 @@ evdev_flush_motion(struct evdev_device *device, uint32_t time)
int32_t cx, cy;
int slot;
- if (!(device->pending_events & EVDEV_SYN))
+ if (!(device->pending_events & EVDEV_SYN_OR_SLOT))
return;
slot = device->mt.slot;
- device->pending_events &= ~EVDEV_SYN;
+ device->pending_events &= ~EVDEV_SYN_OR_SLOT;
if (device->pending_events & EVDEV_RELATIVE_MOTION) {
notify_motion(master, time, device->rel.dx, device->rel.dy);
device->pending_events &= ~EVDEV_RELATIVE_MOTION;
@@ -332,7 +333,7 @@ fallback_process(struct evdev_dispatch *dispatch,
evdev_process_key(device, event, time);
break;
case EV_SYN:
- device->pending_events |= EVDEV_SYN;
+ device->pending_events |= EVDEV_SYN_OR_SLOT;
break;
}
}
diff --git a/src/evdev.h b/src/evdev.h
index 524fa229..7edcce6e 100644
--- a/src/evdev.h
+++ b/src/evdev.h
@@ -36,7 +36,7 @@ enum evdev_event_type {
EVDEV_ABSOLUTE_MT_MOTION = (1 << 2),
EVDEV_ABSOLUTE_MT_UP = (1 << 3),
EVDEV_RELATIVE_MOTION = (1 << 4),
- EVDEV_SYN = (1 << 5),
+ EVDEV_SYN_OR_SLOT = (1 << 5),
};
enum evdev_device_capability {