[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