From 4c48b46d15497fec9fa16cbf39f83bc3c090db6f Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Tue, 28 Jul 2015 15:06:13 +1000 Subject: [PATCH] filter: revamp to create device-specific filters, rather than accel functions MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit The previous approach to pointer acceleration was to initialize the same motion filter behavior but a different acceleration profile depending on the hardware (the profile converts a speed to a multiplier for input deltas). To be more flexible for hardware-specifics, change this into a set of specific pointer acceleration init functions. This patch has no effective functional changes, they're still all the same. The acceleration functions are kept for direct access by the ptraccel-debug tool. Signed-off-by: Peter Hutterer Reviewed-by: Jonas Ådahl --- src/evdev-mt-touchpad.c | 10 +++---- src/evdev.c | 18 ++++++------ src/evdev.h | 2 +- src/filter.c | 62 ++++++++++++++++++++++++++++++++++++++--- src/filter.h | 14 ++++++++-- tools/ptraccel-debug.c | 3 +- 6 files changed, 86 insertions(+), 23 deletions(-) diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c index a683d9a4..f48aa26d 100644 --- a/src/evdev-mt-touchpad.c +++ b/src/evdev-mt-touchpad.c @@ -1510,7 +1510,7 @@ static int tp_init_accel(struct tp_dispatch *tp, double diagonal) { int res_x, res_y; - accel_profile_func_t profile; + struct motion_filter *filter; res_x = tp->device->abs.absinfo_x->resolution; res_y = tp->device->abs.absinfo_y->resolution; @@ -1526,14 +1526,14 @@ tp_init_accel(struct tp_dispatch *tp, double diagonal) tp->accel.y_scale_coeff = (DEFAULT_MOUSE_DPI/25.4) / res_y; if (tp->device->model_flags & EVDEV_MODEL_LENOVO_X230) - profile = touchpad_lenovo_x230_accel_profile; + filter = create_pointer_accelerator_filter_lenovo_x230(tp->device->dpi); else - profile = touchpad_accel_profile_linear; + filter = create_pointer_accelerator_filter_touchpad(tp->device->dpi); - if (evdev_device_init_pointer_acceleration(tp->device, profile) == -1) + if (!filter) return -1; - return 0; + return evdev_device_init_pointer_acceleration(tp->device, filter); } static uint32_t diff --git a/src/evdev.c b/src/evdev.c index 17c26043..bb317248 100644 --- a/src/evdev.c +++ b/src/evdev.c @@ -1408,12 +1408,9 @@ evdev_accel_config_get_default_speed(struct libinput_device *device) int evdev_device_init_pointer_acceleration(struct evdev_device *device, - accel_profile_func_t profile) + struct motion_filter *filter) { - device->pointer.filter = create_pointer_accelerator_filter(profile, - device->dpi); - if (!device->pointer.filter) - return -1; + device->pointer.filter = filter; device->pointer.config.available = evdev_accel_config_available; device->pointer.config.set_speed = evdev_accel_config_set_speed; @@ -1862,14 +1859,17 @@ evdev_configure_mt_device(struct evdev_device *device) static inline int evdev_init_accel(struct evdev_device *device) { - accel_profile_func_t profile; + struct motion_filter *filter; if (device->dpi < DEFAULT_MOUSE_DPI) - profile = pointer_accel_profile_linear_low_dpi; + filter = create_pointer_accelerator_filter_linear_low_dpi(device->dpi); else - profile = pointer_accel_profile_linear; + filter = create_pointer_accelerator_filter_linear(device->dpi); + + if (!filter) + return -1; - return evdev_device_init_pointer_acceleration(device, profile); + return evdev_device_init_pointer_acceleration(device, filter); } static int diff --git a/src/evdev.h b/src/evdev.h index be5df0d0..42404fc2 100644 --- a/src/evdev.h +++ b/src/evdev.h @@ -280,7 +280,7 @@ evdev_device_create(struct libinput_seat *seat, int evdev_device_init_pointer_acceleration(struct evdev_device *device, - accel_profile_func_t profile); + struct motion_filter *filter); struct evdev_dispatch * evdev_touchpad_create(struct evdev_device *device); diff --git a/src/filter.c b/src/filter.c index 38d0d367..b94647d2 100644 --- a/src/filter.c +++ b/src/filter.c @@ -549,9 +549,8 @@ struct motion_filter_interface accelerator_interface = { accelerator_set_speed, }; -struct motion_filter * -create_pointer_accelerator_filter(accel_profile_func_t profile, - int dpi) +static struct pointer_accelerator * +create_default_filter(int dpi) { struct pointer_accelerator *filter; @@ -561,7 +560,6 @@ create_pointer_accelerator_filter(accel_profile_func_t profile, filter->base.interface = &accelerator_interface; - filter->profile = profile; filter->last_velocity = 0.0; filter->trackers = @@ -574,5 +572,61 @@ create_pointer_accelerator_filter(accel_profile_func_t profile, filter->dpi_factor = dpi/(double)DEFAULT_MOUSE_DPI; + return filter; +} + +struct motion_filter * +create_pointer_accelerator_filter_linear(int dpi) +{ + struct pointer_accelerator *filter; + + filter = create_default_filter(dpi); + if (!filter) + return NULL; + + filter->profile = pointer_accel_profile_linear; + + return &filter->base; +} + +struct motion_filter * +create_pointer_accelerator_filter_linear_low_dpi(int dpi) +{ + struct pointer_accelerator *filter; + + filter = create_default_filter(dpi); + if (!filter) + return NULL; + + filter->profile = pointer_accel_profile_linear_low_dpi; + + return &filter->base; +} + +struct motion_filter * +create_pointer_accelerator_filter_touchpad(int dpi) +{ + struct pointer_accelerator *filter; + + filter = create_default_filter(dpi); + if (!filter) + return NULL; + + filter->profile = touchpad_accel_profile_linear; + + return &filter->base; +} + +struct motion_filter * +create_pointer_accelerator_filter_lenovo_x230(int dpi) +{ + struct pointer_accelerator *filter; + + filter = create_default_filter(dpi); + if (!filter) + return NULL; + + filter->profile = touchpad_lenovo_x230_accel_profile; + return &filter->base; } diff --git a/src/filter.h b/src/filter.h index 617fab1f..76fc1476 100644 --- a/src/filter.h +++ b/src/filter.h @@ -57,9 +57,19 @@ typedef double (*accel_profile_func_t)(struct motion_filter *filter, double velocity, uint64_t time); +/* Pointer acceleration types */ + +struct motion_filter * +create_pointer_accelerator_filter_linear(int dpi); + +struct motion_filter * +create_pointer_accelerator_filter_linear_low_dpi(int dpi); + +struct motion_filter * +create_pointer_accelerator_filter_touchpad(int dpi); + struct motion_filter * -create_pointer_accelerator_filter(accel_profile_func_t filter, - int dpi); +create_pointer_accelerator_filter_lenovo_x230(int dpi); /* * Pointer acceleration profiles. diff --git a/tools/ptraccel-debug.c b/tools/ptraccel-debug.c index b0867db3..077da59d 100644 --- a/tools/ptraccel-debug.c +++ b/tools/ptraccel-debug.c @@ -272,8 +272,7 @@ main(int argc, char **argv) } } - filter = create_pointer_accelerator_filter(pointer_accel_profile_linear, - dpi); + filter = create_pointer_accelerator_filter_linear(dpi); assert(filter != NULL); filter_set_speed(filter, speed); -- 2.34.1