grafana-alloy: don't build the frontend twice
[NixPkgs.git] / nixos / modules / hardware / openrazer.nix
blobc4a60c619f17895c55d1336b8b72dba66c5ddfad
1 { config, pkgs, lib, ... }:
2 let
3   cfg = config.hardware.openrazer;
4   kernelPackages = config.boot.kernelPackages;
6   toPyBoolStr = b: if b then "True" else "False";
8   daemonExe = "${pkgs.openrazer-daemon}/bin/openrazer-daemon --config ${daemonConfFile}";
10   daemonConfFile = pkgs.writeTextFile {
11     name = "razer.conf";
12     text = ''
13       [General]
14       verbose_logging = ${toPyBoolStr cfg.verboseLogging}
16       [Startup]
17       sync_effects_enabled = ${toPyBoolStr cfg.syncEffectsEnabled}
18       devices_off_on_screensaver = ${toPyBoolStr cfg.devicesOffOnScreensaver}
19       battery_notifier = ${toPyBoolStr cfg.batteryNotifier.enable}
20       battery_notifier_freq = ${builtins.toString cfg.batteryNotifier.frequency}
21       battery_notifier_percent = ${builtins.toString cfg.batteryNotifier.percentage}
23       [Statistics]
24       key_statistics = ${toPyBoolStr cfg.keyStatistics}
25     '';
26   };
28   dbusServiceFile = pkgs.writeTextFile rec {
29     name = "org.razer.service";
30     destination = "/share/dbus-1/services/${name}";
31     text = ''
32       [D-BUS Service]
33       Name=org.razer
34       Exec=${daemonExe}
35       SystemdService=openrazer-daemon.service
36     '';
37   };
39   drivers = [
40     "razerkbd"
41     "razermouse"
42     "razerfirefly"
43     "razerkraken"
44     "razermug"
45     "razercore"
46   ];
49   options = {
50     hardware.openrazer = {
51       enable = lib.mkEnableOption ''
52         OpenRazer drivers and userspace daemon
53       '';
55       verboseLogging = lib.mkOption {
56         type = lib.types.bool;
57         default = false;
58         description = ''
59           Whether to enable verbose logging. Logs debug messages.
60         '';
61       };
63       syncEffectsEnabled = lib.mkOption {
64         type = lib.types.bool;
65         default = true;
66         description = ''
67           Set the sync effects flag to true so any assignment of
68           effects will work across devices.
69         '';
70       };
72       devicesOffOnScreensaver = lib.mkOption {
73         type = lib.types.bool;
74         default = true;
75         description = ''
76           Turn off the devices when the systems screensaver kicks in.
77         '';
78       };
80       batteryNotifier = lib.mkOption {
81         description = ''
82           Settings for device battery notifications.
83         '';
84         default = {};
85         type = lib.types.submodule {
86           options = {
87             enable = lib.mkOption {
88               type = lib.types.bool;
89               default = true;
90               description = ''
91                 Mouse battery notifier.
92               '';
93             };
94             frequency = lib.mkOption {
95               type = lib.types.int;
96               default = 600;
97               description = ''
98                 How often battery notifications should be shown (in seconds).
99                 A value of 0 disables notifications.
100               '';
101             };
103             percentage = lib.mkOption {
104               type = lib.types.int;
105               default = 33;
106               description = ''
107                 At what battery percentage the device should reach before
108                 sending notifications.
109               '';
110             };
111           };
112         };
113       };
115       keyStatistics = lib.mkOption {
116         type = lib.types.bool;
117         default = false;
118         description = ''
119           Collects number of keypresses per hour per key used to
120           generate a heatmap.
121         '';
122       };
124       users = lib.mkOption {
125         type = with lib.types; listOf str;
126         default = [];
127         description = ''
128           Usernames to be added to the "openrazer" group, so that they
129           can start and interact with the OpenRazer userspace daemon.
130         '';
131       };
132     };
133   };
135   imports = [
136     (lib.mkRenamedOptionModule [ "hardware" "openrazer" "mouseBatteryNotifier" ] [ "hardware" "openrazer" "batteryNotifier" "enable" ])
137   ];
139   config = lib.mkIf cfg.enable {
140     boot.extraModulePackages = [ kernelPackages.openrazer ];
141     boot.kernelModules = drivers;
143     # Makes the man pages available so you can successfully run
144     # > systemctl --user help openrazer-daemon
145     environment.systemPackages = [ pkgs.python3Packages.openrazer-daemon.man ];
147     services.udev.packages = [ kernelPackages.openrazer ];
148     services.dbus.packages = [ dbusServiceFile ];
150     # A user must be a member of the openrazer group in order to start
151     # the openrazer-daemon. Therefore we make sure that the group
152     # exists.
153     users.groups.openrazer = {
154       members = cfg.users;
155     };
157     systemd.user.services.openrazer-daemon = {
158       description = "Daemon to manage razer devices in userspace";
159       unitConfig.Documentation = "man:openrazer-daemon(8)";
160       # Requires a graphical session so the daemon knows when the screensaver
161       # starts. See the 'devicesOffOnScreensaver' option.
162       wantedBy = [ "graphical-session.target" ];
163       partOf = [ "graphical-session.target" ];
164       serviceConfig = {
165         Type = "dbus";
166         BusName = "org.razer";
167         ExecStart = "${daemonExe} --foreground";
168         Restart = "always";
169       };
170     };
171   };
173   meta = {
174     maintainers = with lib.maintainers; [ roelvandijk ];
175   };