mirror of
https://gitlab.freedesktop.org/libinput/libinput.git
synced 2026-03-02 10:50:30 +01:00
quirks: Add tablet smoothing attribute.
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>
This commit is contained in:
parent
8ee8537491
commit
e6c4b1d16e
5 changed files with 48 additions and 8 deletions
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
12
src/quirks.c
12
src/quirks.c
|
|
@ -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))
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue