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;
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
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;
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
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);
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;
filter->base.interface = &accelerator_interface;
- filter->profile = profile;
filter->last_velocity = 0.0;
filter->trackers =
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;
}
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.
}
}
- 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);