134 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			134 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
| { 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 = {
 | |
|       enable = mkEnableOption "OpenRazer drivers and userspace daemon";
 | |
| 
 | |
|       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 ];
 | |
|   };
 | |
| }
 | 
