diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2016-01-06 15:26:49 +1000 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2016-01-22 16:16:55 +1000 |
commit | 7164d6eff5c83b8280d1d55eb33fb173160f9de9 (patch) | |
tree | 41081b282e743d25ddb1ee98134dbd86c4a779a3 /src/filter.c | |
parent | 108a191a3ec868c00e5ee72be383b437894b2fc5 (diff) |
tablet: hook up relative motion events
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Acked-by: Jason Gerecke <jason.gerecke@wacom.com>
Diffstat (limited to 'src/filter.c')
-rw-r--r-- | src/filter.c | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/src/filter.c b/src/filter.c index 0d0b95d4..4c39b0e2 100644 --- a/src/filter.c +++ b/src/filter.c @@ -163,6 +163,13 @@ struct pointer_accelerator_flat { double dpi_factor; }; +struct tablet_accelerator_flat { + struct motion_filter base; + + double factor; + int xres, yres; +}; + static void feed_trackers(struct pointer_accelerator *accel, const struct normalized_coords *delta, @@ -964,3 +971,90 @@ create_pointer_accelerator_filter_flat(int dpi) return &filter->base; } + +/* The tablet accel code uses mm as input */ +static struct normalized_coords +tablet_accelerator_filter_flat(struct motion_filter *filter, + const struct normalized_coords *mm, + void *data, uint64_t time) +{ + struct tablet_accelerator_flat *accel_filter = + (struct tablet_accelerator_flat *)filter; + struct normalized_coords accelerated; + + /* Tablet input is in mm, output is supposed to be in logical + * pixels roughly equivalent to a mouse/touchpad. + * + * This is a magical constant found by trial and error. On a 96dpi + * screen 0.4mm of movement correspond to 1px logical pixel which + * is almost identical to the tablet mapped to screen in absolute + * mode. Tested on a Intuos5, other tablets may vary. + */ + const double DPI_CONVERSION = 96.0/25.4 * 2.5; /* unitless factor */ + + accelerated.x = mm->x * accel_filter->factor * DPI_CONVERSION; + accelerated.y = mm->y * accel_filter->factor * DPI_CONVERSION; + + return accelerated; +} + +static bool +tablet_accelerator_set_speed(struct motion_filter *filter, + double speed_adjustment) +{ + struct tablet_accelerator_flat *accel_filter = + (struct tablet_accelerator_flat *)filter; + + assert(speed_adjustment >= -1.0 && speed_adjustment <= 1.0); + + accel_filter->factor = speed_adjustment + 1.0; + + return true; +} + +static void +tablet_accelerator_destroy(struct motion_filter *filter) +{ + struct tablet_accelerator_flat *accel_filter = + (struct tablet_accelerator_flat *)filter; + + free(accel_filter); +} + +struct motion_filter_interface accelerator_interface_tablet = { + .type = LIBINPUT_CONFIG_ACCEL_PROFILE_FLAT, + .filter = tablet_accelerator_filter_flat, + .filter_constant = NULL, + .restart = NULL, + .destroy = tablet_accelerator_destroy, + .set_speed = tablet_accelerator_set_speed, +}; + +static struct tablet_accelerator_flat * +create_tablet_filter_flat(int xres, int yres) +{ + struct tablet_accelerator_flat *filter; + + filter = zalloc(sizeof *filter); + if (filter == NULL) + return NULL; + + filter->xres = xres; + filter->yres = yres; + + return filter; +} + +struct motion_filter * +create_pointer_accelerator_filter_tablet(int xres, int yres) +{ + struct tablet_accelerator_flat *filter; + + filter = create_tablet_filter_flat(xres, yres); + if (!filter) + return NULL; + + filter->base.interface = &accelerator_interface_tablet; + + return &filter->base; +} |