filter: revamp to create device-specific filters, rather than accel functions
authorPeter Hutterer <peter.hutterer@who-t.net>
Tue, 28 Jul 2015 05:06:13 +0000 (15:06 +1000)
committerPeter Hutterer <peter.hutterer@who-t.net>
Mon, 10 Aug 2015 23:19:55 +0000 (09:19 +1000)
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 <peter.hutterer@who-t.net>
Reviewed-by: Jonas Ã…dahl <jadahl@gmail.com>
src/evdev-mt-touchpad.c
src/evdev.c
src/evdev.h
src/filter.c
src/filter.h
tools/ptraccel-debug.c

index a683d9a4bacf17f1eb691eb50b5697d1fb6da2b7..f48aa26def06c4d811b7aad9a94aa3f3a9211d03 100644 (file)
@@ -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
index 17c260431d0eba76caa46f4af19e27cff7803ad9..bb31724889d7178527d5b42afd4bf385e5251c57 100644 (file)
@@ -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
index be5df0d0109f82ef43b6afbeacb0fe53558809bf..42404fc292f4d933e3fb6eb0b8a0046504378235 100644 (file)
@@ -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);
index 38d0d367ce3bc400af9c481522e798cb287332b7..b94647d23d88648a9aa83e7fdb45a890493f0172 100644 (file)
@@ -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;
 }
index 617fab1f026f08f1f10ac80d82ff1eb0e38929fa..76fc147688a6be0bd36c83dcbc1d1471b308cda8 100644 (file)
@@ -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.
index b0867db373a0f3a6f82e17cb83d8c343037057e6..077da59d503749a6537d0886a4a2645e0bed776f 100644 (file)
@@ -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);