nixos/libinput: separate settings by mouse/touchpad

This commits deprecates `services.xserver.libinput` for multiple
settings, one for each kind of device:

- `services.xserver.libinput.mouse`
- `services.xserver.libinput.touchpad`

Looking at `man 4 libinput`, they basically have the same options so I
simply replicated them, even if some options doesn't make sense for
mouse (`tapping` for example).

With this commit this is now possible:

```nix
{
  services.xserver.libinput = {
    enable = true;
    mouse = {
      accelProfile = "flat";
    };
    touchpad = {
      naturalScrolling = true;
    };
  };
}
```

And you will have a mouse with no natural scrolling but with accel
profile flat, while touchpad will have natural scrolling but accel
profile adaptative (default).

It is possible to support more device types
(tablets/keyboards/touchscreens), but at least looking at the
libinput manual for those devices it doesn't seem that it has any
configuration options for them. They can still be configured using
`services.xserver.inputClassSections` though, and this will work now
since there is no rule by default that matches them.

Closes issue #75007, while also making configuration of mouses and
touchpads using Nix attrs possible like said in PR #73785.
This commit is contained in:
Thiago Kenji Okada 2021-01-10 00:46:13 -03:00
parent e35938ab71
commit cd15b3a30a

View File

@ -3,23 +3,18 @@
with lib; with lib;
let cfg = config.services.xserver.libinput; let cfg = config.services.xserver.libinput;
xorgBool = v: if v then "on" else "off"; xorgBool = v: if v then "on" else "off";
in {
options = {
services.xserver.libinput = {
enable = mkEnableOption "libinput";
mkConfigForDevice = deviceType: {
dev = mkOption { dev = mkOption {
type = types.nullOr types.str; type = types.nullOr types.str;
default = null; default = null;
example = "/dev/input/event0"; example = "/dev/input/event0";
description = description =
'' ''
Path for touchpad device. Set to null to apply to any Path for ${deviceType} device. Set to null to apply to any
auto-detected touchpad. auto-detected ${deviceType}.
''; '';
}; };
@ -185,14 +180,63 @@ in {
Option "DragLockButtons" "L1 B1 L2 B2" Option "DragLockButtons" "L1 B1 L2 B2"
''; '';
description = '' description = ''
Additional options for libinput touchpad driver. See Additional options for libinput ${deviceType} driver. See
<citerefentry><refentrytitle>libinput</refentrytitle><manvolnum>4</manvolnum></citerefentry> <citerefentry><refentrytitle>libinput</refentrytitle><manvolnum>4</manvolnum></citerefentry>
for available options."; 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.udev.packages = [ pkgs.libinput.out ];
services.xserver.config = services.xserver.inputClassSections = [
'' (mkX11ConfigForDevice "mouse" "Pointer")
# General libinput configuration. (mkX11ConfigForDevice "touchpad" "Touchpad")
# 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
'';
assertions = [ assertions = [
# already present in synaptics.nix # already present in synaptics.nix