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:
parent
e35938ab71
commit
cd15b3a30a
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user