This also fixes a bug with the _noop function, because we casted to the wrong struct the dpi value was garbage.
Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net> --- meson.build | 1 + src/filter-flat.c | 124 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/filter.c | 77 --------------------------------- 3 files changed, 125 insertions(+), 77 deletions(-) create mode 100644 src/filter-flat.c diff --git a/meson.build b/meson.build index e9b165ec..933e2f3f 100644 --- a/meson.build +++ b/meson.build @@ -151,6 +151,7 @@ dep_libinput_util = declare_dependency(link_with : libinput_util) ############ libfilter.a ############ src_libfilter = [ 'src/filter.c', + 'src/filter-flat.c', 'src/filter-touchpad.c', 'src/filter-touchpad-x230.c', 'src/filter-tablet.c', diff --git a/src/filter-flat.c b/src/filter-flat.c new file mode 100644 index 00000000..4bbf22eb --- /dev/null +++ b/src/filter-flat.c @@ -0,0 +1,124 @@ +/* + * Copyright © 2006-2009 Simon Thum + * Copyright © 2012 Jonas Ådahl + * Copyright © 2014-2015 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "config.h" + +#include <assert.h> +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> +#include <limits.h> +#include <math.h> + +#include "filter.h" +#include "libinput-util.h" +#include "filter-private.h" + +struct pointer_accelerator_flat { + struct motion_filter base; + + double factor; + int dpi; +}; + +static struct normalized_coords +accelerator_filter_flat(struct motion_filter *filter, + const struct device_float_coords *unaccelerated, + void *data, uint64_t time) +{ + struct pointer_accelerator_flat *accel_filter = + (struct pointer_accelerator_flat *)filter; + double factor; /* unitless factor */ + struct normalized_coords accelerated; + + /* You want flat acceleration, you get flat acceleration for the + * device */ + factor = accel_filter->factor; + accelerated.x = factor * unaccelerated->x; + accelerated.y = factor * unaccelerated->y; + + return accelerated; +} + +static struct normalized_coords +accelerator_filter_noop_flat(struct motion_filter *filter, + const struct device_float_coords *unaccelerated, + void *data, uint64_t time) +{ + struct pointer_accelerator_flat *accel = + (struct pointer_accelerator_flat *) filter; + + return normalize_for_dpi(unaccelerated, accel->dpi); +} + +static bool +accelerator_set_speed_flat(struct motion_filter *filter, + double speed_adjustment) +{ + struct pointer_accelerator_flat *accel_filter = + (struct pointer_accelerator_flat *)filter; + + assert(speed_adjustment >= -1.0 && speed_adjustment <= 1.0); + + /* Speed rage is 0-200% of the nominal speed, with 0 mapping to the + * nominal speed. Anything above 200 is pointless, we're already + * skipping over ever second pixel at 200% speed. + */ + + accel_filter->factor = max(0.005, 1 + speed_adjustment); + filter->speed_adjustment = speed_adjustment; + + return true; +} + +static void +accelerator_destroy_flat(struct motion_filter *filter) +{ + struct pointer_accelerator_flat *accel = + (struct pointer_accelerator_flat *) filter; + + free(accel); +} + +struct motion_filter_interface accelerator_interface_flat = { + .type = LIBINPUT_CONFIG_ACCEL_PROFILE_FLAT, + .filter = accelerator_filter_flat, + .filter_constant = accelerator_filter_noop_flat, + .restart = NULL, + .destroy = accelerator_destroy_flat, + .set_speed = accelerator_set_speed_flat, +}; + +struct motion_filter * +create_pointer_accelerator_filter_flat(int dpi) +{ + struct pointer_accelerator_flat *filter; + + filter = zalloc(sizeof *filter); + filter->base.interface = &accelerator_interface_flat; + filter->dpi = dpi; + + return &filter->base; +} diff --git a/src/filter.c b/src/filter.c index ed90af70..1261bc22 100644 --- a/src/filter.c +++ b/src/filter.c @@ -104,13 +104,6 @@ filter_get_type(struct motion_filter *filter) #define MOTION_TIMEOUT ms2us(1000) #define NUM_POINTER_TRACKERS 16 -struct pointer_accelerator_flat { - struct motion_filter base; - - double factor; - int dpi; -}; - void init_trackers(struct pointer_trackers *trackers, size_t ntrackers) @@ -682,73 +675,3 @@ create_pointer_accelerator_filter_linear_low_dpi(int dpi) return &filter->base; } - -static struct normalized_coords -accelerator_filter_flat(struct motion_filter *filter, - const struct device_float_coords *unaccelerated, - void *data, uint64_t time) -{ - struct pointer_accelerator_flat *accel_filter = - (struct pointer_accelerator_flat *)filter; - double factor; /* unitless factor */ - struct normalized_coords accelerated; - - /* You want flat acceleration, you get flat acceleration for the - * device */ - factor = accel_filter->factor; - accelerated.x = factor * unaccelerated->x; - accelerated.y = factor * unaccelerated->y; - - return accelerated; -} - -static bool -accelerator_set_speed_flat(struct motion_filter *filter, - double speed_adjustment) -{ - struct pointer_accelerator_flat *accel_filter = - (struct pointer_accelerator_flat *)filter; - - assert(speed_adjustment >= -1.0 && speed_adjustment <= 1.0); - - /* Speed rage is 0-200% of the nominal speed, with 0 mapping to the - * nominal speed. Anything above 200 is pointless, we're already - * skipping over ever second pixel at 200% speed. - */ - - accel_filter->factor = max(0.005, 1 + speed_adjustment); - filter->speed_adjustment = speed_adjustment; - - return true; -} - -static void -accelerator_destroy_flat(struct motion_filter *filter) -{ - struct pointer_accelerator_flat *accel = - (struct pointer_accelerator_flat *) filter; - - free(accel); -} - -struct motion_filter_interface accelerator_interface_flat = { - .type = LIBINPUT_CONFIG_ACCEL_PROFILE_FLAT, - .filter = accelerator_filter_flat, - .filter_constant = accelerator_filter_noop, - .restart = NULL, - .destroy = accelerator_destroy_flat, - .set_speed = accelerator_set_speed_flat, -}; - -struct motion_filter * -create_pointer_accelerator_filter_flat(int dpi) -{ - struct pointer_accelerator_flat *filter; - - filter = zalloc(sizeof *filter); - filter->base.interface = &accelerator_interface_flat; - filter->dpi = dpi; - - return &filter->base; -} - -- 2.14.3 _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/wayland-devel