summaryrefslogtreecommitdiff
path: root/libevdev
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2013-05-30 13:58:45 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2013-05-30 13:58:45 +1000
commit4ae4f24ef773dcb1f7a841d31f70e6900670158e (patch)
tree0f470ebec0054a51c21076919c6e5e6a870af391 /libevdev
parent3e22ef86ab2c99c1149658febdc7b91916fb5a45 (diff)
downloadlibevdev-4ae4f24ef773dcb1f7a841d31f70e6900670158e.tar.gz
Update the MT state properly
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Diffstat (limited to 'libevdev')
-rw-r--r--libevdev/libevdev-int.h1
-rw-r--r--libevdev/libevdev.c22
2 files changed, 22 insertions, 1 deletions
diff --git a/libevdev/libevdev-int.h b/libevdev/libevdev-int.h
index 4e394d0..7b28884 100644
--- a/libevdev/libevdev-int.h
+++ b/libevdev/libevdev-int.h
@@ -64,6 +64,7 @@ struct libevdev {
struct input_absinfo abs_info[ABS_CNT];
unsigned int mt_slot_vals[MAX_SLOTS][ABS_MT_CNT];
int num_slots; /**< valid slots in mt_slot_vals */
+ int current_slot;
int need_sync;
int grabbed;
diff --git a/libevdev/libevdev.c b/libevdev/libevdev.c
index 173f33c..40bbe37 100644
--- a/libevdev/libevdev.c
+++ b/libevdev/libevdev.c
@@ -150,6 +150,7 @@ libevdev_new(int fd)
dev = calloc(1, sizeof(*dev));
dev->num_slots = -1;
+ dev->current_slot = -1;
dev->log = libevdev_noop_log_func;
if (fd >= 0)
@@ -237,8 +238,10 @@ libevdev_set_fd(struct libevdev* dev, int fd)
if (rc < 0)
goto out;
- if (i == ABS_MT_SLOT)
+ if (i == ABS_MT_SLOT) {
dev->num_slots = abs_info.maximum + 1; /* FIXME: non-zero min? */
+ dev->current_slot = abs_info.value;
+ }
}
}
@@ -439,6 +442,20 @@ update_key_state(struct libevdev *dev, const struct input_event *e)
}
static int
+update_mt_state(struct libevdev *dev, const struct input_event *e)
+{
+ if (e->code == ABS_MT_SLOT) {
+ dev->current_slot = e->value;
+ return 0;
+ } else if (dev->current_slot == -1)
+ return 1;
+
+ dev->mt_slot_vals[dev->current_slot][e->code - ABS_MT_MIN] = e->value;
+
+ return 0;
+}
+
+static int
update_abs_state(struct libevdev *dev, const struct input_event *e)
{
if (!libevdev_has_event_type(dev, EV_ABS))
@@ -447,6 +464,9 @@ update_abs_state(struct libevdev *dev, const struct input_event *e)
if (e->code > ABS_MAX)
return 1;
+ if (e->code >= ABS_MT_MIN && e->code <= ABS_MT_MAX)
+ return update_mt_state(dev, e);
+
dev->abs_info[e->code].value = e->value;
return 0;