[PATCH libinput] evdev: Pass along device overflow information
Derek Foreman
derekf at osg.samsung.com
Fri Oct 24 11:18:06 PDT 2014
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
More information about the wayland-devel
mailing list