[PATCH libinput 18/24] test: Add infrastructure for testing tablet events.

Peter Hutterer peter.hutterer at who-t.net
Sun Apr 27 22:07:54 PDT 2014


On Mon, Apr 21, 2014 at 07:11:27PM +0200, Carlos Garnacho wrote:
> no vfuncs are used, only input_event arrays.
> 
> Signed-off-by: Carlos Garnacho <carlosg at gnome.org>
> ---
>  test/litest-int.h |  8 +++++
>  test/litest.c     | 90 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  test/litest.h     | 14 +++++++++
>  3 files changed, 112 insertions(+)
> 
> diff --git a/test/litest-int.h b/test/litest-int.h
> index 19e6e68..e64f8b8 100644
> --- a/test/litest-int.h
> +++ b/test/litest-int.h
> @@ -88,6 +88,14 @@ struct litest_device_interface {
>  	struct input_event *touch_move_events;
>  	struct input_event *touch_up_events;
>  
> +	/**
> +	 * Tablet events, LITEST_AUTO_ASSIGN is allowed on event values for
> +	 * ABS_X, ABS_Y, ABS_DISTANCE and ABS_PRESSURE.
> +	 */
> +	struct input_event *tablet_proximity_in_events;
> +	struct input_event *tablet_proximity_out_events;
> +	struct input_event *tablet_motion_events;
> +
>  	int min[2];
>  	int max[2];
>  };
> diff --git a/test/litest.c b/test/litest.c
> index af7fd39..d6989cd 100644
> --- a/test/litest.c
> +++ b/test/litest.c
> @@ -642,6 +642,96 @@ litest_touch_move_to(struct litest_device *d,
>  	litest_touch_move(d, slot, x_to, y_to);
>  }
>  
> +static int32_t
> +axis_replacement_value(struct axis_replacement *axes,
> +		       int32_t evcode)
> +{
> +	struct axis_replacement *axis = axes;
> +
> +	while (axis->evcode != -1) {
> +		if (axis->evcode == evcode)
> +			return axis->value;
> +		axis++;
> +	}
> +
> +	return -1;
> +}
> +
> +static int
> +auto_assign_tablet_value(struct litest_device *d,
> +			 const struct input_event *ev,
> +			 int x, int y,
> +			 struct axis_replacement *axes)
> +{
> +	static int tracking_id;
> +	int value = ev->value;
> +
> +	if (value != LITEST_AUTO_ASSIGN || ev->type != EV_ABS)
> +		return value;
> +
> +	switch (ev->code) {
> +	case ABS_X:
> +		value = litest_scale(d, ABS_X, x);
> +		break;
> +	case ABS_Y:
> +		value = litest_scale(d, ABS_Y, y);
> +		break;
> +	default:
> +		value = axis_replacement_value(axes, ev->code);
> +		break;
> +	}
> +
> +	return value;
> +}
> +
> +static int
> +tablet_ignore_event(const struct input_event *ev, int value)
> +{
> +	return value == -1 && (ev->code == ABS_PRESSURE || ev->code == ABS_DISTANCE);
> +}

I'm not sure why this is here. what am I missing? If a test sends a
pressure/distance < 0, isn't that a bug in itself? besides, this should
check for value < abs_min because we don't really control what the device
thinks of as 0 anyway.

> +
> +void
> +litest_tablet_proximity_in(struct litest_device *d, int x, int y, struct axis_replacement *axes)
> +{
> +	struct input_event *ev;
> +
> +	ev = d->interface->tablet_proximity_in_events;
> +	while (ev && (int16_t)ev->type != -1 && (int16_t)ev->code != -1) {
> +		int value = auto_assign_tablet_value(d, ev, x, y, axes);
> +		if (!tablet_ignore_event(ev, value))
> +			litest_event(d, ev->type, ev->code, value);
> +		ev++;
> +	}
> +}
> +
> +void
> +litest_tablet_proximity_out(struct litest_device *d)
> +{
> +	struct input_event *ev;
> +
> +	ev = d->interface->tablet_proximity_out_events;
> +	while (ev && (int16_t)ev->type != -1 && (int16_t)ev->code != -1) {
> +		int value = auto_assign_tablet_value(d, ev, -1, -1, NULL);
> +		if (!tablet_ignore_event(ev, value))
> +			litest_event(d, ev->type, ev->code, value);
> +		ev++;
> +	}
> +}
> +
> +void
> +litest_tablet_motion(struct litest_device *d, int x, int y, struct axis_replacement *axes)
> +{
> +	struct input_event *ev;
> +
> +	ev = d->interface->tablet_motion_events;
> +	while (ev && (int16_t)ev->type != -1 && (int16_t)ev->code != -1) {
> +		int value = auto_assign_tablet_value(d, ev, x, y, axes);
> +		if (!tablet_ignore_event(ev, value))
> +			litest_event(d, ev->type, ev->code, value);
> +		ev++;
> +	}
> +}
> +
>  void
>  litest_button_click(struct litest_device *d, unsigned int button, bool is_press)
>  {
> diff --git a/test/litest.h b/test/litest.h
> index 85748cc..80961a7 100644
> --- a/test/litest.h
> +++ b/test/litest.h
> @@ -42,6 +42,7 @@ enum litest_device_type {
>  	LITEST_TRACKPOINT,
>  	LITEST_MOUSE,
>  	LITEST_WACOM_TOUCH,
> +	LITEST_WACOM_TABLET,
>  };
>  
>  enum litest_device_feature {
> @@ -55,6 +56,7 @@ enum litest_device_feature {
>  	LITEST_WHEEL = 1 << 5,
>  	LITEST_TOUCH = 1 << 6,
>  	LITEST_SINGLE_TOUCH = 1 << 7,
> +	LITEST_TABLET = 1 << 8,
>  };
>  
>  struct litest_device {
> @@ -65,6 +67,11 @@ struct litest_device {
>  	struct litest_device_interface *interface;
>  };
>  
> +struct axis_replacement {
> +	int32_t evcode;
> +	int32_t value;
> +};
> +
>  void litest_add(const char *name, void *func,
>  		enum litest_device_feature required_feature,
>  		enum litest_device_feature excluded_feature);
> @@ -105,6 +112,13 @@ void litest_touch_move_to(struct litest_device *d,
>  			  int x_from, int y_from,
>  			  int x_to, int y_to,
>  			  int steps);
> +void litest_tablet_proximity_in(struct litest_device *d,
> +				int x, int y,
> +				struct axis_replacement *axes);
> +void litest_tablet_proximity_out(struct litest_device *d);
> +void litest_tablet_motion(struct litest_device *d,
> +			  int x, int y,
> +			  struct axis_replacement *axes);

you could just use a struct input_event here with the type, code, value
triplet. I don't think we need a separate struct here.

Cheers,
   Peter

>  void litest_button_click(struct litest_device *d,
>  			 unsigned int button,
>  			 bool is_press);
> -- 
> 1.9.0
> 
> _______________________________________________
> 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