diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2015-07-28 15:53:23 +1000 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2015-08-12 14:06:00 +1000 |
commit | e1be2f54cad745b4c6d8764f3352c1be50729985 (patch) | |
tree | 6f6440e580abefd7749755117f067256a927a775 /src/filter.c | |
parent | ef3f234345a459cda1dd24ce43d6034038e8e4a3 (diff) |
filter: duplicate the code for the Lenovo x230 accel method
This is "once-tested, don't touch it again" code. The quirks on the touchpad
means we'd have to find that specific device again and re-test everything if
we change anything elsewhere in the code. So duplicate it properly, so that we
don't have to touch it again.
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Jonas Ã…dahl <jadahl@gmail.com>
Diffstat (limited to 'src/filter.c')
-rw-r--r-- | src/filter.c | 59 |
1 files changed, 56 insertions, 3 deletions
diff --git a/src/filter.c b/src/filter.c index 369d7370..0c3e1de2 100644 --- a/src/filter.c +++ b/src/filter.c @@ -96,6 +96,11 @@ filter_get_speed(struct motion_filter *filter) #define DEFAULT_ACCELERATION 2.0 /* unitless factor */ #define DEFAULT_INCLINE 1.1 /* unitless factor */ +/* for the Lenovo x230 custom accel. do not touch */ +#define X230_THRESHOLD v_ms2us(0.4) /* in units/us */ +#define X230_ACCELERATION 2.0 /* unitless factor */ +#define X230_INCLINE 1.1 /* unitless factor */ + /* * Pointer acceleration filter constants */ @@ -337,6 +342,32 @@ accelerator_filter_low_dpi(struct motion_filter *filter, return accelerated; } +static struct normalized_coords +accelerator_filter_x230(struct motion_filter *filter, + const struct normalized_coords *unaccelerated, + void *data, uint64_t time) +{ + struct pointer_accelerator *accel = + (struct pointer_accelerator *) filter; + double accel_factor; /* unitless factor */ + struct normalized_coords accelerated; + double velocity; /* units/us */ + + feed_trackers(accel, unaccelerated, time); + velocity = calculate_velocity(accel, time); + accel_factor = calculate_acceleration(accel, + data, + velocity, + accel->last_velocity, + time); + accel->last_velocity = velocity; + + accelerated.x = accel_factor * unaccelerated->x; + accelerated.y = accel_factor * unaccelerated->y; + + return accelerated; +} + static void accelerator_restart(struct motion_filter *filter, void *data, @@ -661,17 +692,39 @@ create_pointer_accelerator_filter_touchpad(int dpi) return &filter->base; } +struct motion_filter_interface accelerator_interface_x230 = { + accelerator_filter_x230, + accelerator_restart, + accelerator_destroy, + accelerator_set_speed, +}; + +/* The Lenovo x230 has a bad touchpad. This accel method has been + * trial-and-error'd, any changes to it will require re-testing everything. + * Don't touch this. + */ struct motion_filter * create_pointer_accelerator_filter_lenovo_x230(int dpi) { struct pointer_accelerator *filter; - filter = create_default_filter(dpi); - if (!filter) + filter = zalloc(sizeof *filter); + if (filter == NULL) return NULL; - filter->base.interface = &accelerator_interface; + filter->base.interface = &accelerator_interface_x230; filter->profile = touchpad_lenovo_x230_accel_profile; + filter->last_velocity = 0.0; + + filter->trackers = + calloc(NUM_POINTER_TRACKERS, sizeof *filter->trackers); + filter->cur_tracker = 0; + + filter->threshold = X230_THRESHOLD; + filter->accel = X230_ACCELERATION; /* unitless factor */ + filter->incline = X230_INCLINE; /* incline of the acceleration function */ + + filter->dpi_factor = 1; /* unused for this accel method */ return &filter->base; } |