diff --git a/nixos/modules/services/x11/redshift.nix b/nixos/modules/services/x11/redshift.nix
index 992709ed0000..30d853841ea4 100644
--- a/nixos/modules/services/x11/redshift.nix
+++ b/nixos/modules/services/x11/redshift.nix
@@ -19,18 +19,31 @@ in {
};
latitude = mkOption {
- type = types.str;
+ type = types.nullOr types.str;
+ default = null;
description = ''
Your current latitude, between
- -90.0 and 90.0.
+ -90.0 and 90.0. Must be provided
+ along with longitude.
'';
};
longitude = mkOption {
- type = types.str;
+ type = types.nullOr types.str;
+ default = null;
description = ''
Your current longitude, between
- between -180.0 and 180.0.
+ between -180.0 and 180.0. Must be
+ provided along with latitude.
+ '';
+ };
+
+ provider = mkOption {
+ type = types.enum [ "manual" "geoclue2" ];
+ default = "manual";
+ description = ''
+ The location provider to use for determining your location. If set to
+ manual you must also provide latitude/longitude.
'';
};
@@ -93,14 +106,33 @@ in {
};
config = mkIf cfg.enable {
- systemd.user.services.redshift = {
+ assertions = [
+ {
+ assertion =
+ if cfg.provider == "manual"
+ then (cfg.latitude != null && cfg.longitude != null)
+ else (cfg.latitude == null && cfg.longitude == null);
+ message = "Latitude and longitude must be provided together, and with provider set to null.";
+ }
+ ];
+
+ services.geoclue2.enable = mkIf (cfg.provider == "geoclue2") true;
+
+ systemd.user.services.redshift =
+ let
+ providerString =
+ if cfg.provider == "manual"
+ then "${cfg.latitude}:${cfg.longitude}"
+ else cfg.provider;
+ in
+ {
description = "Redshift colour temperature adjuster";
wantedBy = [ "graphical-session.target" ];
partOf = [ "graphical-session.target" ];
serviceConfig = {
ExecStart = ''
${cfg.package}/bin/redshift \
- -l ${cfg.latitude}:${cfg.longitude} \
+ -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}