Currently libinput users just see choppy input if the kernel event queue overflows. This patch passes along an event so the caller can at least log it. --- src/evdev.c | 1 + src/libinput-private.h | 3 +++ src/libinput.c | 18 ++++++++++++++++++ src/libinput.h | 5 +++++ 4 files changed, 27 insertions(+)
diff --git a/src/evdev.c b/src/evdev.c index d8e3e5a..157bed7 100644 --- a/src/evdev.c +++ b/src/evdev.c @@ -929,6 +929,7 @@ evdev_device_dispatch(void *data) to the current state */ ev.code = SYN_REPORT; evdev_device_dispatch_one(device, &ev); + notify_overflowed_device(&device->base); rc = evdev_sync_device(device); if (rc == 0) diff --git a/src/libinput-private.h b/src/libinput-private.h index 5a975d9..4606565 100644 --- a/src/libinput-private.h +++ b/src/libinput-private.h @@ -212,6 +212,9 @@ void notify_removed_device(struct libinput_device *device); void +notify_overflowed_device(struct libinput_device *device); + +void keyboard_notify_key(struct libinput_device *device, uint32_t time, uint32_t key, diff --git a/src/libinput.c b/src/libinput.c index 5780a92..81528b7 100644 --- a/src/libinput.c +++ b/src/libinput.c @@ -171,6 +171,7 @@ libinput_event_get_pointer_event(struct libinput_event *event) abort(); /* not used as actual event type */ case LIBINPUT_EVENT_DEVICE_ADDED: case LIBINPUT_EVENT_DEVICE_REMOVED: + case LIBINPUT_EVENT_DEVICE_OVERFLOW: case LIBINPUT_EVENT_KEYBOARD_KEY: break; case LIBINPUT_EVENT_POINTER_MOTION: @@ -197,6 +198,7 @@ libinput_event_get_keyboard_event(struct libinput_event *event) abort(); /* not used as actual event type */ case LIBINPUT_EVENT_DEVICE_ADDED: case LIBINPUT_EVENT_DEVICE_REMOVED: + case LIBINPUT_EVENT_DEVICE_OVERFLOW: break; case LIBINPUT_EVENT_KEYBOARD_KEY: return (struct libinput_event_keyboard *) event; @@ -223,6 +225,7 @@ libinput_event_get_touch_event(struct libinput_event *event) abort(); /* not used as actual event type */ case LIBINPUT_EVENT_DEVICE_ADDED: case LIBINPUT_EVENT_DEVICE_REMOVED: + case LIBINPUT_EVENT_DEVICE_OVERFLOW: case LIBINPUT_EVENT_KEYBOARD_KEY: case LIBINPUT_EVENT_POINTER_MOTION: case LIBINPUT_EVENT_POINTER_MOTION_ABSOLUTE: @@ -248,6 +251,7 @@ libinput_event_get_device_notify_event(struct libinput_event *event) abort(); /* not used as actual event type */ case LIBINPUT_EVENT_DEVICE_ADDED: case LIBINPUT_EVENT_DEVICE_REMOVED: + case LIBINPUT_EVENT_DEVICE_OVERFLOW: return (struct libinput_event_device_notify *) event; case LIBINPUT_EVENT_KEYBOARD_KEY: case LIBINPUT_EVENT_POINTER_MOTION: @@ -831,6 +835,20 @@ notify_removed_device(struct libinput_device *device) } void +notify_overflowed_device(struct libinput_device *device) +{ + struct libinput_event_device_notify *overflowed_device_event; + + overflowed_device_event = zalloc(sizeof *overflowed_device_event); + if (!overflowed_device_event) + return; + + post_base_event(device, + LIBINPUT_EVENT_DEVICE_OVERFLOW, + &overflowed_device_event->base); +} + +void keyboard_notify_key(struct libinput_device *device, uint32_t time, uint32_t key, diff --git a/src/libinput.h b/src/libinput.h index 9cc6f52..39c9f92 100644 --- a/src/libinput.h +++ b/src/libinput.h @@ -230,6 +230,11 @@ enum libinput_event_type { */ LIBINPUT_EVENT_DEVICE_REMOVED, + /** + * Signals that the kernel event queue for the device has overflowed. + */ + LIBINPUT_EVENT_DEVICE_OVERFLOW, + LIBINPUT_EVENT_KEYBOARD_KEY = 300, LIBINPUT_EVENT_POINTER_MOTION = 400, -- 2.1.1 _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel