[PATCH] Update libinput to support evdev driver v1.2
Peter Hutterer
peter.hutterer at who-t.net
Thu Oct 27 01:30:42 UTC 2016
On Wed, Oct 19, 2016 at 07:05:13PM -0700, Deepa Dinamani wrote:
> Update input event structures read from the kernel to match
> the 1.2 version of the driver.
>
> There are no changes to the exposed interfaces of libinput.
>
> Note that the patch goes along with the changes to libevdev
> and mtdev to support the updated kernel driver.
>
> The associated kernel driver change is proposed at
> https://lkml.org/lkml/2016/10/17/1146 .
>
> Signed-off-by: Deepa Dinamani <deepa.kernel at gmail.com>
> ---
> include/linux/input.h | 49 +++++++++++++++++++++++++++++++++++++++++++++++--
> src/evdev.c | 4 ++--
> 2 files changed, 49 insertions(+), 4 deletions(-)
>
> diff --git a/include/linux/input.h b/include/linux/input.h
> index 4bf3d6d..202798a 100644
> --- a/include/linux/input.h
> +++ b/include/linux/input.h
> @@ -13,10 +13,29 @@
> #include <sys/types.h>
> #include <linux/types.h>
>
> -/*
> - * The event structure itself
> +/* The time structure for y2038 safe raw_input_event.
> + * The fields use unsigned types to extend times until
> + * year 2106 rather than 2038.
> */
> +struct input_timeval {
> + __kernel_ulong_t tv_sec;
> + __kernel_ulong_t tv_usec;
> +};
> +
> +struct raw_input_event {
> + struct input_timeval time;
> + __u16 type;
> + __u16 code;
> + __s32 value;
> +};
> +
> +#ifndef __KERNEL__
>
> +/* Userspace structure.
> + * Definition maintained here for userspace that is not yet updated to use
> + * struct raw_input_event.
> + * Not to be used anywhere within the kernel.
> + */
> struct input_event {
> struct timeval time;
> __u16 type;
> @@ -24,11 +43,37 @@ struct input_event {
> __s32 value;
> };
>
> +
> +static inline void
> +raw_input_to_input_event(const struct raw_input_event *raw, struct input_event *ev)
> +{
> + ev->time.tv_sec = raw->time.tv_sec;
> + ev->time.tv_usec = raw->time.tv_usec;
> + ev->type = raw->type;
> + ev->code = raw->code;
> + ev->value = raw->value;
> +}
> +
> +static inline void
> +input_to_raw_event(const struct input_event *ev, struct raw_input_event *raw)
> +{
> + raw->time.tv_sec = ev->time.tv_sec;
> + raw->time.tv_usec = ev->time.tv_usec;
> + raw->type = ev->type;
> + raw->code = ev->code;
> + raw->value = ev->value;
> +}
> +
> +#endif
> +
> +
> /*
> * Protocol version.
> */
>
> #define EV_VERSION 0x010001
> +#define EV_VERSION_1_2 0x010002
> +
>
> /*
> * IOCTLs (0x00 - 0x7f)
> diff --git a/src/evdev.c b/src/evdev.c
> index f7f7230..5d47119 100644
> --- a/src/evdev.c
> +++ b/src/evdev.c
> @@ -256,7 +256,7 @@ evdev_device_led_update(struct evdev_device *device, enum libinput_led leds)
> { LIBINPUT_LED_CAPS_LOCK, LED_CAPSL },
> { LIBINPUT_LED_SCROLL_LOCK, LED_SCROLLL },
> };
> - struct input_event ev[ARRAY_LENGTH(map) + 1];
> + struct raw_input_event ev[ARRAY_LENGTH(map) + 1];
> unsigned int i;
>
> if (!(device->seat_caps & EVDEV_DEVICE_KEYBOARD))
> @@ -2665,7 +2665,7 @@ evdev_set_device_group(struct evdev_device *device,
> static inline void
> evdev_drain_fd(int fd)
> {
> - struct input_event ev[24];
> + struct raw_input_event ev[24];
don't we need some version detection here? what's the effect of writing new
structs to old kernels, other than lighting up LEDs that shouldn't be lit?
Cheers,
Peter
> size_t sz = sizeof ev;
>
> while (read(fd, &ev, sz) == (int)sz) {
> --
> 2.7.4
More information about the wayland-devel
mailing list