[PATCH libevdev 1/3] Count the number of events needed for a full sync

Peter Hutterer peter.hutterer at who-t.net
Thu Jan 16 19:31:53 PST 2014


Make sure we have a queue that is at least large enough to do a full sync
after a SYN_DROPPED, plus store a few extra events in case some came in after
the sync.

Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
---
 libevdev/libevdev.c | 34 ++++++++++++++++++++++++++++++----
 1 file changed, 30 insertions(+), 4 deletions(-)

diff --git a/libevdev/libevdev.c b/libevdev/libevdev.c
index 8a37204..59625a4 100644
--- a/libevdev/libevdev.c
+++ b/libevdev/libevdev.c
@@ -41,12 +41,38 @@ static int sync_mt_state(struct libevdev *dev, int create_events);
 static int
 init_event_queue(struct libevdev *dev)
 {
-	/* FIXME: count the number of axes, keys, etc. to get a better idea at how many events per
-	   EV_SYN we could possibly get. Then multiply that by the actual buffer size we care about */
+	const int MIN_QUEUE_SIZE = 256;
+	int nevents = 1; /* terminating SYN_REPORT */
+	int nslots;
+	unsigned int type, code;
 
-	const int QUEUE_SIZE = 256;
+	/* count the number of axes, keys, etc. to get a better idea at how
+	   many events per EV_SYN we could possibly get. That's the max we
+	   may get during SYN_DROPPED too. Use double that, just so we have
+	   room for events while syncing an event.
+	 */
+	for (type = EV_KEY; type < EV_MAX; type++) {
+		int max = libevdev_event_type_get_max(type);
+		for (code = 0; max > 0 && code < (unsigned int) max; code++) {
+			if (libevdev_has_event_code(dev, type, code))
+				nevents++;
+		}
+	}
 
-	return queue_alloc(dev, QUEUE_SIZE);
+	nslots = libevdev_get_num_slots(dev);
+	if (nslots > 1) {
+		int num_mt_axes = 0;
+
+		for (code = ABS_MT_SLOT; code < ABS_MAX; code++) {
+			if (libevdev_has_event_code(dev, EV_ABS, code))
+				num_mt_axes++;
+		}
+
+		/* We already counted the first slot in the initial count */
+		nevents += num_mt_axes * (nslots - 1);
+	}
+
+	return queue_alloc(dev, min(MIN_QUEUE_SIZE, nevents * 2));
 }
 
 static void
-- 
1.8.4.2



More information about the Input-tools mailing list