@@ -23,6 +23,7 @@
#include <linux/input.h>
#include <linux/major.h>
#include <linux/device.h>
+#include <linux/input/mt.h>
#include "input-compat.h"
struct evdev {
@@ -45,6 +46,7 @@ struct evdev_client {
struct fasync_struct *fasync;
struct evdev *evdev;
struct list_head node;
+ int slot; /* used to extract MT events via EVIOC */
int bufsize;
struct input_event buffer[];
};
@@ -741,7 +743,7 @@ static long evdev_do_ioctl(struct file *file, unsigned int cmd,
return -EINVAL;
t = _IOC_NR(cmd) & ABS_MAX;
- abs = dev->absinfo[t];
+ abs = input_mt_get_absinfo(dev, t, client->slot);
if (copy_to_user(p, &abs, min_t(size_t,
size, sizeof(struct input_absinfo))))
@@ -767,9 +769,10 @@ static long evdev_do_ioctl(struct file *file, unsigned int cmd,
if (size < sizeof(struct input_absinfo))
abs.resolution = 0;
- /* We can't change number of reserved MT slots */
- if (t == ABS_MT_SLOT)
- return -EINVAL;
+ if (t == ABS_MT_SLOT) {
+ client->slot = abs.value;
+ return 0;
+ }
/*
* Take event lock to ensure that we are not