quirks: Add tablet smoothing attribute.
authorQuytelda Kahja <quytelda@tamalin.org>
Mon, 26 Jul 2021 02:23:06 +0000 (19:23 -0700)
committerPeter Hutterer <peter.hutterer@who-t.net>
Wed, 28 Jul 2021 23:53:36 +0000 (23:53 +0000)
https://gitlab.freedesktop.org/libinput/libinput/-/merge_requests/512 disables
input smoothing for AES devices. However, some AES devices produce
segmented/wobbly curves without smoothing. This change introduces an
`AttrTabletSmoothing` boolean property, which overrides the default smoothing
behavior.

See #632

Signed-off-by: Quytelda Kahja <quytelda@tamalin.org>
doc/user/device-quirks.rst
src/evdev-tablet.c
src/quirks.c
src/quirks.h
tools/shared.c

index 32d299c6c69b358636cafa255e816ffb01fd7464..3d4fe83ba3dd1a19504f49d8324538c28a68a96f 100644 (file)
@@ -190,3 +190,6 @@ AttrInputPropEnable=INPUT_PROP_BUTTONPAD;INPUT_PROP_POINTER;
 AttrPointingStickIntegration=internal|external
     Indicates the integration of the pointing stick. This is a string enum.
     Only needed for external pointing sticks. These are rare.
+AttrTabletSmoothing=1|0
+    Enables (1) or disables (0) input smoothing for tablet devices. Smoothing is enabled
+    by default, except on AES devices.
index e3cf658b49546d48ef98771701bfe84d873f6029..3b77b47c817e12e3527c7bf6145172c4abbe3709 100644 (file)
@@ -2344,18 +2344,17 @@ tablet_init_left_handed(struct evdev_device *device)
                                       tablet_change_to_left_handed);
 }
 
-static void
-tablet_init_smoothing(struct evdev_device *device,
-                     struct tablet_dispatch *tablet)
+static bool
+tablet_is_aes(struct evdev_device *device,
+             struct tablet_dispatch *tablet)
 {
-       size_t history_size = ARRAY_LENGTH(tablet->history.samples);
+       bool is_aes = false;
 #if HAVE_LIBWACOM
        const char *devnode;
        WacomDeviceDatabase *db;
        WacomDevice *libwacom_device = NULL;
        const int *stylus_ids;
        int nstyli;
-       bool is_aes = false;
        int vid = evdev_device_get_id_vendor(device);
 
        /* Wacom-specific check for whether smoothing is required:
@@ -2384,12 +2383,36 @@ tablet_init_smoothing(struct evdev_device *device,
                }
        }
 
-       if (is_aes)
-               history_size = 1;
-
        libwacom_destroy(libwacom_device);
+
 out:
 #endif
+       return is_aes;
+}
+
+static void
+tablet_init_smoothing(struct evdev_device *device,
+                     struct tablet_dispatch *tablet)
+{
+       size_t history_size = ARRAY_LENGTH(tablet->history.samples);
+       struct quirks_context *quirks = NULL;
+       struct quirks *q = NULL;
+       bool use_smoothing = true;
+
+       quirks = evdev_libinput_context(device)->quirks;
+       q = quirks_fetch_for_device(quirks, device->udev_device);
+
+       /* By default, always enable smoothing except on AES devices.
+        * AttrTabletSmoothing can override this, if necessary.
+        */
+       if (!q || !quirks_get_bool(q, QUIRK_ATTR_TABLET_SMOOTHING, &use_smoothing))
+               use_smoothing = !tablet_is_aes(device, tablet);
+
+       /* Setting the history size to 1 means we never do any actual smoothing. */
+       if (!use_smoothing)
+               history_size = 1;
+
+       quirks_unref(q);
        tablet->history.size = history_size;
 }
 
index 5216e5b89a5e079d71bc006969637d95d4c7ebb2..b556a9ab580fc4784979165ead362cb6766222d6 100644 (file)
@@ -280,6 +280,7 @@ quirk_get_name(enum quirk q)
        case QUIRK_ATTR_TRACKPOINT_MULTIPLIER:          return "AttrTrackpointMultiplier";
        case QUIRK_ATTR_THUMB_PRESSURE_THRESHOLD:       return "AttrThumbPressureThreshold";
        case QUIRK_ATTR_USE_VELOCITY_AVERAGING:         return "AttrUseVelocityAveraging";
+       case QUIRK_ATTR_TABLET_SMOOTHING:               return "AttrTabletSmoothing";
        case QUIRK_ATTR_THUMB_SIZE_THRESHOLD:           return "AttrThumbSizeThreshold";
        case QUIRK_ATTR_MSC_TIMESTAMP:                  return "AttrMscTimestamp";
        case QUIRK_ATTR_EVENT_CODE_DISABLE:             return "AttrEventCodeDisable";
@@ -796,6 +797,17 @@ parse_attr(struct quirks_context *ctx,
                p->type = PT_BOOL;
                p->value.b = b;
                rc = true;
+       } else if (streq(key, quirk_get_name(QUIRK_ATTR_TABLET_SMOOTHING))) {
+               p->id = QUIRK_ATTR_TABLET_SMOOTHING;
+               if (streq(value, "1"))
+                       b = true;
+               else if (streq(value, "0"))
+                       b = false;
+               else
+                       goto out;
+               p->type = PT_BOOL;
+               p->value.b = b;
+               rc = true;
        } else if (streq(key, quirk_get_name(QUIRK_ATTR_THUMB_PRESSURE_THRESHOLD))) {
                p->id = QUIRK_ATTR_THUMB_PRESSURE_THRESHOLD;
                if (!safe_atou(value, &v))
index 9a11df6714ac92f3a8a78228b5c8af82cd36488d..4a970b90fa24c179adebc943c18d5555a6729182 100644 (file)
@@ -103,6 +103,7 @@ enum quirk {
        QUIRK_ATTR_TRACKPOINT_MULTIPLIER,
        QUIRK_ATTR_THUMB_PRESSURE_THRESHOLD,
        QUIRK_ATTR_USE_VELOCITY_AVERAGING,
+       QUIRK_ATTR_TABLET_SMOOTHING,
        QUIRK_ATTR_THUMB_SIZE_THRESHOLD,
        QUIRK_ATTR_MSC_TIMESTAMP,
        QUIRK_ATTR_EVENT_CODE_DISABLE,
index 65c1c7cef95a79ec086973e558fc086270e78d0c..096fcbeda41ba5081e4884833a7351d050568088 100644 (file)
@@ -732,6 +732,7 @@ tools_list_device_quirks(struct quirks_context *ctx,
                                callback(userdata, buf);
                                break;
                        case QUIRK_ATTR_USE_VELOCITY_AVERAGING:
+                       case QUIRK_ATTR_TABLET_SMOOTHING:
                                snprintf(buf, sizeof(buf), "%s=1", name);
                                callback(userdata, buf);
                                break;