commit: f505a4168e95b879438dfc8e3b84f07c531eb8ad
parent 379d4a92f3ba42b200bac190877ed1804ef1d782
Author: Michael Forney <mforney@mforney.org>
Date: Tue, 3 Mar 2020 01:15:16 -0800
libevdev: Update to 1.9.0
Port eventnames script to lua.
Diffstat:
9 files changed, 464 insertions(+), 378 deletions(-)
diff --git a/pkg/libevdev/config.h b/pkg/libevdev/config.h
@@ -1,39 +1 @@
-#define HAVE_DLFCN_H 1
-#define HAVE_INTTYPES_H 1
-#define HAVE_LIBM 1
-#define HAVE_MEMORY_H 1
-#define HAVE_STDINT_H 1
-#define HAVE_STDLIB_H 1
-#define HAVE_STRINGS_H 1
-#define HAVE_STRING_H 1
-#define HAVE_SYS_STAT_H 1
-#define HAVE_SYS_TYPES_H 1
-#define HAVE_UNISTD_H 1
-#define LT_OBJDIR ".libs/"
-#define PACKAGE "libevdev"
-#define PACKAGE_BUGREPORT "https://bugs.freedesktop.org/enter_bug.cgi?product=libevdev"
-#define PACKAGE_NAME "libevdev"
-#define PACKAGE_STRING "libevdev 1.8.0"
-#define PACKAGE_TARNAME "libevdev"
-#define PACKAGE_URL "http://freedesktop.org/wiki/Software/libevdev/"
-#define PACKAGE_VERSION "1.8.0"
-#define STDC_HEADERS 1
-#ifndef _ALL_SOURCE
-# define _ALL_SOURCE 1
-#endif
-#ifndef _GNU_SOURCE
-# define _GNU_SOURCE 1
-#endif
-#ifndef _POSIX_PTHREAD_SEMANTICS
-# define _POSIX_PTHREAD_SEMANTICS 1
-#endif
-#ifndef _TANDEM_SOURCE
-# define _TANDEM_SOURCE 1
-#endif
-#ifndef __EXTENSIONS__
-# define __EXTENSIONS__ 1
-#endif
-#define VERSION "1.8.0"
-/* #undef _MINIX */
-/* #undef _POSIX_1_SOURCE */
-/* #undef _POSIX_SOURCE */
+#define _GNU_SOURCE 1
diff --git a/pkg/libevdev/eventnames.awk b/pkg/libevdev/eventnames.awk
@@ -1,183 +0,0 @@
-BEGIN {
- duplicates["EV_VERSION"] = 1
- duplicates["BTN_MISC"] = 1
- duplicates["BTN_MOUSE"] = 1
- duplicates["BTN_JOYSTICK"] = 1
- duplicates["BTN_GAMEPAD"] = 1
- duplicates["BTN_DIGI"] = 1
- duplicates["BTN_WHEEL"] = 1
- duplicates["BTN_TRIGGER_HAPPY"] = 1
- duplicates["SW_MAX"] = 1
- duplicates["REP_MAX"] = 1
-
- prefixes[++numprefixes] = "EV"
- prefixes[++numprefixes] = "REL"
- prefixes[++numprefixes] = "ABS"
- prefixes[++numprefixes] = "KEY"
- prefixes[++numprefixes] = "BTN"
- prefixes[++numprefixes] = "LED"
- prefixes[++numprefixes] = "SND"
- prefixes[++numprefixes] = "MSC"
- prefixes[++numprefixes] = "SW"
- prefixes[++numprefixes] = "FF"
- prefixes[++numprefixes] = "SYN"
- prefixes[++numprefixes] = "REP"
- prefixes[++numprefixes] = "INPUT_PROP"
- prefixes[++numprefixes] = "MT_TOOL"
-
- code_prefixes[++numcode_prefixes] = "ABS"
- code_prefixes[++numcode_prefixes] = "BTN"
- code_prefixes[++numcode_prefixes] = "FF"
- code_prefixes[++numcode_prefixes] = "KEY"
- code_prefixes[++numcode_prefixes] = "LED"
- code_prefixes[++numcode_prefixes] = "MSC"
- code_prefixes[++numcode_prefixes] = "REL"
- code_prefixes[++numcode_prefixes] = "REP"
- code_prefixes[++numcode_prefixes] = "SND"
- code_prefixes[++numcode_prefixes] = "SW"
- code_prefixes[++numcode_prefixes] = "SYN"
-
- addbtns["BTN_A"] = 1
- addbtns["BTN_B"] = 1
- addbtns["BTN_X"] = 1
- addbtns["BTN_Y"] = 1
-
- skip["BTN"] = 1
- skip["EV"] = 1
- skip["INPUT_PROP"] = 1
- skip["MT_TOOL"] = 1
-}
-
-function print_bits(prefix) {
- printf "static const char * const %s_map[%s_MAX + 1] = {\n", tolower(prefix), prefix
- for (j = 1; j <= numbits[prefix]; ++j) {
- name = bits[prefix, j]
- printf " [%s] = \"%s\",\n", name, name
- }
- if (prefix == "KEY") {
- for (j = 1; j <= numbits["BTN"]; ++j) {
- name = bits["BTN", j]
- printf " [%s] = \"%s\",\n", name, name
- }
- }
- print "};"
- print ""
-}
-
-function print_map() {
- print "static const char * const * const event_type_map[EV_MAX + 1] = {"
- for (i = 1; i <= numprefixes; ++i) {
- prefix = prefixes[i]
- if (prefix in skip)
- continue
- printf " [EV_%s] = %s_map,\n", prefix, tolower(prefix)
- }
- print "};"
- print ""
-
- print "#if __clang__"
- print "#pragma clang diagnostic push"
- print "#pragma clang diagnostic ignored \"-Winitializer-overrides\""
- print "#elif __GNUC__"
- print "#pragma GCC diagnostic push"
- print "#pragma GCC diagnostic ignored \"-Woverride-init\""
- print "#endif"
- print "static const int ev_max[EV_MAX + 1] = {"
- for (i = 1; i <= numprefixes; ++i) {
- prefix = prefixes[i]
- if (prefix in skip)
- continue
- printf " [EV_%s] = %s_MAX,\n", prefix, prefix
- }
- print "};"
- print "#if __clang__"
- print "#pragma clang diagnostic pop /* \"-Winitializer-overrides\" */"
- print "#elif __GNUC__"
- print "#pragma GCC diagnostic pop /* \"-Woverride-init\" */"
- print "#endif"
- print ""
-}
-
-function print_lookup_entry(name, sort) {
- printf " { .name = \"%s\", .value = %s },\n", name, name | sort
-}
-
-function print_lookup(prefix) {
- sort = "sort -t '\"' -k 2"
- for (j = 1; j <= numbits[prefix]; ++j)
- print_lookup_entry(bits[prefix, j], sort)
- if (prefix == "BTN") {
- for (name in addbtns)
- print_lookup_entry(name, sort)
- }
- maxname = prefix "_MAX"
- if (maxname in duplicates)
- print_lookup_entry(maxname, sort)
- close(sort)
-}
-
-function print_lookup_table() {
- print "struct name_entry {"
- print " const char *name;"
- print " unsigned int value;"
- print "};"
- print ""
- print "static const struct name_entry tool_type_names[] = {"
- print_lookup("MT_TOOL")
- print "};"
- print ""
- print "static const struct name_entry ev_names[] = {"
- print_lookup("EV")
- print "};"
- print ""
-
- print "static const struct name_entry code_names[] = {"
- for (i = 1; i <= numcode_prefixes; ++i)
- print_lookup(code_prefixes[i])
- print "};"
- print ""
- print "static const struct name_entry prop_names[] = {"
- print_lookup("INPUT_PROP")
- print "};"
- print ""
-}
-
-function print_mapping_table() {
- print "/* THIS FILE IS GENERATED, DO NOT EDIT */"
- print ""
- print "#ifndef EVENT_NAMES_H"
- print "#define EVENT_NAMES_H"
- print ""
-
- for (i = 1; i <= numprefixes; ++i) {
- prefix = prefixes[i]
- if (prefix == "BTN")
- continue
- print_bits(prefix)
- }
-
- print_map()
- print_lookup_table()
-
- print "#endif /* EVENT_NAMES_H */"
-}
-
-/^#define/ {
- for (i = 1; i <= numprefixes; ++i) {
- prefix = prefixes[i]
- if ($3 !~ /^[0-9a-fx]+$/ || substr($2, 1, length(prefix) + 1) != prefix "_")
- continue
- if ($2 in duplicates)
- next
- idx = indexes[prefix, $3]
- if (!idx) {
- idx = ++numbits[prefix]
- indexes[prefix, $3] = idx
- }
- bits[prefix, idx] = $2
- }
-}
-
-END {
- print_mapping_table()
-}
diff --git a/pkg/libevdev/eventnames.lua b/pkg/libevdev/eventnames.lua
@@ -0,0 +1,181 @@
+local duplicates = {
+ EV_VERSION=true,
+ BTN_MISC=true,
+ BTN_MOUSE=true,
+ BTN_JOYSTICK=true,
+ BTN_GAMEPAD=true,
+ BTN_DIGI=true,
+ BTN_WHEEL=true,
+ BTN_TRIGGER_HAPPY=true,
+ SW_MAX=true,
+ REP_MAX=true,
+ FF_STATUS_MAX=true,
+}
+
+local skip = {
+ BTN=true,
+ EV=true,
+ INPUT_PROP=true,
+ MT_TOOL=true,
+}
+
+local prefixes = {
+ 'EV',
+ 'REL',
+ 'ABS',
+ 'KEY',
+ 'BTN',
+ 'LED',
+ 'SND',
+ 'MSC',
+ 'SW',
+ 'FF',
+ 'SYN',
+ 'REP',
+ 'INPUT_PROP',
+ 'MT_TOOL',
+}
+
+local bits = {}
+for _, prefix in ipairs(prefixes) do
+ bits[prefix] = {}
+end
+bits.EV.map = {}
+
+local function lookuptable(prefix)
+ local entries = {}
+ for _, name in ipairs(bits[prefix]) do
+ table.insert(entries, name)
+ end
+ local max = prefix..'_MAX'
+ if duplicates[max] then
+ table.insert(entries, max)
+ end
+ table.sort(entries)
+ for _, name in ipairs(entries) do
+ io.write(string.format(' { .name = "%s", .value = %s },\n', name, name))
+ end
+end
+
+for i = 1, #arg do
+ for line in io.lines(arg[i]) do
+ local name, value = line:match('^#define%s+(%g+)%s+([%xx]+)%f[^%g]')
+ value = tonumber(value)
+ if name and not duplicates[name] then
+ for prefix, b in pairs(bits) do
+ if name:sub(1, #prefix + 1) == prefix..'_' then
+ if b.map then
+ b.map[value] = name
+ b.map[name] = value
+ end
+ table.insert(b, name)
+ end
+ end
+ end
+ end
+end
+
+io.write[[
+/* THIS FILE IS GENERATED, DO NOT EDIT */
+
+#ifndef EVENT_NAMES_H
+#define EVENT_NAMES_H
+
+]]
+for _, prefix in ipairs(prefixes) do
+ if prefix ~= 'BTN' then
+ io.write(string.format('static const char * const %s_map[%s_MAX + 1] = {\n', prefix:lower(), prefix))
+ for _, name in ipairs(bits[prefix]) do
+ io.write(string.format(' [%s] = "%s",\n', name, name))
+ end
+ if prefix == 'KEY' then
+ for _, name in ipairs(bits.BTN) do
+ io.write(string.format(' [%s] = "%s",\n', name, name))
+ end
+ end
+ io.write[[
+};
+
+]]
+ end
+end
+for _, name in ipairs{'BTN_A', 'BTN_B', 'BTN_X', 'BTN_Y'} do
+ table.insert(bits.BTN, name)
+end
+io.write[[
+static const char * const * const event_type_map[EV_MAX + 1] = {
+]]
+for _, prefix in ipairs(prefixes) do
+ if not skip[prefix] then
+ print(string.format(' [EV_%s] = %s_map,', prefix, prefix:lower()))
+ end
+end
+io.write[[
+};
+
+#if __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Winitializer-overrides"
+#elif __GNUC__
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Woverride-init"
+#endif
+static const int ev_max[EV_MAX + 1] = {
+]]
+for i = 0, bits.EV.map.EV_MAX do
+ local name = bits.EV.map[i]
+ if name and bits[name:sub(4)] then
+ io.write(string.format(' %s_MAX,\n', name:sub(4)))
+ else
+ io.write(' -1,\n')
+ end
+end
+io.write[[
+};
+#if __clang__
+#pragma clang diagnostic pop /* "-Winitializer-overrides" */
+#elif __GNUC__
+#pragma GCC diagnostic pop /* "-Woverride-init" */
+#endif
+
+struct name_entry {
+ const char *name;
+ unsigned int value;
+};
+
+static const struct name_entry tool_type_names[] = {
+]]
+lookuptable('MT_TOOL')
+io.write[[
+};
+
+static const struct name_entry ev_names[] = {
+]]
+lookuptable('EV')
+io.write[[
+};
+
+static const struct name_entry code_names[] = {
+]]
+lookuptable('ABS')
+lookuptable('BTN')
+lookuptable('FF')
+lookuptable('KEY')
+lookuptable('LED')
+lookuptable('MSC')
+lookuptable('REL')
+lookuptable('REP')
+lookuptable('SND')
+lookuptable('SW')
+lookuptable('SYN')
+io.write[[
+};
+
+static const struct name_entry prop_names[] = {
+]]
+lookuptable('INPUT_PROP')
+io.write[[
+};
+
+#endif /* EVENT_NAMES_H */
+]]
diff --git a/pkg/libevdev/gen.lua b/pkg/libevdev/gen.lua
@@ -12,11 +12,12 @@ pkg.deps = {
'pkg/linux-headers/headers',
}
-build('awk', '$outdir/event-names.h', {
+rule('eventnames', 'lua5.2 $dir/eventnames.lua $in >$out')
+build('eventnames', '$outdir/event-names.h', {
'$srcdir/include/linux/input.h',
'$srcdir/include/linux/input-event-codes.h',
- '|', '$dir/eventnames.awk',
-}, {expr='-f $dir/eventnames.awk'})
+ '|', '$dir/eventnames.lua',
+})
lib('libevdev.a', {'libevdev/libevdev.c', 'libevdev/libevdev-names.c'}, {'$outdir/event-names.h'})
file('lib/libevdev.a', '644', '$outdir/libevdev.a')
diff --git a/pkg/libevdev/patch/0001-Avoid-statement-expressions.patch b/pkg/libevdev/patch/0001-Avoid-statement-expressions.patch
@@ -1,78 +0,0 @@
-From 2502b02e69ad84e1e8e96fa1683968e72bbd0501 Mon Sep 17 00:00:00 2001
-From: Michael Forney <mforney@mforney.org>
-Date: Sun, 16 Jun 2019 17:05:30 -0700
-Subject: [PATCH] Avoid statement expressions
-Upstream: https://gitlab.freedesktop.org/libevdev/libevdev/merge_requests/11
-
----
- libevdev/libevdev-int.h | 3 ++-
- libevdev/libevdev-util.h | 13 -------------
- libevdev/libevdev.c | 7 ++++++-
- 3 files changed, 8 insertions(+), 15 deletions(-)
-
-diff --git a/libevdev/libevdev-int.h b/libevdev/libevdev-int.h
-index e1c7ec5..b92d8d5 100644
---- a/libevdev/libevdev-int.h
-+++ b/libevdev/libevdev-int.h
-@@ -198,7 +198,8 @@ queue_shift_multiple(struct libevdev *dev, size_t n, struct input_event *ev)
- return 0;
-
- remaining = dev->queue_next;
-- n = min(n, remaining);
-+ if (remaining < n)
-+ n = remaining;
- remaining -= n;
-
- if (ev)
-diff --git a/libevdev/libevdev-util.h b/libevdev/libevdev-util.h
-index c6e1197..e8b6769 100644
---- a/libevdev/libevdev-util.h
-+++ b/libevdev/libevdev-util.h
-@@ -32,19 +32,6 @@
- #define ARRAY_LENGTH(a) (sizeof(a) / (sizeof((a)[0])))
- #define unlikely(x) (__builtin_expect(!!(x),0))
-
--#undef min
--#undef max
--#define min(a,b) \
-- ({ __typeof__ (a) _a = (a); \
-- __typeof__ (b) _b = (b); \
-- _a > _b ? _b : _a; \
-- })
--#define max(a,b) \
-- ({ __typeof__ (a) _a = (a); \
-- __typeof__ (b) _b = (b); \
-- _a > _b ? _a : _b; \
-- })
--
- static inline bool
- startswith(const char *str, size_t len, const char *prefix, size_t plen)
- {
-diff --git a/libevdev/libevdev.c b/libevdev/libevdev.c
-index c5798b4..e5abe91 100644
---- a/libevdev/libevdev.c
-+++ b/libevdev/libevdev.c
-@@ -67,6 +67,7 @@ init_event_queue(struct libevdev *dev)
- int nevents = 1; /* terminating SYN_REPORT */
- int nslots;
- unsigned int type, code;
-+ size_t size;
-
- /* 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
-@@ -94,7 +95,11 @@ init_event_queue(struct libevdev *dev)
- nevents += num_mt_axes * (nslots - 1);
- }
-
-- return queue_alloc(dev, max(MIN_QUEUE_SIZE, nevents * 2));
-+ size = nevents * 2;
-+ if (size < MIN_QUEUE_SIZE)
-+ size = MIN_QUEUE_SIZE;
-+
-+ return queue_alloc(dev, size);
- }
-
- static void
---
-2.20.1
-
diff --git a/pkg/libevdev/patch/0001-Revert-switch-to-VLAs-for-multitouch-state.patch b/pkg/libevdev/patch/0001-Revert-switch-to-VLAs-for-multitouch-state.patch
@@ -0,0 +1,277 @@
+From b3fba1efb0475b6e64e4109738bde1e83d87147a Mon Sep 17 00:00:00 2001
+From: Michael Forney <mforney@mforney.org>
+Date: Tue, 3 Mar 2020 14:17:37 -0800
+Subject: [PATCH libevdev] Revert switch to VLAs for multitouch state
+
+Signed-off-by: Michael Forney <mforney@mforney.org>
+---
+ libevdev/libevdev-int.h | 28 ++++++++++++++
+ libevdev/libevdev.c | 84 ++++++++++++++++++++---------------------
+ 2 files changed, 68 insertions(+), 44 deletions(-)
+
+diff --git a/libevdev/libevdev-int.h b/libevdev/libevdev-int.h
+index 7da5cf0..2743e50 100644
+--- a/libevdev/libevdev-int.h
++++ b/libevdev/libevdev-int.h
+@@ -24,6 +24,7 @@
+ #define LIBEVDEV_INT_H
+
+ #include "config.h"
++#include <stdint.h>
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <stdbool.h>
+@@ -55,6 +56,26 @@ enum SyncState {
+ SYNC_IN_PROGRESS,
+ };
+
++struct mt_sync_state {
++ uint32_t code;
++ int32_t val[];
++};
++
++/* Keeps a record of touches during SYN_DROPPED */
++enum touch_state {
++ TOUCH_OFF,
++ TOUCH_STARTED, /* Started during SYN_DROPPED */
++ TOUCH_STOPPED, /* Stopped during SYN_DROPPED */
++ TOUCH_ONGOING, /* Existed before, still have same tracking ID */
++ TOUCH_CHANGED, /* Existed before but have new tracking ID now, so
++ stopped + started in that slot */
++};
++
++struct slot_change_state {
++ enum touch_state state;
++ unsigned long axes[NLONGS(ABS_CNT)]; /* bitmask for updated axes */
++};
++
+ /**
+ * Internal only: log data used to send messages to the respective log
+ * handler. We re-use the same struct for a global and inside
+@@ -107,6 +128,13 @@ struct libevdev {
+
+ struct timeval last_event_time;
+
++ struct {
++ struct mt_sync_state *mt_state;
++ size_t mt_state_sz; /* in bytes */
++ struct slot_change_state *changes;
++ size_t changes_sz; /* in bytes */
++ } mt_sync;
++
+ struct logdata log;
+ };
+
+diff --git a/libevdev/libevdev.c b/libevdev/libevdev.c
+index f034637..77cf678 100644
+--- a/libevdev/libevdev.c
++++ b/libevdev/libevdev.c
+@@ -28,7 +28,6 @@
+ #include <limits.h>
+ #include <unistd.h>
+ #include <stdarg.h>
+-#include <stdint.h>
+ #include <stdbool.h>
+
+ #include "libevdev.h"
+@@ -44,23 +43,7 @@ enum event_filter_status {
+ EVENT_FILTER_DISCARD, /**< Discard current event */
+ };
+
+-/* Keeps a record of touches during SYN_DROPPED */
+-enum touch_state {
+- TOUCH_OFF,
+- TOUCH_STARTED, /* Started during SYN_DROPPED */
+- TOUCH_STOPPED, /* Stopped during SYN_DROPPED */
+- TOUCH_ONGOING, /* Existed before, still have same tracking ID */
+- TOUCH_CHANGED, /* Existed before but have new tracking ID now, so
+- stopped + started in that slot */
+-};
+-
+-struct slot_change_state {
+- enum touch_state state;
+- unsigned long axes[NLONGS(ABS_CNT)]; /* bitmask for updated axes */
+-};
+-
+-static int sync_mt_state(struct libevdev *dev,
+- struct slot_change_state *changes_out);
++static int sync_mt_state(struct libevdev *dev);
+ static int
+ update_key_state(struct libevdev *dev, const struct input_event *e);
+
+@@ -218,6 +201,8 @@ libevdev_reset(struct libevdev *dev)
+ free(dev->phys);
+ free(dev->uniq);
+ free(dev->mt_slot_vals);
++ free(dev->mt_sync.mt_state);
++ free(dev->mt_sync.changes);
+ memset(dev, 0, sizeof(*dev));
+ dev->fd = -1;
+ dev->initialized = false;
+@@ -347,7 +332,11 @@ free_slots(struct libevdev *dev)
+ {
+ dev->num_slots = -1;
+ free(dev->mt_slot_vals);
++ free(dev->mt_sync.changes);
++ free(dev->mt_sync.mt_state);
+ dev->mt_slot_vals = NULL;
++ dev->mt_sync.changes = NULL;
++ dev->mt_sync.mt_state = NULL;
+ }
+
+ static int
+@@ -357,7 +346,11 @@ init_slots(struct libevdev *dev)
+ int rc = 0;
+
+ free(dev->mt_slot_vals);
++ free(dev->mt_sync.changes);
++ free(dev->mt_sync.mt_state);
+ dev->mt_slot_vals = NULL;
++ dev->mt_sync.changes = NULL;
++ dev->mt_sync.mt_state = NULL;
+
+ /* devices with ABS_RESERVED aren't MT devices,
+ see the documentation for multitouch-related
+@@ -381,6 +374,19 @@ init_slots(struct libevdev *dev)
+ }
+ dev->current_slot = abs_info->value;
+
++ dev->mt_sync.mt_state_sz = sizeof(*dev->mt_sync.mt_state) +
++ dev->num_slots * sizeof(int32_t);
++ dev->mt_sync.mt_state = calloc(1, dev->mt_sync.mt_state_sz);
++
++ dev->mt_sync.changes_sz = dev->num_slots *
++ sizeof(dev->mt_sync.changes[0]);
++ dev->mt_sync.changes = malloc(dev->mt_sync.changes_sz);
++
++ if (!dev->mt_sync.changes || !dev->mt_sync.mt_state) {
++ rc = -ENOMEM;
++ goto out;
++ }
++
+ reset_tracking_ids(dev);
+ out:
+ return rc;
+@@ -536,10 +542,8 @@ libevdev_set_fd(struct libevdev* dev, int fd)
+ if (rc != 0)
+ goto out;
+
+- if (dev->num_slots != -1) {
+- struct slot_change_state unused[dev->num_slots];
+- sync_mt_state(dev, unused);
+- }
++ if (dev->num_slots != -1)
++ sync_mt_state(dev);
+
+ rc = init_event_queue(dev);
+ if (rc < 0) {
+@@ -674,32 +678,27 @@ out:
+ }
+
+ static int
+-sync_mt_state(struct libevdev *dev,
+- struct slot_change_state changes_out[dev->num_slots])
++sync_mt_state(struct libevdev *dev)
+ {
+-#define MAX_SLOTS 256
+ int rc = 0;
+- struct slot_change_state changes[MAX_SLOTS] = {0};
++ struct mt_sync_state *mt_state = dev->mt_sync.mt_state;
++ struct slot_change_state *changes = dev->mt_sync.changes;
+
+- for (int axis = ABS_MT_MIN; axis <= ABS_MT_MAX; axis++) {
+- /* EVIOCGMTSLOTS required format */
+- struct mt_sync_state {
+- uint32_t code;
+- int32_t val[MAX_SLOTS];
+- } mt_state;
++ memset(dev->mt_sync.changes, 0, dev->mt_sync.changes_sz);
+
++ for (int axis = ABS_MT_MIN; axis <= ABS_MT_MAX; axis++) {
+ if (axis == ABS_MT_SLOT ||
+ !libevdev_has_event_code(dev, EV_ABS, axis))
+ continue;
+
+- mt_state.code = axis;
+- rc = ioctl(dev->fd, EVIOCGMTSLOTS(sizeof(mt_state)), &mt_state);
++ mt_state->code = axis;
++ rc = ioctl(dev->fd, EVIOCGMTSLOTS(dev->mt_sync.mt_state_sz), mt_state);
+ if (rc < 0)
+ goto out;
+
+- for (int slot = 0; slot < min(MAX_SLOTS, dev->num_slots); slot++) {
++ for (int slot = 0; slot < dev->num_slots; slot++) {
+ int val_before = *slot_value(dev, slot, axis),
+- val_after = mt_state.val[slot];
++ val_after = mt_state->val[slot];
+
+ if (axis == ABS_MT_TRACKING_ID) {
+ if (val_before == -1 && val_after != -1) {
+@@ -728,14 +727,12 @@ sync_mt_state(struct libevdev *dev,
+ }
+ }
+
+- memcpy(changes_out, changes, sizeof(*changes) * dev->num_slots);
+ out:
+ return rc;
+ }
+
+ static void
+ terminate_slots(struct libevdev *dev,
+- const struct slot_change_state changes[dev->num_slots],
+ int *last_reported_slot)
+ {
+ const unsigned int map[] = {BTN_TOOL_FINGER, BTN_TOOL_DOUBLETAP,
+@@ -743,6 +740,7 @@ terminate_slots(struct libevdev *dev,
+ BTN_TOOL_QUINTTAP};
+ bool touches_stopped = false;
+ int ntouches_before = 0, ntouches_after = 0;
++ struct slot_change_state *changes = dev->mt_sync.changes;
+
+ /* For BTN_TOOL_* emulation, we need to know how many touches we had
+ * before and how many we have left once we terminate all the ones
+@@ -806,10 +804,10 @@ terminate_slots(struct libevdev *dev,
+
+ static int
+ push_mt_sync_events(struct libevdev *dev,
+- const struct slot_change_state changes[dev->num_slots],
+ int last_reported_slot)
+ {
+ struct input_absinfo abs_info;
++ struct slot_change_state *changes = dev->mt_sync.changes;
+ int rc;
+
+ for (int slot = 0; slot < dev->num_slots; slot++) {
+@@ -916,8 +914,6 @@ sync_state(struct libevdev *dev)
+ int rc = 0;
+ bool want_mt_sync = false;
+ int last_reported_slot = 0;
+- struct slot_change_state changes[dev->num_slots > 0 ? dev->num_slots : 1];
+- memset(changes, 0, sizeof(changes));
+
+ /* see section "Discarding events before synchronizing" in
+ * libevdev/libevdev.h */
+@@ -935,9 +931,9 @@ sync_state(struct libevdev *dev)
+ if (dev->num_slots > -1 &&
+ libevdev_has_event_code(dev, EV_ABS, ABS_MT_SLOT)) {
+ want_mt_sync = true;
+- rc = sync_mt_state(dev, changes);
++ rc = sync_mt_state(dev);
+ if (rc == 0)
+- terminate_slots(dev, changes, &last_reported_slot);
++ terminate_slots(dev, &last_reported_slot);
+ else
+ want_mt_sync = false;
+ }
+@@ -951,7 +947,7 @@ sync_state(struct libevdev *dev)
+ if (rc == 0 && libevdev_has_event_type(dev, EV_ABS))
+ rc = sync_abs_state(dev);
+ if (rc == 0 && want_mt_sync)
+- push_mt_sync_events(dev, changes, last_reported_slot);
++ push_mt_sync_events(dev, last_reported_slot);
+
+ dev->queue_nsync = queue_num_elements(dev);
+
+--
+2.25.1
+
diff --git a/pkg/libevdev/patch/0002-Avoid-initializer-index-range.patch b/pkg/libevdev/patch/0002-Avoid-initializer-index-range.patch
@@ -1,39 +0,0 @@
-From 2c63dd5278059b4513a265299915c4237e5b0178 Mon Sep 17 00:00:00 2001
-From: Michael Forney <mforney@mforney.org>
-Date: Sun, 16 Jun 2019 17:14:18 -0700
-Subject: [PATCH] Avoid initializer index range
-Upstream: https://gitlab.freedesktop.org/libevdev/libevdev/merge_requests/11
-
----
- libevdev/libevdev.c | 2 +-
- libevdev/make-event-names.py | 1 -
- 2 files changed, 1 insertion(+), 2 deletions(-)
-
-diff --git a/libevdev/libevdev.c b/libevdev/libevdev.c
-index d750186..29cb615 100644
---- a/libevdev/libevdev.c
-+++ b/libevdev/libevdev.c
-@@ -1708,7 +1708,7 @@ libevdev_property_get_name(unsigned int prop)
- LIBEVDEV_EXPORT int
- libevdev_event_type_get_max(unsigned int type)
- {
-- if (type > EV_MAX)
-+ if (type > EV_MAX || !ev_max[type])
- return -1;
-
- return ev_max[type];
-diff --git a/libevdev/make-event-names.py b/libevdev/make-event-names.py
-index 716c1d7..de3a725 100755
---- a/libevdev/make-event-names.py
-+++ b/libevdev/make-event-names.py
-@@ -94,7 +94,6 @@ def print_map(bits):
- print("#pragma GCC diagnostic ignored \"-Woverride-init\"")
- print("#endif")
- print("static const int ev_max[EV_MAX + 1] = {")
-- print(" [0 ... EV_MAX] = -1,")
- for prefix in prefixes:
- if prefix in ["BTN_", "EV_", "INPUT_PROP_", "MT_TOOL_"]:
- continue
---
-2.23.0
-
diff --git a/pkg/libevdev/patch/0003-Only-use-GCC-pragma-on-GCC.patch b/pkg/libevdev/patch/0003-Only-use-GCC-pragma-on-GCC.patch
@@ -1,35 +0,0 @@
-From 296ede81584f7490196e29a95a8b2655efcc121e Mon Sep 17 00:00:00 2001
-From: Michael Forney <mforney@mforney.org>
-Date: Sun, 16 Jun 2019 17:18:00 -0700
-Subject: [PATCH] Only use GCC pragma on GCC
-Upstream: https://gitlab.freedesktop.org/libevdev/libevdev/merge_requests/11
-
----
- libevdev/make-event-names.py | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/libevdev/make-event-names.py b/libevdev/make-event-names.py
-index de3a725..9612440 100755
---- a/libevdev/make-event-names.py
-+++ b/libevdev/make-event-names.py
-@@ -89,7 +89,7 @@ def print_map(bits):
- print("#if __clang__")
- print("#pragma clang diagnostic push")
- print("#pragma clang diagnostic ignored \"-Winitializer-overrides\"")
-- print("#else")
-+ print("#elif __GNUC__")
- print("#pragma GCC diagnostic push")
- print("#pragma GCC diagnostic ignored \"-Woverride-init\"")
- print("#endif")
-@@ -101,7 +101,7 @@ def print_map(bits):
- print("};")
- print("#if __clang__")
- print("#pragma clang diagnostic pop /* \"-Winitializer-overrides\" */")
-- print("#else")
-+ print("#elif __GNUC__")
- print("#pragma GCC diagnostic pop /* \"-Woverride-init\" */")
- print("#endif");
- print("")
---
-2.20.1
-
diff --git a/pkg/libevdev/ver b/pkg/libevdev/ver
@@ -1 +1 @@
-1.8.0 r1
+1.9.0 r0