diff --git a/meson.build b/meson.build index 4cb83dd9..6c4b2131 100644 --- a/meson.build +++ b/meson.build @@ -556,6 +556,7 @@ if get_option('tests') 'test/litest-device-wacom-intuos5-pen.c', 'test/litest-device-wacom-isdv4-e6-pen.c', 'test/litest-device-wacom-isdv4-e6-finger.c', + 'test/litest-device-wacom-mobilestudio-pro-pad.c', 'test/litest-device-waltop-tablet.c', 'test/litest-device-wheel-only.c', 'test/litest-device-xen-virtual-pointer.c', diff --git a/src/evdev.c b/src/evdev.c index ea0ed7ad..252958a8 100644 --- a/src/evdev.c +++ b/src/evdev.c @@ -2565,6 +2565,20 @@ evdev_extract_abs_axes(struct evdev_device *device) device->is_mt = 1; } +static void +evdev_disable_accelerometer_axes(struct evdev_device *device) +{ + struct libevdev *evdev = device->evdev; + + libevdev_disable_event_code(evdev, EV_ABS, ABS_X); + libevdev_disable_event_code(evdev, EV_ABS, ABS_Y); + libevdev_disable_event_code(evdev, EV_ABS, ABS_Z); + + libevdev_disable_event_code(evdev, EV_ABS, REL_X); + libevdev_disable_event_code(evdev, EV_ABS, REL_Y); + libevdev_disable_event_code(evdev, EV_ABS, REL_Z); +} + static struct evdev_dispatch * evdev_configure_device(struct evdev_device *device) { @@ -2596,10 +2610,14 @@ evdev_configure_device(struct evdev_device *device) udev_tags & EVDEV_UDEV_TAG_TRACKBALL ? " Trackball" : "", udev_tags & EVDEV_UDEV_TAG_SWITCH ? " Switch" : ""); - if (udev_tags & EVDEV_UDEV_TAG_ACCELEROMETER) { + /* Ignore pure accelerometers, but accept devices that are + * accelerometers with other axes */ + if (udev_tags == (EVDEV_UDEV_TAG_INPUT|EVDEV_UDEV_TAG_ACCELEROMETER)) { evdev_log_info(device, "device is an accelerometer, ignoring\n"); return NULL; + } else if (udev_tags & EVDEV_UDEV_TAG_ACCELEROMETER) { + evdev_disable_accelerometer_axes(device); } /* libwacom *adds* TABLET, TOUCHPAD but leaves JOYSTICK in place, so diff --git a/test/Makefile.am b/test/Makefile.am index 700ae698..81c27ab2 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -73,6 +73,7 @@ liblitest_la_SOURCES = \ litest-device-wacom-intuos5-pen.c \ litest-device-wacom-isdv4-e6-pen.c \ litest-device-wacom-isdv4-e6-finger.c \ + litest-device-wacom-mobilestudio-pro-pad.c \ litest-device-waltop-tablet.c \ litest-device-wheel-only.c \ litest-device-xen-virtual-pointer.c \ diff --git a/test/litest-device-wacom-mobilestudio-pro-pad.c b/test/litest-device-wacom-mobilestudio-pro-pad.c new file mode 100644 index 00000000..3b594256 --- /dev/null +++ b/test/litest-device-wacom-mobilestudio-pro-pad.c @@ -0,0 +1,126 @@ +/* + * Copyright © 2017 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "config.h" + +#include "litest.h" +#include "litest-int.h" + +static void litest_wacom_mobilestudio_pad_setup(void) +{ + struct litest_device *d = litest_create_device(LITEST_WACOM_MOBILESTUDIO_PRO_16_PAD); + litest_set_current_device(d); +} + +static struct input_event down[] = { + { .type = -1, .code = -1 }, +}; + +static struct input_event move[] = { + { .type = -1, .code = -1 }, +}; + +static struct input_event ring_start[] = { + { .type = EV_ABS, .code = ABS_WHEEL, .value = LITEST_AUTO_ASSIGN }, + { .type = EV_ABS, .code = ABS_MISC, .value = 15 }, + { .type = EV_SYN, .code = SYN_REPORT, .value = 0 }, + { .type = -1, .code = -1 }, +} ; + +static struct input_event ring_change[] = { + { .type = EV_ABS, .code = ABS_WHEEL, .value = LITEST_AUTO_ASSIGN }, + { .type = EV_SYN, .code = SYN_REPORT, .value = 0 }, + { .type = -1, .code = -1 }, +} ; + +static struct input_event ring_end[] = { + { .type = EV_ABS, .code = ABS_WHEEL, .value = 0 }, + { .type = EV_ABS, .code = ABS_MISC, .value = 0 }, + { .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, + .pad_ring_start_events = ring_start, + .pad_ring_change_events = ring_change, + .pad_ring_end_events = ring_end, +}; +static struct input_absinfo absinfo[] = { + { ABS_X, -2048, 2048, 0, 0, 0 }, + { ABS_Y, -2048, 2048, 0, 0, 0 }, + { ABS_Z, -2048, 2048, 0, 0, 0 }, + { ABS_WHEEL, 0, 35, 0, 0, 0 }, + { ABS_MISC, 0, 0, 0, 0, 0 }, + { .value = -1 }, +}; + +static struct input_id input_id = { + .bustype = 0x3, + .vendor = 0x56a, + .product = 0x34e, + .version = 0x110, +}; + +static int events[] = { + EV_KEY, BTN_0, + EV_KEY, BTN_1, + EV_KEY, BTN_2, + EV_KEY, BTN_3, + EV_KEY, BTN_4, + EV_KEY, BTN_5, + EV_KEY, BTN_6, + EV_KEY, BTN_7, + EV_KEY, BTN_8, + EV_KEY, BTN_SOUTH, + EV_KEY, BTN_EAST, + EV_KEY, BTN_C, + EV_KEY, BTN_STYLUS, + INPUT_PROP_MAX, INPUT_PROP_ACCELEROMETER, + -1, -1, +}; + +static const char udev_rule[] = +"ACTION==\"remove\", GOTO=\"pad_end\"\n" +"KERNEL!=\"event*\", GOTO=\"pad_end\"\n" +"\n" +"ATTRS{name}==\"litest Wacom MobileStudio Pro 16 Pad*\",\\\n" +" ENV{ID_INPUT_TABLET}=\"1\",\\\n" +" ENV{ID_INPUT_TABLET_PAD}=\"1\"\\\n" +"\n" +"LABEL=\"pad_end\""; + +struct litest_test_device litest_wacom_mobilestudio_13hdt_pad_device = { + .type = LITEST_WACOM_MOBILESTUDIO_PRO_16_PAD, + .features = LITEST_TABLET_PAD | LITEST_RING, + .shortname = "wacom-mobilestudio-pro16-pad", + .setup = litest_wacom_mobilestudio_pad_setup, + .interface = &interface, + + .name = "Wacom MobileStudio Pro 16 Pad", + .id = &input_id, + .events = events, + .absinfo = absinfo, + .udev_rule = udev_rule, +}; diff --git a/test/litest.c b/test/litest.c index db14806b..497b28af 100644 --- a/test/litest.c +++ b/test/litest.c @@ -417,6 +417,7 @@ extern struct litest_test_device litest_lid_switch_device; extern struct litest_test_device litest_lid_switch_surface3_device; extern struct litest_test_device litest_appletouch_device; extern struct litest_test_device litest_gpio_keys_device; +extern struct litest_test_device litest_wacom_mobilestudio_13hdt_pad_device; struct litest_test_device* devices[] = { &litest_synaptics_clickpad_device, @@ -483,6 +484,7 @@ struct litest_test_device* devices[] = { &litest_lid_switch_surface3_device, &litest_appletouch_device, &litest_gpio_keys_device, + &litest_wacom_mobilestudio_13hdt_pad_device, NULL, }; diff --git a/test/litest.h b/test/litest.h index 8625d34b..386aed84 100644 --- a/test/litest.h +++ b/test/litest.h @@ -233,6 +233,7 @@ enum litest_device_type { LITEST_LID_SWITCH_SURFACE3, LITEST_APPLETOUCH, LITEST_GPIO_KEYS, + LITEST_WACOM_MOBILESTUDIO_PRO_16_PAD, }; enum litest_device_feature {