test: add a device to check MOUSE_WHEEL_CLICK_ANGLE handling
authorPeter Hutterer <peter.hutterer@who-t.net>
Mon, 9 Nov 2015 00:18:17 +0000 (10:18 +1000)
committerPeter Hutterer <peter.hutterer@who-t.net>
Mon, 9 Nov 2015 06:06:26 +0000 (16:06 +1000)
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
test/Makefile.am
test/litest-device-mouse-wheel-click-angle.c [new file with mode: 0644]
test/litest.c
test/litest.h
test/pointer.c

index ff1acdad348153c36833ea68c9f7d5c2595185f9..e4ed8e5da936c84ea4ba3541a3bba7acff18edaf 100644 (file)
@@ -28,6 +28,7 @@ liblitest_la_SOURCES = \
        litest-device-mouse.c \
        litest-device-mouse-roccat.c \
        litest-device-mouse-low-dpi.c \
+       litest-device-mouse-wheel-click-angle.c \
        litest-device-ms-surface-cover.c \
        litest-device-protocol-a-touch-screen.c \
        litest-device-qemu-usb-tablet.c \
diff --git a/test/litest-device-mouse-wheel-click-angle.c b/test/litest-device-mouse-wheel-click-angle.c
new file mode 100644 (file)
index 0000000..1460ee3
--- /dev/null
@@ -0,0 +1,74 @@
+/*
+ * Copyright © 2015 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.
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "litest.h"
+#include "litest-int.h"
+
+static void litest_mouse_setup(void)
+{
+       struct litest_device *d = litest_create_device(LITEST_MOUSE_WHEEL_CLICK_ANGLE);
+       litest_set_current_device(d);
+}
+
+static struct input_id input_id = {
+       .bustype = 0x3,
+       .vendor = 0x1234,
+       .product = 0x5678,
+};
+
+static int events[] = {
+       EV_KEY, BTN_LEFT,
+       EV_KEY, BTN_RIGHT,
+       EV_KEY, BTN_MIDDLE,
+       EV_REL, REL_X,
+       EV_REL, REL_Y,
+       EV_REL, REL_WHEEL,
+       -1 , -1,
+};
+
+static const char udev_rule[] =
+"ACTION==\"remove\", GOTO=\"wheel_click_angle_end\"\n"
+"KERNEL!=\"event*\", GOTO=\"wheel_click_angle_end\"\n"
+"\n"
+"ATTRS{name}==\"litest Wheel Click Angle Mouse*\",\\\n"
+"    ENV{MOUSE_WHEEL_CLICK_ANGLE}=\"-7\"\n"
+"\n"
+"LABEL=\"wheel_click_angle_end\"";
+
+struct litest_test_device litest_mouse_wheel_click_angle_device = {
+       .type = LITEST_MOUSE_WHEEL_CLICK_ANGLE,
+       .features = LITEST_RELATIVE | LITEST_BUTTON | LITEST_WHEEL,
+       .shortname = "mouse-wheelclickangle",
+       .setup = litest_mouse_setup,
+       .interface = NULL,
+
+       .name = "Wheel Click Angle Mouse",
+       .id = &input_id,
+       .absinfo = NULL,
+       .events = events,
+       .udev_rule = udev_rule,
+};
index c7cb2746770dd69e711ae7f5a4931944aae51fa8..65be6b5a7dcfdbf93c9d2d4c664c84209bfc4ee4 100644 (file)
@@ -366,6 +366,7 @@ extern struct litest_test_device litest_nexus4_device;
 extern struct litest_test_device litest_magicpad_device;
 extern struct litest_test_device litest_elantech_touchpad_device;
 extern struct litest_test_device litest_mouse_gladius_device;
+extern struct litest_test_device litest_mouse_wheel_click_angle_device;
 
 struct litest_test_device* devices[] = {
        &litest_synaptics_clickpad_device,
@@ -398,6 +399,7 @@ struct litest_test_device* devices[] = {
        &litest_magicpad_device,
        &litest_elantech_touchpad_device,
        &litest_mouse_gladius_device,
+       &litest_mouse_wheel_click_angle_device,
        NULL,
 };
 
index 058057e283777f5f67f99ac619edc26281217535..ed23c8a29a299f8f805782f57a25fa4c0856c10a 100644 (file)
@@ -143,6 +143,7 @@ enum litest_device_type {
        LITEST_MAGIC_TRACKPAD = -29,
        LITEST_ELANTECH_TOUCHPAD = -30,
        LITEST_MOUSE_GLADIUS = -31,
+       LITEST_MOUSE_WHEEL_CLICK_ANGLE = -32,
 };
 
 enum litest_device_feature {
index e12034a045b065fda74d73fb39d49b5d69791d7d..ba158158207787e800f63a6889cbceb8c089b8b5 100644 (file)
@@ -473,6 +473,30 @@ START_TEST(pointer_button_auto_release)
 }
 END_TEST
 
+static inline int
+wheel_click_angle(struct litest_device *dev)
+{
+       struct udev_device *d;
+       const char *prop;
+       const int default_angle = 15;
+       int angle = default_angle;
+
+       d = libinput_device_get_udev_device(dev->libinput_device);
+       litest_assert_ptr_notnull(d);
+
+       prop = udev_device_get_property_value(d, "MOUSE_WHEEL_CLICK_ANGLE");
+       if (!prop)
+               goto out;
+
+       angle = parse_mouse_wheel_click_angle_property(prop);
+       if (angle == 0)
+               angle = default_angle;
+
+out:
+       udev_device_unref(d);
+       return angle;
+}
+
 static void
 test_wheel_event(struct litest_device *dev, int which, int amount)
 {
@@ -481,11 +505,11 @@ test_wheel_event(struct litest_device *dev, int which, int amount)
        struct libinput_event_pointer *ptrev;
        enum libinput_pointer_axis axis;
 
-       /* the current evdev implementation scales the scroll wheel events
-          up by a factor 15 */
-       const int scroll_step = 15;
-       int expected = amount * scroll_step;
-       int discrete = amount;
+       int scroll_step, expected, discrete;;
+
+       scroll_step = wheel_click_angle(dev);
+       expected = amount * scroll_step;
+       discrete = amount;
 
        if (libinput_device_config_scroll_get_natural_scroll_enabled(dev->libinput_device)) {
                expected *= -1;