vuls: init at 0.27.0
[NixPkgs.git] / nixos / modules / tasks / trackpoint.nix
blob0859f83fcef54a73c61bd564dea431e443c78ed8
1 { config, lib, ... }:
3 with lib;
6   ###### interface
8   options = {
10     hardware.trackpoint = {
12       enable = mkOption {
13         default = false;
14         type = types.bool;
15         description = ''
16           Enable sensitivity and speed configuration for trackpoints.
17         '';
18       };
20       sensitivity = mkOption {
21         default = 128;
22         example = 255;
23         type = types.int;
24         description = ''
25           Configure the trackpoint sensitivity. By default, the kernel
26           configures 128.
27         '';
28       };
30       speed = mkOption {
31         default = 97;
32         example = 255;
33         type = types.int;
34         description = ''
35           Configure the trackpoint speed. By default, the kernel
36           configures 97.
37         '';
38       };
40       emulateWheel = mkOption {
41         default = false;
42         type = types.bool;
43         description = ''
44           Enable scrolling while holding the middle mouse button.
45         '';
46       };
48       fakeButtons = mkOption {
49         default = false;
50         type = types.bool;
51         description = ''
52           Switch to "bare" PS/2 mouse support in case Trackpoint buttons are not recognized
53           properly. This can happen for example on models like the L430, T450, T450s, on
54           which the Trackpoint buttons are actually a part of the Synaptics touchpad.
55         '';
56       };
58       device = mkOption {
59         default = "TPPS/2 IBM TrackPoint";
60         type = types.str;
61         description = ''
62           The device name of the trackpoint. You can check with xinput.
63           Some newer devices (example x1c6) use "TPPS/2 Elan TrackPoint".
64         '';
65       };
67     };
69   };
72   ###### implementation
74   config =
75   let cfg = config.hardware.trackpoint; in
76   mkMerge [
77     (mkIf cfg.enable {
78       services.udev.extraRules =
79       ''
80         ACTION=="add|change", SUBSYSTEM=="input", ATTR{name}=="${cfg.device}", ATTR{device/speed}="${toString cfg.speed}", ATTR{device/sensitivity}="${toString cfg.sensitivity}"
81       '';
83       systemd.services.trackpoint = {
84         wantedBy = [ "sysinit.target" ] ;
85         before = [ "sysinit.target" "shutdown.target" ];
86         conflicts = [ "shutdown.target" ];
87         unitConfig.DefaultDependencies = false;
88         serviceConfig.Type = "oneshot";
89         serviceConfig.RemainAfterExit = true;
90         serviceConfig.ExecStart = ''
91           ${config.systemd.package}/bin/udevadm trigger --attr-match=name="${cfg.device}"
92         '';
93       };
94     })
96     (mkIf (cfg.emulateWheel) {
97       services.xserver.inputClassSections = [
98         ''
99           Identifier "Trackpoint Wheel Emulation"
100           MatchProduct "${if cfg.fakeButtons then "PS/2 Generic Mouse" else "ETPS/2 Elantech TrackPoint|Elantech PS/2 TrackPoint|TPPS/2 IBM TrackPoint|DualPoint Stick|Synaptics Inc. Composite TouchPad / TrackPoint|ThinkPad USB Keyboard with TrackPoint|USB Trackpoint pointing device|Composite TouchPad / TrackPoint|${cfg.device}"}"
101           MatchDevicePath "/dev/input/event*"
102           Option "EmulateWheel" "true"
103           Option "EmulateWheelButton" "2"
104           Option "Emulate3Buttons" "false"
105           Option "XAxisMapping" "6 7"
106           Option "YAxisMapping" "4 5"
107         ''
108       ];
109     })
111     (mkIf cfg.fakeButtons {
112       boot.extraModprobeConfig = "options psmouse proto=bare";
113     })
114   ];