diff --git a/nixos/doc/manual/configuration/x-windows.xml b/nixos/doc/manual/configuration/x-windows.xml
index b33f6cf82b5..dd879702d7d 100644
--- a/nixos/doc/manual/configuration/x-windows.xml
+++ b/nixos/doc/manual/configuration/x-windows.xml
@@ -186,7 +186,7 @@
The driver has many options (see ). For
instance, the following disables tap-to-click behavior:
- = false;
+ = false;
Note: the use of services.xserver.synaptics is deprecated
since NixOS 17.09.
diff --git a/nixos/doc/manual/release-notes/rl-2103.xml b/nixos/doc/manual/release-notes/rl-2103.xml
index e46d1ca403f..94e42369b60 100644
--- a/nixos/doc/manual/release-notes/rl-2103.xml
+++ b/nixos/doc/manual/release-notes/rl-2103.xml
@@ -430,6 +430,17 @@ http://some.json-exporter.host:7979/probe?target=https://example.com/some/json/e
dynamically allocated uid.
+
+
+ The libinput module has been updated with the ability to configure mouse and touchpad settings separately.
+ The options in services.xserver.libinput have been renamed to services.xserver.libinput.touchpad,
+ while there is a new services.xserver.libinput.mouse for mouse related configuration.
+
+
+ Since touchpad options no longer apply to all devices, you may want to replicate your touchpad configuration in
+ mouse section.
+
+
diff --git a/nixos/modules/services/x11/hardware/libinput.nix b/nixos/modules/services/x11/hardware/libinput.nix
index 9548ecb8ef6..631fb824768 100644
--- a/nixos/modules/services/x11/hardware/libinput.nix
+++ b/nixos/modules/services/x11/hardware/libinput.nix
@@ -3,23 +3,18 @@
with lib;
let cfg = config.services.xserver.libinput;
+
xorgBool = v: if v then "on" else "off";
-in {
-
- options = {
-
- services.xserver.libinput = {
-
- enable = mkEnableOption "libinput";
+ mkConfigForDevice = deviceType: {
dev = mkOption {
type = types.nullOr types.str;
default = null;
example = "/dev/input/event0";
description =
''
- Path for touchpad device. Set to null to apply to any
- auto-detected touchpad.
+ Path for ${deviceType} device. Set to null to apply to any
+ auto-detected ${deviceType}.
'';
};
@@ -185,14 +180,63 @@ in {
Option "DragLockButtons" "L1 B1 L2 B2"
'';
description = ''
- Additional options for libinput touchpad driver. See
+ Additional options for libinput ${deviceType} driver. See
libinput4
for available options.";
'';
};
-
};
+ mkX11ConfigForDevice = deviceType: matchIs: ''
+ Identifier "libinput ${deviceType} configuration"
+ MatchDriver "libinput"
+ MatchIs${matchIs} "${xorgBool true}"
+ ${optionalString (cfg.${deviceType}.dev != null) ''MatchDevicePath "${cfg.${deviceType}.dev}"''}
+ Option "AccelProfile" "${cfg.${deviceType}.accelProfile}"
+ ${optionalString (cfg.${deviceType}.accelSpeed != null) ''Option "AccelSpeed" "${cfg.${deviceType}.accelSpeed}"''}
+ ${optionalString (cfg.${deviceType}.buttonMapping != null) ''Option "ButtonMapping" "${cfg.${deviceType}.buttonMapping}"''}
+ ${optionalString (cfg.${deviceType}.calibrationMatrix != null) ''Option "CalibrationMatrix" "${cfg.${deviceType}.calibrationMatrix}"''}
+ ${optionalString (cfg.${deviceType}.clickMethod != null) ''Option "ClickMethod" "${cfg.${deviceType}.clickMethod}"''}
+ Option "LeftHanded" "${xorgBool cfg.${deviceType}.leftHanded}"
+ Option "MiddleEmulation" "${xorgBool cfg.${deviceType}.middleEmulation}"
+ Option "NaturalScrolling" "${xorgBool cfg.${deviceType}.naturalScrolling}"
+ ${optionalString (cfg.${deviceType}.scrollButton != null) ''Option "ScrollButton" "${toString cfg.${deviceType}.scrollButton}"''}
+ Option "ScrollMethod" "${cfg.${deviceType}.scrollMethod}"
+ Option "HorizontalScrolling" "${xorgBool cfg.${deviceType}.horizontalScrolling}"
+ Option "SendEventsMode" "${cfg.${deviceType}.sendEventsMode}"
+ Option "Tapping" "${xorgBool cfg.${deviceType}.tapping}"
+ Option "TappingDragLock" "${xorgBool cfg.${deviceType}.tappingDragLock}"
+ Option "DisableWhileTyping" "${xorgBool cfg.${deviceType}.disableWhileTyping}"
+ ${cfg.${deviceType}.additionalOptions}
+ '';
+in {
+
+ imports =
+ (map (option: mkRenamedOptionModule ([ "services" "xserver" "libinput" option ]) [ "services" "xserver" "libinput" "touchpad" option ]) [
+ "accelProfile"
+ "accelSpeed"
+ "buttonMapping"
+ "calibrationMatrix"
+ "clickMethod"
+ "leftHanded"
+ "middleEmulation"
+ "naturalScrolling"
+ "scrollButton"
+ "scrollMethod"
+ "horizontalScrolling"
+ "sendEventsMode"
+ "tapping"
+ "disableWhileTyping"
+ "additionalOptions"
+ ]);
+
+ options = {
+
+ services.xserver.libinput = {
+ enable = mkEnableOption "libinput";
+ mouse = mkConfigForDevice "mouse";
+ touchpad = mkConfigForDevice "touchpad";
+ };
};
@@ -212,32 +256,10 @@ in {
services.udev.packages = [ pkgs.libinput.out ];
- services.xserver.config =
- ''
- # General libinput configuration.
- # See CONFIGURATION DETAILS section of man:libinput(4).
- Section "InputClass"
- Identifier "libinputConfiguration"
- MatchDriver "libinput"
- ${optionalString (cfg.dev != null) ''MatchDevicePath "${cfg.dev}"''}
- Option "AccelProfile" "${cfg.accelProfile}"
- ${optionalString (cfg.accelSpeed != null) ''Option "AccelSpeed" "${cfg.accelSpeed}"''}
- ${optionalString (cfg.buttonMapping != null) ''Option "ButtonMapping" "${cfg.buttonMapping}"''}
- ${optionalString (cfg.calibrationMatrix != null) ''Option "CalibrationMatrix" "${cfg.calibrationMatrix}"''}
- ${optionalString (cfg.clickMethod != null) ''Option "ClickMethod" "${cfg.clickMethod}"''}
- Option "LeftHanded" "${xorgBool cfg.leftHanded}"
- Option "MiddleEmulation" "${xorgBool cfg.middleEmulation}"
- Option "NaturalScrolling" "${xorgBool cfg.naturalScrolling}"
- ${optionalString (cfg.scrollButton != null) ''Option "ScrollButton" "${toString cfg.scrollButton}"''}
- Option "ScrollMethod" "${cfg.scrollMethod}"
- Option "HorizontalScrolling" "${xorgBool cfg.horizontalScrolling}"
- Option "SendEventsMode" "${cfg.sendEventsMode}"
- Option "Tapping" "${xorgBool cfg.tapping}"
- Option "TappingDragLock" "${xorgBool cfg.tappingDragLock}"
- Option "DisableWhileTyping" "${xorgBool cfg.disableWhileTyping}"
- ${cfg.additionalOptions}
- EndSection
- '';
+ services.xserver.inputClassSections = [
+ (mkX11ConfigForDevice "mouse" "Pointer")
+ (mkX11ConfigForDevice "touchpad" "Touchpad")
+ ];
assertions = [
# already present in synaptics.nix