blob: 80605eb11407af190cae7ea0812460a082e2b8d7 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
{ 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 = lib.mdDoc ''
Enable Redshift to change your screen's colour temperature depending on
the time of day.
'';
};
temperature = {
day = mkOption {
type = types.int;
default = 5500;
description = lib.mdDoc ''
Colour temperature to use during the day, between
`1000` and `25000` K.
'';
};
night = mkOption {
type = types.int;
default = 3700;
description = lib.mdDoc ''
Colour temperature to use at night, between
`1000` and `25000` K.
'';
};
};
brightness = {
day = mkOption {
type = types.str;
default = "1";
description = lib.mdDoc ''
Screen brightness to apply during the day,
between `0.1` and `1.0`.
'';
};
night = mkOption {
type = types.str;
default = "1";
description = lib.mdDoc ''
Screen brightness to apply during the night,
between `0.1` and `1.0`.
'';
};
};
package = mkPackageOption pkgs "redshift" { };
executable = mkOption {
type = types.str;
default = "/bin/redshift";
example = "/bin/redshift-gtk";
description = lib.mdDoc ''
Redshift executable to use within the package.
'';
};
extraOptions = mkOption {
type = types.listOf types.str;
default = [];
example = [ "-v" "-m randr" ];
description = lib.mdDoc ''
Additional command-line arguments to pass to
{command}`redshift`.
'';
};
};
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";
};
};
};
}
|