139 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			139 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
| { config, lib, pkgs, ... }:
 | |
| 
 | |
| with lib;
 | |
| 
 | |
| let
 | |
| 
 | |
|   cfg = config.services.redshift;
 | |
|   lcfg = config.location;
 | |
| 
 | |
| in {
 | |
| 
 | |
|   imports = [
 | |
|     (mkChangedOptionModule [ "services" "redshift" "latitude" ] [ "location" "latitude" ]
 | |
|       (config:
 | |
|         let value = getAttrFromPath [ "services" "redshift" "latitude" ] config;
 | |
|         in if value == null then
 | |
|           throw "services.redshift.latitude is set to null, you can remove this"
 | |
|           else builtins.fromJSON value))
 | |
|     (mkChangedOptionModule [ "services" "redshift" "longitude" ] [ "location" "longitude" ]
 | |
|       (config:
 | |
|         let value = getAttrFromPath [ "services" "redshift" "longitude" ] config;
 | |
|         in if value == null then
 | |
|           throw "services.redshift.longitude is set to null, you can remove this"
 | |
|           else builtins.fromJSON value))
 | |
|     (mkRenamedOptionModule [ "services" "redshift" "provider" ] [ "location" "provider" ])
 | |
|   ];
 | |
| 
 | |
|   options.services.redshift = {
 | |
|     enable = mkOption {
 | |
|       type = types.bool;
 | |
|       default = false;
 | |
|       description = ''
 | |
|         Enable Redshift to change your screen's colour temperature depending on
 | |
|         the time of day.
 | |
|       '';
 | |
|     };
 | |
| 
 | |
|     temperature = {
 | |
|       day = mkOption {
 | |
|         type = types.int;
 | |
|         default = 5500;
 | |
|         description = ''
 | |
|           Colour temperature to use during the day, between
 | |
|           <literal>1000</literal> and <literal>25000</literal> K.
 | |
|         '';
 | |
|       };
 | |
|       night = mkOption {
 | |
|         type = types.int;
 | |
|         default = 3700;
 | |
|         description = ''
 | |
|           Colour temperature to use at night, between
 | |
|           <literal>1000</literal> and <literal>25000</literal> K.
 | |
|         '';
 | |
|       };
 | |
|     };
 | |
| 
 | |
|     brightness = {
 | |
|       day = mkOption {
 | |
|         type = types.str;
 | |
|         default = "1";
 | |
|         description = ''
 | |
|           Screen brightness to apply during the day,
 | |
|           between <literal>0.1</literal> and <literal>1.0</literal>.
 | |
|         '';
 | |
|       };
 | |
|       night = mkOption {
 | |
|         type = types.str;
 | |
|         default = "1";
 | |
|         description = ''
 | |
|           Screen brightness to apply during the night,
 | |
|           between <literal>0.1</literal> and <literal>1.0</literal>.
 | |
|         '';
 | |
|       };
 | |
|     };
 | |
| 
 | |
|     package = mkOption {
 | |
|       type = types.package;
 | |
|       default = pkgs.redshift;
 | |
|       defaultText = "pkgs.redshift";
 | |
|       description = ''
 | |
|         redshift derivation to use.
 | |
|       '';
 | |
|     };
 | |
| 
 | |
|     executable = mkOption {
 | |
|       type = types.str;
 | |
|       default = "/bin/redshift";
 | |
|       example = "/bin/redshift-gtk";
 | |
|       description = ''
 | |
|         Redshift executable to use within the package.
 | |
|       '';
 | |
|     };
 | |
| 
 | |
|     extraOptions = mkOption {
 | |
|       type = types.listOf types.str;
 | |
|       default = [];
 | |
|       example = [ "-v" "-m randr" ];
 | |
|       description = ''
 | |
|         Additional command-line arguments to pass to
 | |
|         <command>redshift</command>.
 | |
|       '';
 | |
|     };
 | |
|   };
 | |
| 
 | |
|   config = mkIf cfg.enable {
 | |
|     # needed so that .desktop files are installed, which geoclue cares about
 | |
|     environment.systemPackages = [ cfg.package ];
 | |
| 
 | |
|     services.geoclue2.appConfig.redshift = {
 | |
|       isAllowed = true;
 | |
|       isSystem = true;
 | |
|     };
 | |
| 
 | |
|     systemd.user.services.redshift =
 | |
|     let
 | |
|       providerString = if lcfg.provider == "manual"
 | |
|         then "${toString lcfg.latitude}:${toString lcfg.longitude}"
 | |
|         else lcfg.provider;
 | |
|     in
 | |
|     {
 | |
|       description = "Redshift colour temperature adjuster";
 | |
|       wantedBy = [ "graphical-session.target" ];
 | |
|       partOf = [ "graphical-session.target" ];
 | |
|       serviceConfig = {
 | |
|         ExecStart = ''
 | |
|           ${cfg.package}${cfg.executable} \
 | |
|             -l ${providerString} \
 | |
|             -t ${toString cfg.temperature.day}:${toString cfg.temperature.night} \
 | |
|             -b ${toString cfg.brightness.day}:${toString cfg.brightness.night} \
 | |
|             ${lib.strings.concatStringsSep " " cfg.extraOptions}
 | |
|         '';
 | |
|         RestartSec = 3;
 | |
|         Restart = "always";
 | |
|       };
 | |
|     };
 | |
|   };
 | |
| 
 | |
| }
 | 
