From: Chase Douglas <chasedouglas@gmail.com>
To: Henrik Rydberg <rydberg@euromail.se>
Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com>,
linux-input@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v3] Input: Add EVIOC mechanism for MT slots
Date: Fri, 03 Feb 2012 01:05:00 +0100 [thread overview]
Message-ID: <4F2B24AC.1020408@gmail.com> (raw)
In-Reply-To: <1328036403-2827-1-git-send-email-rydberg@euromail.se>
On 01/31/2012 08:00 PM, Henrik Rydberg wrote:
> This patch adds the ability to extract MT slot data via a new ioctl,
> EVIOCGMTSLOTS. The function returns an array of slot values for the
> specified ABS_MT event type.
>
> Example of user space usage:
>
> struct INPUT_MT_REQUEST(64) req;
> req.code = ABS_MT_POSITION_X;
> if (ioctl(fd, EVIOCGMTSLOTS(sizeof(req)), &req) < 0)
> return -1;
> for (i = 0; i < 64; i++)
> printf("slot %d: %d\n", i, req.values[i]);
>
> Signed-off-by: Henrik Rydberg <rydberg@euromail.se>
> ---
> Hi Dmitry,
>
> Here is v3 of the EVIOC patch for MT slots. The number of slots if
> gone, the struct is simplified, targeting userland, and calling the
> ioctl with a smaller struct will return the first set of slots.
>
> Cheers,
> Henrik
>
>
> drivers/input/evdev.c | 27 ++++++++++++++++++++++++++-
> include/linux/input.h | 23 +++++++++++++++++++++++
> 2 files changed, 49 insertions(+), 1 deletions(-)
>
> diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c
> index 76457d5..e4cad16 100644
> --- a/drivers/input/evdev.c
> +++ b/drivers/input/evdev.c
> @@ -20,7 +20,7 @@
> #include <linux/slab.h>
> #include <linux/module.h>
> #include <linux/init.h>
> -#include <linux/input.h>
> +#include <linux/input/mt.h>
> #include <linux/major.h>
> #include <linux/device.h>
> #include "input-compat.h"
> @@ -623,6 +623,28 @@ static int evdev_handle_set_keycode_v2(struct input_dev *dev, void __user *p)
> return input_set_keycode(dev, &ke);
> }
>
> +static int evdev_handle_mt_request(struct input_dev *dev,
> + unsigned int size,
> + int __user *ip)
> +{
> + const struct input_mt_slot *mt = dev->mt;
> + unsigned int code;
> + int max_slots;
> + int i;
> +
> + if (get_user(code, &ip[0]))
> + return -EFAULT;
> + if (!input_is_mt_value(code))
> + return -EINVAL;
> +
> + max_slots = (size - sizeof(__u32)) / sizeof(__s32);
> + for (i = 0; i < dev->mtsize && i < max_slots; i++)
> + if (put_user(input_mt_get_value(&mt[i], code), &ip[1 + i]))
> + return -EFAULT;
> +
> + return 0;
> +}
> +
> static long evdev_do_ioctl(struct file *file, unsigned int cmd,
> void __user *p, int compat_mode)
> {
> @@ -708,6 +730,9 @@ static long evdev_do_ioctl(struct file *file, unsigned int cmd,
> return bits_to_user(dev->propbit, INPUT_PROP_MAX,
> size, p, compat_mode);
>
> + case EVIOCGMTSLOTS(0):
> + return evdev_handle_mt_request(dev, size, ip);
> +
> case EVIOCGKEY(0):
> return bits_to_user(dev->key, KEY_MAX, size, p, compat_mode);
>
> diff --git a/include/linux/input.h b/include/linux/input.h
> index 3862e32..1e7e2e5 100644
> --- a/include/linux/input.h
> +++ b/include/linux/input.h
> @@ -99,6 +99,28 @@ struct input_keymap_entry {
> __u8 scancode[32];
> };
>
> +/**
> + * struct INPUT_MT_REQUEST(num_slots) - used by EVIOCGMTSLOTS ioctl
> + * @code: ABS_MT code to read
> + * @values: value array, one value per slot
> + *
> + * The struct definition is used to create an appropriate MT slot message
> + * buffer in userland. Before the call, code is set to the wanted ABS_MT
> + * event type. On return, the value array is filled with the slot values
> + * for the specified ABS_MT code.
> + *
> + * The call argument (len) is the size of the return buffer, which should
> + * satisfy len >= sizeof(struct INPUT_MT_REQUEST(num_slots)). If len is
> + * too small to fit all available slots, the first num_slots are returned.
> + *
> + * If the request code is not an ABS_MT value, -EINVAL is returned.
> + */
> +#define INPUT_MT_REQUEST(num_slots) \
> + { \
> + __u32 code; \
> + __s32 values[num_slots]; \
I think this assumes a userspace C compiler that can handle variable
length arrays. This would require only compiling in C source code at the
C99 standard or later. It looks like C++ doesn't even allow variable
length arrays, though gcc handles it. According to:
http://www.cplusplus.com/forum/beginner/1601/
it looks like Borland c++ compilers may not be able to compile this :(.
-- Chase
next prev parent reply other threads:[~2012-02-03 0:04 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-01-31 19:00 [PATCH v3] Input: Add EVIOC mechanism for MT slots Henrik Rydberg
2012-02-03 0:05 ` Chase Douglas [this message]
2012-02-03 7:27 ` Henrik Rydberg
2012-02-04 18:21 ` Chase Douglas
2012-02-05 7:59 ` Henrik Rydberg
2012-02-05 17:13 ` Chase Douglas
2012-02-05 19:40 ` Henrik Rydberg
2012-02-05 22:55 ` Chase Douglas
2012-02-06 7:25 ` Dmitry Torokhov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4F2B24AC.1020408@gmail.com \
--to=chasedouglas@gmail.com \
--cc=dmitry.torokhov@gmail.com \
--cc=linux-input@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=rydberg@euromail.se \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.