grafana-alloy: don't build the frontend twice
[NixPkgs.git] / nixos / modules / services / x11 / redshift.nix
blobb0b22e6782784d4325193068e75c4887f2d5557d
1 { config, lib, pkgs, ... }:
3 with lib;
5 let
7   cfg = config.services.redshift;
8   lcfg = config.location;
10 in {
12   imports = [
13     (mkChangedOptionModule [ "services" "redshift" "latitude" ] [ "location" "latitude" ]
14       (config:
15         let value = getAttrFromPath [ "services" "redshift" "latitude" ] config;
16         in if value == null then
17           throw "services.redshift.latitude is set to null, you can remove this"
18           else builtins.fromJSON value))
19     (mkChangedOptionModule [ "services" "redshift" "longitude" ] [ "location" "longitude" ]
20       (config:
21         let value = getAttrFromPath [ "services" "redshift" "longitude" ] config;
22         in if value == null then
23           throw "services.redshift.longitude is set to null, you can remove this"
24           else builtins.fromJSON value))
25     (mkRenamedOptionModule [ "services" "redshift" "provider" ] [ "location" "provider" ])
26   ];
28   options.services.redshift = {
29     enable = mkOption {
30       type = types.bool;
31       default = false;
32       description = ''
33         Enable Redshift to change your screen's colour temperature depending on
34         the time of day.
35       '';
36     };
38     temperature = {
39       day = mkOption {
40         type = types.int;
41         default = 5500;
42         description = ''
43           Colour temperature to use during the day, between
44           `1000` and `25000` K.
45         '';
46       };
47       night = mkOption {
48         type = types.int;
49         default = 3700;
50         description = ''
51           Colour temperature to use at night, between
52           `1000` and `25000` K.
53         '';
54       };
55     };
57     brightness = {
58       day = mkOption {
59         type = types.str;
60         default = "1";
61         description = ''
62           Screen brightness to apply during the day,
63           between `0.1` and `1.0`.
64         '';
65       };
66       night = mkOption {
67         type = types.str;
68         default = "1";
69         description = ''
70           Screen brightness to apply during the night,
71           between `0.1` and `1.0`.
72         '';
73       };
74     };
76     package = mkPackageOption pkgs "redshift" { };
78     executable = mkOption {
79       type = types.str;
80       default = "/bin/redshift";
81       example = "/bin/redshift-gtk";
82       description = ''
83         Redshift executable to use within the package.
84       '';
85     };
87     extraOptions = mkOption {
88       type = types.listOf types.str;
89       default = [];
90       example = [ "-v" "-m randr" ];
91       description = ''
92         Additional command-line arguments to pass to
93         {command}`redshift`.
94       '';
95     };
96   };
98   config = mkIf cfg.enable {
99     # needed so that .desktop files are installed, which geoclue cares about
100     environment.systemPackages = [ cfg.package ];
102     services.geoclue2.appConfig.redshift = {
103       isAllowed = true;
104       isSystem = true;
105     };
107     systemd.user.services.redshift =
108     let
109       providerString = if lcfg.provider == "manual"
110         then "${toString lcfg.latitude}:${toString lcfg.longitude}"
111         else lcfg.provider;
112     in
113     {
114       description = "Redshift colour temperature adjuster";
115       wantedBy = [ "graphical-session.target" ];
116       partOf = [ "graphical-session.target" ];
117       serviceConfig = {
118         ExecStart = ''
119           ${cfg.package}${cfg.executable} \
120             -l ${providerString} \
121             -t ${toString cfg.temperature.day}:${toString cfg.temperature.night} \
122             -b ${toString cfg.brightness.day}:${toString cfg.brightness.night} \
123             ${lib.strings.concatStringsSep " " cfg.extraOptions}
124         '';
125         RestartSec = 3;
126         Restart = "always";
127       };
128     };
129   };