diff --git a/shared/config-parser.c b/shared/config-parser.c index 4e6cf7fb..f98209cb 100644 --- a/shared/config-parser.c +++ b/shared/config-parser.c @@ -335,6 +335,32 @@ weston_config_section_get_uint(struct weston_config_section *section, return 0; } +WL_EXPORT +int +weston_config_section_get_double(struct weston_config_section *section, + const char *key, + double *value, double default_value) +{ + struct weston_config_entry *entry; + char *end; + + entry = config_section_get_entry(section, key); + if (entry == NULL) { + *value = default_value; + errno = ENOENT; + return -1; + } + + *value = strtod(entry->value, &end); + if (*end != '\0') { + *value = default_value; + errno = EINVAL; + return -1; + } + + return 0; +} + WL_EXPORT int weston_config_section_get_string(struct weston_config_section *section, diff --git a/shared/config-parser.h b/shared/config-parser.h index 794e09cd..410a7ef1 100644 --- a/shared/config-parser.h +++ b/shared/config-parser.h @@ -88,6 +88,10 @@ weston_config_section_get_uint(struct weston_config_section *section, const char *key, uint32_t *value, uint32_t default_value); int +weston_config_section_get_double(struct weston_config_section *section, + const char *key, + double *value, double default_value); +int weston_config_section_get_string(struct weston_config_section *section, const char *key, char **value, diff --git a/src/evdev-touchpad.c b/src/evdev-touchpad.c index 53300ce8..81acbd04 100644 --- a/src/evdev-touchpad.c +++ b/src/evdev-touchpad.c @@ -26,10 +26,12 @@ #include #include #include +#include #include #include "filter.h" #include "evdev.h" +#include "../shared/config-parser.h" /* Default values */ #define DEFAULT_CONSTANT_ACCEL_NUMERATOR 50 @@ -670,6 +672,38 @@ struct evdev_dispatch_interface touchpad_interface = { touchpad_destroy }; +static void +touchpad_parse_config(struct touchpad_dispatch *touchpad, double diagonal) +{ + struct weston_config *config; + struct weston_config_section *s; + int config_fd; + + double constant_accel_factor; + double min_accel_factor; + double max_accel_factor; + + config_fd = open_config_file("weston.ini"); + config = weston_config_parse(config_fd); + close(config_fd); + + s = weston_config_get_section(config, "touchpad", NULL, NULL); + weston_config_section_get_double(s, "constant_accel_factor", + &constant_accel_factor, + DEFAULT_CONSTANT_ACCEL_NUMERATOR); + weston_config_section_get_double(s, "min_accel_factor", + &min_accel_factor, + DEFAULT_MIN_ACCEL_FACTOR); + weston_config_section_get_double(s, "max_accel_factor", + &max_accel_factor, + DEFAULT_MAX_ACCEL_FACTOR); + + touchpad->constant_accel_factor = + constant_accel_factor / diagonal; + touchpad->min_accel_factor = min_accel_factor; + touchpad->max_accel_factor = max_accel_factor; +} + static int touchpad_init(struct touchpad_dispatch *touchpad, struct evdev_device *device) @@ -710,11 +744,7 @@ touchpad_init(struct touchpad_dispatch *touchpad, height = abs(device->abs.max_y - device->abs.min_y); diagonal = sqrt(width*width + height*height); - touchpad->constant_accel_factor = - DEFAULT_CONSTANT_ACCEL_NUMERATOR / diagonal; - - touchpad->min_accel_factor = DEFAULT_MIN_ACCEL_FACTOR; - touchpad->max_accel_factor = DEFAULT_MAX_ACCEL_FACTOR; + touchpad_parse_config(touchpad, diagonal); touchpad->hysteresis.margin_x = diagonal / DEFAULT_HYSTERESIS_MARGIN_DENOMINATOR; diff --git a/weston.ini b/weston.ini index f2abceb7..ff0f3baa 100644 --- a/weston.ini +++ b/weston.ini @@ -57,3 +57,8 @@ path=/usr/libexec/weston-keyboard #name=X1 #mode=1024x768 #transform=flipped-270 + +#[touchpad] +#constant_accel_factor = 50 +#min_accel_factor = 0.16 +#max_accel_factor = 1.0