[PATCH libinput 07/10] Add a basic pointer acceleration API
Hans de Goede
hdegoede at redhat.com
Wed Jun 4 02:36:08 PDT 2014
Hi,
On 06/03/2014 07:35 AM, Peter Hutterer wrote:
> Only exposes two knobs - speed and precision which have historically been the
> only two knobs exposed anyway on most UIs. We could go for something fancier
> but really, I think this will be enough.
>
> The only open question is whether speed will be enough for high-dpi devices.
I would like to see an implementation of this before adding this API.
Regards,
Hans
>
> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
> ---
> src/libinput-private.h | 12 ++++++++
> src/libinput.c | 53 +++++++++++++++++++++++++++++++++
> src/libinput.h | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++
> 3 files changed, 145 insertions(+)
>
> diff --git a/src/libinput-private.h b/src/libinput-private.h
> index 0d2a1b1..85113bd 100644
> --- a/src/libinput-private.h
> +++ b/src/libinput-private.h
> @@ -93,10 +93,22 @@ struct libinput_device_config_rotation {
> void (*reset)(struct libinput_device *device);
> };
>
> +struct libinput_device_config_accel {
> + int (*available)(struct libinput_device *device);
> + enum libinput_config_status (*set_speed)(struct libinput_device *device,
> + unsigned int speed);
> + enum libinput_config_status (*set_precision)(struct libinput_device *device,
> + unsigned int precision);
> + int (*get_speed)(struct libinput_device *device);
> + int (*get_precision)(struct libinput_device *device);
> + void (*reset)(struct libinput_device *device);
> +};
> +
> struct libinput_device_config {
> struct libinput_device_config_tap *tap;
> struct libinput_device_config_scroll *scroll;
> struct libinput_device_config_rotation *rotation;
> + struct libinput_device_config_accel *accel;
> };
>
> struct libinput_device {
> diff --git a/src/libinput.c b/src/libinput.c
> index 2572f5b..5a068f1 100644
> --- a/src/libinput.c
> +++ b/src/libinput.c
> @@ -1283,3 +1283,56 @@ libinput_device_config_rotation_reset(struct libinput_device *device)
> if (libinput_device_config_rotation_get_increment(device) != 0)
> device->config.rotation->reset(device);
> }
> +
> +
> +LIBINPUT_EXPORT int
> +libinput_device_config_accel_is_available(struct libinput_device *device)
> +{
> + return device->config.accel ?
> + device->config.accel->available(device) : 0;
> +}
> +
> +LIBINPUT_EXPORT enum libinput_config_status
> +libinput_device_config_accel_set_speed(struct libinput_device *device,
> + unsigned int speed)
> +{
> + if (!libinput_device_config_accel_is_available(device))
> + return LIBINPUT_CONFIG_STATUS_UNSUPPORTED;
> +
> + return device->config.accel->set_speed(device, speed);
> +}
> +
> +LIBINPUT_EXPORT enum libinput_config_status
> +libinput_device_config_accel_set_precision(struct libinput_device *device,
> + unsigned int precision)
> +{
> + if (!libinput_device_config_accel_is_available(device))
> + return LIBINPUT_CONFIG_STATUS_UNSUPPORTED;
> +
> + return device->config.accel->set_precision(device, precision);
> +}
> +
> +LIBINPUT_EXPORT unsigned int
> +libinput_device_config_accel_get_speed(struct libinput_device *device)
> +{
> + if (!libinput_device_config_accel_is_available(device))
> + return 0;
> +
> + return device->config.accel->get_speed(device);
> +}
> +
> +LIBINPUT_EXPORT unsigned int
> +libinput_device_config_accel_get_precision(struct libinput_device *device)
> +{
> + if (!libinput_device_config_accel_is_available(device))
> + return 0;
> +
> + return device->config.accel->get_precision(device);
> +}
> +
> +LIBINPUT_EXPORT void
> +libinput_device_config_accel_reset(struct libinput_device *device)
> +{
> + if (device->config.accel)
> + device->config.accel->reset(device);
> +}
> diff --git a/src/libinput.h b/src/libinput.h
> index 328d050..1b6207c 100644
> --- a/src/libinput.h
> +++ b/src/libinput.h
> @@ -1577,6 +1577,86 @@ libinput_device_config_rotation_get(struct libinput_device *device);
> void
> libinput_device_config_rotation_reset(struct libinput_device *device);
>
> +/**
> + * @ingroup config
> + *
> + * Check if a device uses libinput-internal pointer-acceleration.
> + *
> + * @param device The device to configure
> + *
> + * @return 0 if the device is not accelerated, nonzero if it is accelerated
> + */
> +int
> +libinput_device_config_accel_is_available(struct libinput_device *device);
> +
> +/**
> + * @ingroup config
> + *
> + * Set the speed of this pointer device, where 0% is the minimum pointer
> + * acceleration to be applied (none or slowed down, depending on the device)
> + * and 100% is the maximum amount of acceleration to be applied.
> + *
> + * @param device The device to configure
> + * @param speed The abstract speed identifier, ranged 0% to 100%.
> + *
> + * @return A config status code
> + */
> +enum libinput_config_status
> +libinput_device_config_accel_set_speed(struct libinput_device *device,
> + unsigned int speed);
> +
> +/**
> + * @ingroup config
> + *
> + * Set the precision or sensibility of this pointer device. This affects the
> + * movement of the pointer when moving relatively slowly towards a target.
> + * The range is an abstract range, 0% is the minimum pointer precision and
> + * 100% is the maximum precision).
> + *
> + * @param device The device to configure
> + * @param precision The abstract precision identifier, range 0% to 100%.
> + *
> + * @return A config status code
> + */
> +enum libinput_config_status
> +libinput_device_config_accel_set_precision(struct libinput_device *device,
> + unsigned int precision);
> +
> +/**
> + * @ingroup config
> + *
> + * Get the current speed setting for this pointer device.
> + *
> + * @param device The device to configure
> + *
> + * @return The current speed, range 0% to 100%.
> + */
> +unsigned int
> +libinput_device_config_accel_get_speed(struct libinput_device *device);
> +
> +/**
> + * @ingroup config
> + *
> + * Get the current precision setting for this pointer device.
> + *
> + * @param device The device to configure
> + *
> + * @return The current precision, range 0% to 100%.
> + */
> +unsigned int
> +libinput_device_config_accel_get_precision(struct libinput_device *device);
> +
> +/**
> + * @ingroup config
> + *
> + * Reset the acceleration to the device's default setting. If the device
> + * does not support acceleration, this function does nothing.
> + *
> + * @param device The device to configure
> + */
> +void
> +libinput_device_config_accel_reset(struct libinput_device *device);
> +
> #ifdef __cplusplus
> }
> #endif
>
More information about the wayland-devel
mailing list