tablet: add support for sendevents on tablets
authorPeter Hutterer <peter.hutterer@who-t.net>
Fri, 22 May 2020 01:39:49 +0000 (11:39 +1000)
committerPeter Hutterer <peter.hutterer@who-t.net>
Tue, 26 May 2020 05:11:01 +0000 (05:11 +0000)
This is merely the simple support that we use in the fallback backend as
well. It doesn't interact with touch arbitration directly but it'll be
good enough for the default use-case.

Fixes #476

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
src/evdev-tablet.c
test/test-device.c

index 7cedf5f91b945d4924a6fd909dc7dbe9e1a9d213..217db3f60027c4fd0a0bfa7f4ce7d36e3227b6fb 100644 (file)
@@ -2400,6 +2400,7 @@ tablet_init(struct tablet_dispatch *tablet,
        if (rc != 0)
                return rc;
 
+       evdev_init_sendevents(device, &tablet->base);
        tablet_init_left_handed(device);
 
        for (axis = LIBINPUT_TABLET_TOOL_AXIS_X;
index 3f79201a01b66a516f2498a9f34234e7bdc41841..df6bb22d5e531e424eb5c362b84782623e91db10 100644 (file)
@@ -179,6 +179,46 @@ START_TEST(device_disable)
 }
 END_TEST
 
+START_TEST(device_disable_tablet)
+{
+       struct litest_device *dev = litest_current_device();
+       struct libinput *li = dev->libinput;
+       struct libinput_device *device;
+       enum libinput_config_status status;
+       struct axis_replacement axes[] = {
+               { ABS_DISTANCE, 10 },
+               { ABS_PRESSURE, 0 },
+               { -1, -1 }
+       };
+
+       device = dev->libinput_device;
+
+       litest_drain_events(li);
+
+       status = libinput_device_config_send_events_set_mode(device,
+                       LIBINPUT_CONFIG_SEND_EVENTS_DISABLED);
+       ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
+
+       /* no event from disabling */
+       litest_assert_empty_queue(li);
+
+       litest_tablet_proximity_in(dev, 60, 60, axes);
+       for (int i = 60; i < 70; i++) {
+               litest_tablet_motion(dev, i, i, axes);
+               libinput_dispatch(li);
+       }
+       litest_tablet_proximity_out(dev);
+
+       litest_assert_empty_queue(li);
+
+       /* no event from resuming */
+       status = libinput_device_config_send_events_set_mode(device,
+                       LIBINPUT_CONFIG_SEND_EVENTS_ENABLED);
+       ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
+       litest_assert_empty_queue(li);
+}
+END_TEST
+
 START_TEST(device_disable_touchpad)
 {
        struct litest_device *dev = litest_current_device();
@@ -1573,6 +1613,7 @@ TEST_COLLECTION(device)
        litest_add("device:sendevents", device_sendevents_config_touchpad_superset, LITEST_TOUCHPAD, LITEST_TABLET);
        litest_add("device:sendevents", device_sendevents_config_default, LITEST_ANY, LITEST_TABLET);
        litest_add("device:sendevents", device_disable, LITEST_RELATIVE, LITEST_TABLET);
+       litest_add("device:sendevents", device_disable_tablet, LITEST_TABLET, LITEST_ANY);
        litest_add("device:sendevents", device_disable_touchpad, LITEST_TOUCHPAD, LITEST_TABLET);
        litest_add("device:sendevents", device_disable_touch, LITEST_TOUCH, LITEST_ANY);
        litest_add("device:sendevents", device_disable_touch_during_touch, LITEST_TOUCH, LITEST_ANY);