evdev-touchpad: Set some options using weston.ini
authorArmin K <krejzi@email.com>
Tue, 30 Jul 2013 23:41:03 +0000 (01:41 +0200)
committerKristian Høgsberg <krh@bitplanet.net>
Tue, 13 Aug 2013 05:42:17 +0000 (22:42 -0700)
This patch adds 3 new options to weston.ini to allow
the user to change default constant_accel_factor,
min_accel_factor and max_accel_factor. If no options
are set, it falls back using defaults as it did before.

v2: create weston_config_section_get_double and use it
instead of manualy converting string to double.

v3: add default values in weston_config_get_double
instead of using conditionals.

v4: don't pass diagonal as pointer.

shared/config-parser.c
shared/config-parser.h
src/evdev-touchpad.c
weston.ini

index 4e6cf7f..f98209c 100644 (file)
@@ -337,6 +337,32 @@ weston_config_section_get_uint(struct weston_config_section *section,
 
 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,
                                 const char *key,
                                 char **value, const char *default_value)
index 794e09c..410a7ef 100644 (file)
@@ -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,
index 53300ce..81acbd0 100644 (file)
 #include <math.h>
 #include <string.h>
 #include <stdbool.h>
+#include <unistd.h>
 #include <linux/input.h>
 
 #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;
index f2abceb..ff0f3ba 100644 (file)
@@ -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