diff options
author | Hans de Goede <hdegoede@redhat.com> | 2015-04-17 16:48:07 +0200 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2015-04-21 11:14:57 +1000 |
commit | 5defbb5ff664f141293f800c486bc5b723f985ce (patch) | |
tree | 41089f2487e3518926bd8625afeb09afe8ae1412 | |
parent | f29378b4437e0d50e738641de24ec19d41396284 (diff) |
udev: keyboard-builtin: Add support for setting IBM trackpoint sensitivity
IBM / Lenovo trackpoints allow specifying a sensitivity setting through a
ps/2 command, which changes the range of the deltas sent when using the
trackpoint.
On some models with normal usage only deltas of 1 or 2 are send, resulting in
there only being 2 mouse cursor movement speeds, rather than the expected fluid
scale. Changing the sensitivity to a higher level than the bootup default fixes
this.
This commit adds support for setting a POINTINGSTICK_SENSITIVITY value
in hwdb to allow changing the sensitivity on boot through udev / hwdb.
-rw-r--r-- | hwdb/70-pointingstick.hwdb | 12 | ||||
-rw-r--r-- | src/udev/udev-builtin-keyboard.c | 28 |
2 files changed, 40 insertions, 0 deletions
diff --git a/hwdb/70-pointingstick.hwdb b/hwdb/70-pointingstick.hwdb index 9fd5fb886a..e87d753339 100644 --- a/hwdb/70-pointingstick.hwdb +++ b/hwdb/70-pointingstick.hwdb @@ -41,6 +41,7 @@ # # Allowed properties are: # POINTINGSTICK_CONST_ACCEL +# POINTINGSTICK_SENSITIVITY # ######################################### # POINTINGSTICK_CONST_ACCEL # @@ -53,6 +54,17 @@ # by how much to multiply deltas generated by the pointingstick to get # normalized deltas. # +######################################### +# POINTINGSTICK_SENSITIVITY # +######################################### +# +# TPPS/2 IBM TrackPoint driver sensitivity sysfs setting +# POINTINGSTICK_SENSITIVITY=<sensitivity> +# +# Where <sensitivity> is a number between 0 and 255, note this property +# only applies to TPPS/2 IBM TrackPoint devices, see +# drivers/input/mouse/trackpoint.c in the Linux kernel sources. +# # # Sort by by brand, model diff --git a/src/udev/udev-builtin-keyboard.c b/src/udev/udev-builtin-keyboard.c index c7f7f84afd..b6da734a3c 100644 --- a/src/udev/udev-builtin-keyboard.c +++ b/src/udev/udev-builtin-keyboard.c @@ -146,6 +146,32 @@ static void override_abs(int fd, const char *devnode, log_error_errno(errno, "Unable to EVIOCSABS device \"%s\"", devnode); } +static void set_trackpoint_sensitivity(struct udev_device *dev, const char *value) +{ + struct udev_device *pdev; + char val_s[DECIMAL_STR_MAX(int)]; + int r, val_i; + + /* The sensitivity sysfs attr belongs to the serio parent device */ + pdev = udev_device_get_parent_with_subsystem_devtype(dev, "serio", NULL); + if (!pdev) { + log_warning("Failed to get serio parent for '%s'", udev_device_get_devnode(dev)); + return; + } + + r = safe_atoi(value, &val_i); + if (r < 0) { + log_error("Unable to parse POINTINGSTICK_SENSITIVITY '%s' for '%s'", value, udev_device_get_devnode(dev)); + return; + } + + xsprintf(val_s, "%d", val_i); + + r = udev_device_set_sysattr_value(pdev, "sensitivity", val_s); + if (r < 0) + log_error_errno(r, "Failed to write 'sensitivity' attribute for '%s': %m", udev_device_get_devnode(pdev)); +} + static int open_device(const char *devnode) { int fd; @@ -223,6 +249,8 @@ static int builtin_keyboard(struct udev_device *dev, int argc, char *argv[], boo } override_abs(fd, node, evcode, udev_list_entry_get_value(entry)); + } else if (streq(key, "POINTINGSTICK_SENSITIVITY")) { + set_trackpoint_sensitivity(dev, udev_list_entry_get_value(entry)); } } |