| 
									
										
										
										
											2019-08-28 21:17:25 -04:00
										 |  |  | { config, pkgs, lib, ... }: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | with lib; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | let | 
					
						
							|  |  |  |   cfg = config.hardware.openrazer; | 
					
						
							|  |  |  |   kernelPackages = config.boot.kernelPackages; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   toPyBoolStr = b: if b then "True" else "False"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   daemonExe = "${pkgs.openrazer-daemon}/bin/openrazer-daemon --config ${daemonConfFile}"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   daemonConfFile = pkgs.writeTextFile { | 
					
						
							|  |  |  |     name = "razer.conf"; | 
					
						
							|  |  |  |     text = ''
 | 
					
						
							|  |  |  |       [General] | 
					
						
							|  |  |  |       verbose_logging = ${toPyBoolStr cfg.verboseLogging} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       [Startup] | 
					
						
							|  |  |  |       sync_effects_enabled = ${toPyBoolStr cfg.syncEffectsEnabled} | 
					
						
							|  |  |  |       devices_off_on_screensaver = ${toPyBoolStr cfg.devicesOffOnScreensaver} | 
					
						
							|  |  |  |       mouse_battery_notifier = ${toPyBoolStr cfg.mouseBatteryNotifier} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       [Statistics] | 
					
						
							|  |  |  |       key_statistics = ${toPyBoolStr cfg.keyStatistics} | 
					
						
							|  |  |  |     '';
 | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   dbusServiceFile = pkgs.writeTextFile rec { | 
					
						
							|  |  |  |     name = "org.razer.service"; | 
					
						
							|  |  |  |     destination = "/share/dbus-1/services/${name}"; | 
					
						
							|  |  |  |     text = ''
 | 
					
						
							|  |  |  |       [D-BUS Service] | 
					
						
							|  |  |  |       Name=org.razer | 
					
						
							|  |  |  |       Exec=${daemonExe} | 
					
						
							|  |  |  |       SystemdService=openrazer-daemon.service | 
					
						
							|  |  |  |     '';
 | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   drivers = [ | 
					
						
							|  |  |  |     "razerkbd" | 
					
						
							|  |  |  |     "razermouse" | 
					
						
							|  |  |  |     "razerfirefly" | 
					
						
							|  |  |  |     "razerkraken" | 
					
						
							|  |  |  |     "razermug" | 
					
						
							|  |  |  |     "razercore" | 
					
						
							|  |  |  |   ]; | 
					
						
							|  |  |  | in | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   options = { | 
					
						
							|  |  |  |     hardware.openrazer = { | 
					
						
							| 
									
										
										
										
											2020-01-30 01:32:16 -05:00
										 |  |  |       enable = mkEnableOption "OpenRazer drivers and userspace daemon"; | 
					
						
							| 
									
										
										
										
											2019-08-28 21:17:25 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |       verboseLogging = mkOption { | 
					
						
							|  |  |  |         type = types.bool; | 
					
						
							|  |  |  |         default = false; | 
					
						
							|  |  |  |         description = ''
 | 
					
						
							|  |  |  |           Whether to enable verbose logging. Logs debug messages. | 
					
						
							|  |  |  |         '';
 | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       syncEffectsEnabled = mkOption { | 
					
						
							|  |  |  |         type = types.bool; | 
					
						
							|  |  |  |         default = true; | 
					
						
							|  |  |  |         description = ''
 | 
					
						
							|  |  |  |           Set the sync effects flag to true so any assignment of | 
					
						
							|  |  |  |           effects will work across devices. | 
					
						
							|  |  |  |         '';
 | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       devicesOffOnScreensaver = mkOption { | 
					
						
							|  |  |  |         type = types.bool; | 
					
						
							|  |  |  |         default = true; | 
					
						
							|  |  |  |         description = ''
 | 
					
						
							|  |  |  |           Turn off the devices when the systems screensaver kicks in. | 
					
						
							|  |  |  |         '';
 | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       mouseBatteryNotifier = mkOption { | 
					
						
							|  |  |  |         type = types.bool; | 
					
						
							|  |  |  |         default = true; | 
					
						
							|  |  |  |         description = ''
 | 
					
						
							|  |  |  |           Mouse battery notifier. | 
					
						
							|  |  |  |         '';
 | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       keyStatistics = mkOption { | 
					
						
							|  |  |  |         type = types.bool; | 
					
						
							|  |  |  |         default = false; | 
					
						
							|  |  |  |         description = ''
 | 
					
						
							|  |  |  |           Collects number of keypresses per hour per key used to | 
					
						
							|  |  |  |           generate a heatmap. | 
					
						
							|  |  |  |         '';
 | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   config = mkIf cfg.enable { | 
					
						
							|  |  |  |     boot.extraModulePackages = [ kernelPackages.openrazer ]; | 
					
						
							|  |  |  |     boot.kernelModules = drivers; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Makes the man pages available so you can succesfully run | 
					
						
							|  |  |  |     # > systemctl --user help openrazer-daemon | 
					
						
							|  |  |  |     environment.systemPackages = [ pkgs.python3Packages.openrazer-daemon.man ]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     services.udev.packages = [ kernelPackages.openrazer ]; | 
					
						
							|  |  |  |     services.dbus.packages = [ dbusServiceFile ]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # A user must be a member of the plugdev group in order to start | 
					
						
							|  |  |  |     # the openrazer-daemon. Therefore we make sure that the plugdev | 
					
						
							|  |  |  |     # group exists. | 
					
						
							|  |  |  |     users.groups.plugdev = {}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     systemd.user.services.openrazer-daemon = { | 
					
						
							|  |  |  |       description = "Daemon to manage razer devices in userspace"; | 
					
						
							|  |  |  |       unitConfig.Documentation = "man:openrazer-daemon(8)"; | 
					
						
							|  |  |  |         # Requires a graphical session so the daemon knows when the screensaver | 
					
						
							|  |  |  |         # starts. See the 'devicesOffOnScreensaver' option. | 
					
						
							|  |  |  |         wantedBy = [ "graphical-session.target" ]; | 
					
						
							|  |  |  |         partOf = [ "graphical-session.target" ]; | 
					
						
							|  |  |  |         serviceConfig = { | 
					
						
							|  |  |  |           Type = "dbus"; | 
					
						
							|  |  |  |           BusName = "org.razer"; | 
					
						
							|  |  |  |           ExecStart = "${daemonExe} --foreground"; | 
					
						
							|  |  |  |           Restart = "always"; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   meta = { | 
					
						
							|  |  |  |     maintainers = with lib.maintainers; [ roelvandijk ]; | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | } |