[PATCH 1/7] litest: add a generic multitouch screen

Peter Hutterer peter.hutterer at who-t.net
Wed Jun 10 23:04:32 PDT 2015


On Wed, Jun 10, 2015 at 04:09:11PM +0200, Andreas Pokorny wrote:
> Adds a device with various touch related axes and respective device features
> to litest. And additional routines to simulate pressure orientation and
> touch major/minor changes.

fwiw, plesae sign off your patches for libinput.

> ---
>  test/Makefile.am           |   1 +
>  test/litest-touch-screen.c | 100 +++++++++++++++++++++++++++++++++++++++++++++
>  test/litest.c              |  43 +++++++++++++++++++
>  test/litest.h              |  16 ++++++++
>  4 files changed, 160 insertions(+)
>  create mode 100644 test/litest-touch-screen.c
> 
> diff --git a/test/Makefile.am b/test/Makefile.am
> index fc05ff6..ebc8eee 100644
> --- a/test/Makefile.am
> +++ b/test/Makefile.am
> @@ -31,6 +31,7 @@ liblitest_la_SOURCES = \
>  	litest-synaptics-t440.c \
>  	litest-synaptics-x1-carbon-3rd.c \
>  	litest-trackpoint.c \
> +	litest-touch-screen.c \
>  	litest-wacom-touch.c \
>  	litest-wacom-intuos-finger.c \
>  	litest-wheel-only.c \
> diff --git a/test/litest-touch-screen.c b/test/litest-touch-screen.c
> new file mode 100644
> index 0000000..fd35e5f
> --- /dev/null
> +++ b/test/litest-touch-screen.c
> @@ -0,0 +1,100 @@
> +/*
> + * Copyright © 2015 Canonical, Ltd.
> + *
> + * Permission to use, copy, modify, distribute, and sell this software and its
> + * documentation for any purpose is hereby granted without fee, provided that
> + * the above copyright notice appear in all copies and that both that copyright
> + * notice and this permission notice appear in supporting documentation, and
> + * that the name of the copyright holders not be used in advertising or
> + * publicity pertaining to distribution of the software without specific,
> + * written prior permission.  The copyright holders make no representations
> + * about the suitability of this software for any purpose.  It is provided "as
> + * is" without express or implied warranty.
> + *
> + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
> + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
> + * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
> + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
> + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
> + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
> + * OF THIS SOFTWARE.
> + */
> +
> +#if HAVE_CONFIG_H
> +#include "config.h"
> +#endif
> +
> +#include "litest.h"
> +#include "litest-int.h"
> +
> +static void litest_generic_mt_setup(void)
> +{
> +	struct litest_device *d = litest_create_device(LITEST_GENERIC_MULTITOUCH_SCREEN);
> +	litest_set_current_device(d);
> +}
> +
> +static struct input_event down[] = {
> +	{ .type = EV_ABS, .code = ABS_MT_SLOT, .value = LITEST_AUTO_ASSIGN },
> +	{ .type = EV_ABS, .code = ABS_MT_TRACKING_ID, .value = LITEST_AUTO_ASSIGN },
> +	{ .type = EV_ABS, .code = ABS_MT_POSITION_X, .value = LITEST_AUTO_ASSIGN },
> +	{ .type = EV_ABS, .code = ABS_MT_POSITION_Y, .value = LITEST_AUTO_ASSIGN },
> +	{ .type = EV_ABS, .code = ABS_MT_PRESSURE, .value = 30  },
> +	{ .type = EV_ABS, .code = ABS_MT_TOUCH_MAJOR, .value = 15 },
> +	{ .type = EV_ABS, .code = ABS_MT_TOUCH_MINOR, .value = 5 },
> +	{ .type = EV_ABS, .code = ABS_MT_ORIENTATION, .value = 64 },
> +	{ .type = EV_SYN, .code = SYN_REPORT, .value = 0 },
> +	{ .type = -1, .code = -1 },
> +};
> +
> +static struct input_event move[] = {
> +	{ .type = EV_ABS, .code = ABS_MT_SLOT, .value = LITEST_AUTO_ASSIGN },
> +	{ .type = EV_ABS, .code = ABS_MT_POSITION_X, .value = LITEST_AUTO_ASSIGN },
> +	{ .type = EV_ABS, .code = ABS_MT_POSITION_Y, .value = LITEST_AUTO_ASSIGN },
> +	{ .type = EV_SYN, .code = SYN_REPORT, .value = 0 },
> +	{ .type = -1, .code = -1 },
> +};
> +
> +static struct litest_device_interface interface = {
> +	.touch_down_events = down,
> +	.touch_move_events = move,
> +};
> +
> +static struct input_absinfo absinfo[] = {
> +	{ ABS_X, 0, 1500, 0, 0, 0 },
> +	{ ABS_Y, 0, 2500, 0, 0, 0 },

out of interest: is his from a real touchscreen? no resolution?

> +	{ ABS_MT_SLOT, 0, 9, 0, 0, 0 },
> +	{ ABS_MT_POSITION_X, 0, 1500, 0, 0, 0 },
> +	{ ABS_MT_POSITION_Y, 0, 2500, 0, 0, 0 },
> +	{ ABS_MT_ORIENTATION, -256, 255, 0, 0, 0 },
> +	{ ABS_MT_TOUCH_MAJOR, 0, 255, 1, 0, 0 },
> +	{ ABS_MT_TOUCH_MINOR, 0, 255, 1, 0, 0 },
> +	{ ABS_MT_PRESSURE, 0, 255, 0, 0, 0 },
> +	{ ABS_MT_TRACKING_ID, 0, 65535, 0, 0, 0 },
> +	{ .value = -1 },
> +};
> +
> +static struct input_id input_id = {
> +	.bustype = 0x1,
> +	.vendor = 0x0,
> +	.product = 0x25,
> +};
> +
> +static int events[] = {
> +	EV_KEY, BTN_TOUCH,
> +	INPUT_PROP_MAX, INPUT_PROP_DIRECT,
> +	-1, -1
> +};
> +
> +struct litest_test_device litest_generic_multitouch_screen_device = {
> +	.type = LITEST_GENERIC_MULTITOUCH_SCREEN,
> +	.features = LITEST_TOUCH| LITEST_ELLIPSE_ORIENTATION | LITEST_PRESSURE|

space missing before the last |

> +		    LITEST_ELLIPSE_SIZE ,
> +	.shortname = "generic-mt",
> +	.setup = litest_generic_mt_setup,
> +	.interface = &interface,
> +
> +	.name = "generic-mt",
> +	.id = &input_id,
> +	.events = events,
> +	.absinfo = absinfo,
> +};
> diff --git a/test/litest.c b/test/litest.c
> index 0e2cb96..e6d70cd 100644
> --- a/test/litest.c
> +++ b/test/litest.c
> @@ -344,6 +344,7 @@ extern struct litest_test_device litest_mouse_roccat_device;
>  extern struct litest_test_device litest_ms_surface_cover_device;
>  extern struct litest_test_device litest_logitech_trackball_device;
>  extern struct litest_test_device litest_atmel_hover_device;
> +extern struct litest_test_device litest_generic_multitouch_screen_device;
>  
>  struct litest_test_device* devices[] = {
>  	&litest_synaptics_clickpad_device,
> @@ -369,6 +370,7 @@ struct litest_test_device* devices[] = {
>  	&litest_ms_surface_cover_device,
>  	&litest_logitech_trackball_device,
>  	&litest_atmel_hover_device,
> +	&litest_generic_multitouch_screen_device,
>  	NULL,
>  };
>  
> @@ -1304,6 +1306,47 @@ litest_touch_move(struct litest_device *d, unsigned int slot,
>  	litest_slot_move(d, slot, x, y, true);
>  }
>  
> +
> +static void
> +change_touch_point_property(struct litest_device *d, unsigned int slot,
> +			    unsigned int code, double value)

separate lines per arg if the args don't fit on a single line.

> +{
> +	struct input_event *ev;
> +	struct input_event property_change[] = {
> +		{ .type = EV_ABS, .code = ABS_MT_SLOT, .value = slot },
> +		{ .type = EV_ABS, .code = code , .value = value},
> +		{ .type = EV_SYN, .code = SYN_REPORT, .value = 0 }
> +	};
> +
> +	ARRAY_FOR_EACH(property_change, ev)
> +		litest_event(d, ev->type, ev->code, ev->value);
> +}
> +
> +void
> +litest_touch_pressure(struct litest_device *d, unsigned int slot,
> +		      double pressure)
> +{
> +	change_touch_point_property(d, slot, ABS_MT_PRESSURE, pressure);
> +}
> +
> +void
> +litest_touch_orientation(struct litest_device *d, unsigned int slot,
> +			 double orientation)
> +{
> +	change_touch_point_property(d, slot, ABS_MT_ORIENTATION, orientation);
> +}
> +
> +void
> +litest_touch_major(struct litest_device *d, unsigned int slot, double touch_major)
> +{
> +	change_touch_point_property(d, slot, ABS_MT_TOUCH_MAJOR, touch_major);
> +}
> +
> +void
> +litest_touch_minor(struct litest_device *d, unsigned int slot, double touch_minor)
> +{
> +	change_touch_point_property(d, slot, ABS_MT_TOUCH_MINOR, touch_minor);
> +}
>  void
>  litest_touch_move_to(struct litest_device *d,
>  		     unsigned int slot,
> diff --git a/test/litest.h b/test/litest.h
> index 1476f4a..3a08b6a 100644
> --- a/test/litest.h
> +++ b/test/litest.h
> @@ -135,6 +135,7 @@ enum litest_device_type {
>  	LITEST_MOUSE_ROCCAT = -22,
>  	LITEST_LOGITECH_TRACKBALL = -23,
>  	LITEST_ATMEL_HOVER = -24,
> +	LITEST_GENERIC_MULTITOUCH_SCREEN= -25,
>  };
>  
>  enum litest_device_feature {
> @@ -156,6 +157,9 @@ enum litest_device_feature {
>  	LITEST_ABSOLUTE = 1 << 13,
>  	LITEST_PROTOCOL_A = 1 << 14,
>  	LITEST_HOVER = 1 << 15,
> +	LITEST_PRESSURE = 1 << 16,
> +	LITEST_ELLIPSE_ORIENTATION = 1 << 17,
> +	LITEST_ELLIPSE_SIZE = 1 << 18,

do we need two different flags for this? how many devices have major/minor
but not orientation?

>  };
>  
>  struct litest_device {
> @@ -302,6 +306,18 @@ void litest_touch_move_two_touches(struct litest_device *d,
>  				   double x1, double y1,
>  				   double dx, double dy,
>  				   int steps, int sleep_ms);
> +void litest_touch_pressure(struct litest_device *d,
> +			   unsigned int slot,
> +			   double pressure);
> +void litest_touch_orientation(struct litest_device *d,
> +			      unsigned int slot,
> +			      double orientation);
> +void litest_touch_major(struct litest_device *d,
> +			unsigned int slot,
> +			double touch_major);
> +void litest_touch_minor(struct litest_device *d,
> +			unsigned int slot,
> +			double touch_minor);
>  void litest_hover_start(struct litest_device *d,
>  			unsigned int slot,
>  			double x,

I'm wondering if this is the best approach here, it would quickly become
unwieldly. Can we use the same approach as in the tablet-support branch,
where we supply an array with axes to override?

Cheers,
   Peter


More information about the wayland-devel mailing list