[PATCH weston 10/31] evdev: Add device capabilities

Peter Hutterer peter.hutterer at who-t.net
Wed May 30 17:37:37 PDT 2012


On Wed, May 30, 2012 at 04:31:48PM +0100, Daniel Stone wrote:
> Does what it says on the box: lists whether or not the device supports
> key, absolute, relative or touch classes.
> 
> Signed-off-by: Daniel Stone <daniel at fooishbar.org>
> ---
>  src/evdev-private.h |    9 +++++++++
>  src/evdev.c         |   26 ++++++++++++++++++++++++++
>  2 files changed, 35 insertions(+)
> 
> diff --git a/src/evdev-private.h b/src/evdev-private.h
> index e4bcf13..7b56b54 100644
> --- a/src/evdev-private.h
> +++ b/src/evdev-private.h
> @@ -44,6 +44,14 @@ enum evdev_event_type {
>  	EVDEV_RELATIVE_MOTION = (1 << 4),
>  };
>  
> +enum evdev_device_capability {
> +	EVDEV_KEYBOARD = (1 << 0),
> +	EVDEV_BUTTON = (1 << 1),
> +	EVDEV_MOTION_ABS = (1 << 2),
> +	EVDEV_MOTION_REL = (1 << 3),
> +	EVDEV_TOUCH = (1 << 4),
> +};

do you want to add a LEDs as capability?

Cheers,
  Peter

> +
>  struct evdev_input_device {
>  	struct evdev_seat *master;
>  	struct wl_list link;
> @@ -69,6 +77,7 @@ struct evdev_input_device {
>  	} rel;
>  
>  	enum evdev_event_type pending_events;
> +	enum evdev_device_capability caps;
>  
>  	int is_mt;
>  };
> diff --git a/src/evdev.c b/src/evdev.c
> index 6adf10a..a34aa43 100644
> --- a/src/evdev.c
> +++ b/src/evdev.c
> @@ -336,11 +336,14 @@ evdev_configure_device(struct evdev_input_device *device)
>  	struct input_absinfo absinfo;
>  	unsigned long ev_bits[NBITS(EV_MAX)];
>  	unsigned long abs_bits[NBITS(ABS_MAX)];
> +	unsigned long rel_bits[NBITS(REL_MAX)];
>  	unsigned long key_bits[NBITS(KEY_MAX)];
>  	int has_key, has_abs;
> +	unsigned int i;
>  
>  	has_key = 0;
>  	has_abs = 0;
> +	device->caps = 0;
>  
>  	ioctl(device->fd, EVIOCGBIT(0, sizeof(ev_bits)), ev_bits);
>  	if (TEST_BIT(ev_bits, EV_ABS)) {
> @@ -352,17 +355,26 @@ evdev_configure_device(struct evdev_input_device *device)
>  			ioctl(device->fd, EVIOCGABS(ABS_X), &absinfo);
>  			device->abs.min_x = absinfo.minimum;
>  			device->abs.max_x = absinfo.maximum;
> +			device->caps |= EVDEV_MOTION_ABS;
>  		}
>  		if (TEST_BIT(abs_bits, ABS_Y)) {
>  			ioctl(device->fd, EVIOCGABS(ABS_Y), &absinfo);
>  			device->abs.min_y = absinfo.minimum;
>  			device->abs.max_y = absinfo.maximum;
> +			device->caps |= EVDEV_MOTION_ABS;
>  		}
>  		if (TEST_BIT(abs_bits, ABS_MT_SLOT)) {
>  			device->is_mt = 1;
>  			device->mt.slot = 0;
> +			device->caps |= EVDEV_TOUCH;
>  		}
>  	}
> +	if (TEST_BIT(ev_bits, EV_REL)) {
> +		ioctl(device->fd, EVIOCGBIT(EV_REL, sizeof(rel_bits)),
> +		      rel_bits);
> +		if (TEST_BIT(rel_bits, REL_X) || TEST_BIT(rel_bits, REL_Y))
> +			device->caps |= EVDEV_MOTION_REL;
> +	}
>  	if (TEST_BIT(ev_bits, EV_KEY)) {
>  		has_key = 1;
>  		ioctl(device->fd, EVIOCGBIT(EV_KEY, sizeof(key_bits)),
> @@ -371,6 +383,20 @@ evdev_configure_device(struct evdev_input_device *device)
>  		    !TEST_BIT(key_bits, BTN_TOOL_PEN) &&
>  		    has_abs)
>  			device->dispatch = evdev_touchpad_create(device);
> +		for (i = KEY_ESC; i < KEY_MAX; i++) {
> +			if (i >= BTN_MISC && i < KEY_OK)
> +				continue;
> +			if (TEST_BIT(key_bits, i)) {
> +				device->caps |= EVDEV_KEYBOARD;
> +				break;
> +			}
> +		}
> +		for (i = BTN_MISC; i < KEY_OK; i++) {
> +			if (TEST_BIT(key_bits, i)) {
> +				device->caps |= EVDEV_BUTTON;
> +				break;
> +			}
> +		}
>  	}
>  
>  	/* This rule tries to catch accelerometer devices and opt out. We may
> -- 
> 1.7.10
> 
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
> 


More information about the wayland-devel mailing list