summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--hwdb/70-pointingstick.hwdb12
-rw-r--r--src/udev/udev-builtin-keyboard.c28
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));
}
}