From a2db14925b9e8c84c080b8e4d48c22e6c8aa72a2 Mon Sep 17 00:00:00 2001 From: Robert Klotzner Date: Fri, 18 Sep 2015 17:29:10 +0200 Subject: [PATCH 1/3] nixos: Added libinput configuration like there was for synaptics --- nixos/modules/module-list.nix | 1 + .../services/x11/hardware/libinput.nix | 125 ++++++++++++++++++ 2 files changed, 126 insertions(+) create mode 100644 nixos/modules/services/x11/hardware/libinput.nix diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix index 2ff61877c23d..de6a6a5844b2 100644 --- a/nixos/modules/module-list.nix +++ b/nixos/modules/module-list.nix @@ -437,6 +437,7 @@ ./services/x11/display-managers/lightdm.nix ./services/x11/display-managers/sddm.nix ./services/x11/display-managers/slim.nix + ./services/x11/hardware/libinput.nix ./services/x11/hardware/multitouch.nix ./services/x11/hardware/synaptics.nix ./services/x11/hardware/wacom.nix diff --git a/nixos/modules/services/x11/hardware/libinput.nix b/nixos/modules/services/x11/hardware/libinput.nix new file mode 100644 index 000000000000..0b4637dc55f9 --- /dev/null +++ b/nixos/modules/services/x11/hardware/libinput.nix @@ -0,0 +1,125 @@ +{ config, lib, pkgs, ... }: + +with lib; + +let cfg = config.services.xserver.libinput; +in { + + options = { + + services.xserver.libinput = { + + enable = mkOption { + type = types.bool; + default = false; + example = true; + description = "Whether to enable libinput support."; + }; + + 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. + ''; + }; + + accelSpeed = mkOption { + type = types.nullOr types.string; + default = null; + description = "Cursor acceleration (how fast speed increases from minSpeed to maxSpeed)."; + }; + + buttonMapping = mkOption { + type = types.nullOr types.string; + default = null; + description = + '' + Sets the logical button mapping for this device, see XSetPointerMapping(3). The string must + be a space-separated list of button mappings in the order of the logical buttons on the + device, starting with button 1. The default mapping is "1 2 3 ... 32". A mapping of 0 deac‐ + tivates the button. Multiple buttons can have the same mapping. Invalid mapping strings are + discarded and the default mapping is used for all buttons. Buttons not specified in the + user's mapping use the default mapping. See section BUTTON MAPPING for more details. + ''; + }; + + calibrationMatrix = mkOption { + type = types.nullOr types.string; + default = null; + description = + '' + A string of 9 space-separated floating point numbers. Sets the calibration matrix to the + 3x3 matrix where the first row is (abc), the second row is (def) and the third row is (ghi). + ''; + }; + + tapping = mkOption { + type = types.bool; + default = true; + example = false; + description = + '' + Enables or disables tap-to-click behavior. + ''; + }; + + tappingDragLock = mkOption { + type = types.bool; + default = true; + example = false; + description = + '' + Enables or disables drag lock during tapping behavior. When enabled, a finger up during tap- + and-drag will not immediately release the button. If the finger is set down again within the + timeout, the draging process continues. + ''; + }; + + + additionalOptions = mkOption { + type = types.str; + default = ""; + example = '' + Option "RTCornerButton" "2" + Option "RBCornerButton" "3" + ''; + description = '' + Additional options for libinput touchpad driver. + ''; + }; + + }; + + }; + + + config = mkIf cfg.enable { + + services.xserver.modules = [ pkgs.xorg.xf86inputlibinput ]; + + environment.systemPackages = [ pkgs.xorg.xf86inputlibinput ]; + + services.xserver.config = + '' + # Automatically enable the libinput driver for all touchpads. + Section "InputClass" + Identifier "libinputConfiguration" + MatchIsTouchpad "on" + ${optionalString (cfg.dev != null) ''MatchDevicePath "${cfg.dev}"''} + Driver "libinput" + ${optionalString (cfg.accelSpeed != null) ''Option "AccelSpeed" "${cfg.accelSpeed}"''} + ${optionalString (cfg.buttonMapping != null) ''Option "ButtonMapping" "${cfg.buttonMapping}"''} + ${optionalString (cfg.calibrationMatrix != null) ''Option "CalibrationMatrix" "${cfg.calibrationMatrix}"''} + ${if cfg.tapping then ''Option "Tapping" "1"'' else ""} + ${if cfg.tappingDragLock then ''Option "TappingDragLock" "1"'' else ""} + ${cfg.additionalOptions} + EndSection + ''; + + }; + +} From d3f687951a18f184e609a44aa06af3b271e39d81 Mon Sep 17 00:00:00 2001 From: Robert Klotzner Date: Wed, 13 Jan 2016 09:27:02 +0100 Subject: [PATCH 2/3] nixos: libinput added options - natural scrolling - scroll method - disable while typing --- .../services/x11/hardware/libinput.nix | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/nixos/modules/services/x11/hardware/libinput.nix b/nixos/modules/services/x11/hardware/libinput.nix index 0b4637dc55f9..a5629db53fe0 100644 --- a/nixos/modules/services/x11/hardware/libinput.nix +++ b/nixos/modules/services/x11/hardware/libinput.nix @@ -57,6 +57,13 @@ in { ''; }; + naturalScrolling = mkOption { + type = types.bool; + default = false; + example = true; + description = "Enables or disables natural scrolling behavior."; + }; + tapping = mkOption { type = types.bool; default = true; @@ -67,6 +74,27 @@ in { ''; }; + scrollMethod = mkOption { + type = types.enum [ "twofinger" "edge" "none" ]; + default = "twofinger"; + example = "edge"; + description = + '' + Specify the scrolling method. + ''; + }; + + disableWhileTyping = mkOption { + type = types.bool; + default = true; + example = false; + description = + '' + Disable input method while typing. + ''; + }; + + tappingDragLock = mkOption { type = types.bool; default = true; @@ -114,8 +142,11 @@ in { ${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.naturalScrolling ''Option "NaturalScrolling" "on"''} ${if cfg.tapping then ''Option "Tapping" "1"'' else ""} ${if cfg.tappingDragLock then ''Option "TappingDragLock" "1"'' else ""} + Option "ScrollMethod" "${cfg.scrollMethod}" + ${optionalString cfg.disableWhileTyping ''Option "DisableWhileTyping" "on"''} ${cfg.additionalOptions} EndSection ''; From 5d4948e18368aa65fd65d8ad13f95c543d1f7889 Mon Sep 17 00:00:00 2001 From: Robert Klotzner Date: Fri, 22 Jan 2016 11:46:02 +0100 Subject: [PATCH 3/3] libinput: configuration support: Polishing + addition of missing options --- .../services/x11/hardware/libinput.nix | 113 +++++++++++++++--- 1 file changed, 96 insertions(+), 17 deletions(-) diff --git a/nixos/modules/services/x11/hardware/libinput.nix b/nixos/modules/services/x11/hardware/libinput.nix index a5629db53fe0..fb9e24160e9f 100644 --- a/nixos/modules/services/x11/hardware/libinput.nix +++ b/nixos/modules/services/x11/hardware/libinput.nix @@ -3,6 +3,7 @@ with lib; let cfg = config.services.xserver.libinput; + xorgBool = v: if v then "on" else "off"; in { options = { @@ -27,6 +28,18 @@ in { ''; }; + accelProfile = mkOption { + type = types.enum [ "flat" "adaptive" ]; + default = "flat"; + example = "adaptive"; + description = + '' + Sets the pointer acceleration profile to the given profile. Permitted values are adaptive, flat. + Not all devices support this option or all profiles. If a profile is unsupported, the default profile + for this is used. For a description on the profiles and their behavior, see the libinput documentation. + ''; + }; + accelSpeed = mkOption { type = types.nullOr types.string; default = null; @@ -57,6 +70,36 @@ in { ''; }; + clickMethod = mkOption { + type = types.nullOr (types.enum [ "none" "buttonareas" "clickfinger" ]); + default = null; + example = "none"; + description = + '' + Enables a click method. Permitted values are none, buttonareas, clickfinger. + Not all devices support all methods, if an option is unsupported, + the default click method for this device is used. + ''; + }; + + leftHanded = mkOption { + type = types.bool; + default = false; + example = true; + description = "Enables left-handed button orientation, i.e. swapping left and right buttons."; + }; + + middleEmulation = mkOption { + type = types.bool; + default = true; + example = false; + description = + '' + Enables middle button emulation. When enabled, pressing the left and right buttons + simultaneously produces a middle mouse button click. + ''; + }; + naturalScrolling = mkOption { type = types.bool; default = false; @@ -64,13 +107,14 @@ in { description = "Enables or disables natural scrolling behavior."; }; - tapping = mkOption { - type = types.bool; - default = true; - example = false; + scrollButton = mkOption { + type = types.nullOr types.int; + default = null; + example = 1; description = '' - Enables or disables tap-to-click behavior. + Designates a button as scroll button. If the ScrollMethod is button and the button is logically + held down, x/y axis movement is converted into scroll events. ''; }; @@ -84,16 +128,37 @@ in { ''; }; - disableWhileTyping = mkOption { + horizontalScrolling = mkOption { type = types.bool; default = true; example = false; description = '' - Disable input method while typing. + Disables horizontal scrolling. When disabled, this driver will discard any horizontal scroll + events from libinput. Note that this does not disable horizontal scrolling, it merely + discards the horizontal axis from any scroll events. ''; }; + sendEventsMode = mkOption { + type = types.enum [ "disabled" "enabled" "disabled-on-external-mouse" ]; + default = "enabled"; + example = "disabled"; + description = + '' + Sets the send events mode to disabled, enabled, or "disable when an external mouse is connected". + ''; + }; + + tapping = mkOption { + type = types.bool; + default = true; + example = false; + description = + '' + Enables or disables tap-to-click behavior. + ''; + }; tappingDragLock = mkOption { type = types.bool; @@ -107,17 +172,24 @@ in { ''; }; + disableWhileTyping = mkOption { + type = types.bool; + default = true; + example = false; + description = + '' + Disable input method while typing. + ''; + }; additionalOptions = mkOption { type = types.str; default = ""; - example = '' - Option "RTCornerButton" "2" - Option "RBCornerButton" "3" - ''; - description = '' - Additional options for libinput touchpad driver. + example = + '' + Option "DragLockButtons" "L1 B1 L2 B2" ''; + description = "Additional options for libinput touchpad driver."; }; }; @@ -139,14 +211,21 @@ in { MatchIsTouchpad "on" ${optionalString (cfg.dev != null) ''MatchDevicePath "${cfg.dev}"''} Driver "libinput" + 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.naturalScrolling ''Option "NaturalScrolling" "on"''} - ${if cfg.tapping then ''Option "Tapping" "1"'' else ""} - ${if cfg.tappingDragLock then ''Option "TappingDragLock" "1"'' else ""} + ${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" "${cfg.scrollButton}"''} Option "ScrollMethod" "${cfg.scrollMethod}" - ${optionalString cfg.disableWhileTyping ''Option "DisableWhileTyping" "on"''} + 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 '';