diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index a36b5bb8..7910ad07 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -148,6 +148,8 @@
/modules/services/fluidsynth.nix @Valodim
+/modules/services/gammastep.nix @petabyteboy
+
/modules/services/gnome-keyring.nix @rycee
/modules/services/gpg-agent.nix @rycee
diff --git a/modules/misc/news.nix b/modules/misc/news.nix
index 9b3c5111..68548086 100644
--- a/modules/misc/news.nix
+++ b/modules/misc/news.nix
@@ -1705,6 +1705,14 @@ in
A new zsh submodule is available: 'programs.zsh.prezto'.
'';
}
+
+ {
+ time = "2020-10-22T21:10:38+00:00";
+ condition = hostPlatform.isLinux;
+ message = ''
+ A new module is available: 'services.gammastep'.
+ '';
+ }
];
};
}
diff --git a/modules/modules.nix b/modules/modules.nix
index 81da5cc5..33e51b8c 100644
--- a/modules/modules.nix
+++ b/modules/modules.nix
@@ -140,6 +140,7 @@ let
(loadModule ./services/emacs.nix { condition = hostPlatform.isLinux; })
(loadModule ./services/flameshot.nix { })
(loadModule ./services/fluidsynth.nix { condition = hostPlatform.isLinux; })
+ (loadModule ./services/gammastep.nix { condition = hostPlatform.isLinux; })
(loadModule ./services/getmail.nix { condition = hostPlatform.isLinux; })
(loadModule ./services/gnome-keyring.nix { })
(loadModule ./services/gpg-agent.nix { })
diff --git a/modules/services/gammastep.nix b/modules/services/gammastep.nix
new file mode 100644
index 00000000..7740c462
--- /dev/null
+++ b/modules/services/gammastep.nix
@@ -0,0 +1,166 @@
+# Adapted from Nixpkgs.
+
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+let
+
+ cfg = config.services.gammastep;
+
+in {
+ meta.maintainers = [ maintainers.petabyteboy ];
+
+ options.services.gammastep = {
+ enable = mkOption {
+ type = types.bool;
+ default = false;
+ example = true;
+ description = ''
+ Enable Gammastep to change your screen's colour temperature depending on
+ the time of day.
+ '';
+ };
+
+ latitude = mkOption {
+ type = types.nullOr types.str;
+ default = null;
+ description = ''
+ Your current latitude, between -90.0 and
+ 90.0. Must be provided along with
+ longitude.
+ '';
+ };
+
+ longitude = mkOption {
+ type = types.nullOr types.str;
+ default = null;
+ description = ''
+ Your current longitude, 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.
+ If set to geoclue2, you must also enable the global
+ geoclue2 service.
+ '';
+ };
+
+ temperature = {
+ day = mkOption {
+ type = types.int;
+ default = 5500;
+ description = ''
+ Colour temperature to use during the day, between
+ 1000 and 25000 K.
+ '';
+ };
+
+ night = mkOption {
+ type = types.int;
+ default = 3700;
+ description = ''
+ Colour temperature to use at night, between
+ 1000 and 25000 K.
+ '';
+ };
+ };
+
+ brightness = {
+ day = mkOption {
+ type = types.str;
+ default = "1";
+ description = ''
+ Screen brightness to apply during the day,
+ between 0.1 and 1.0.
+ '';
+ };
+
+ night = mkOption {
+ type = types.str;
+ default = "1";
+ description = ''
+ Screen brightness to apply during the night,
+ between 0.1 and 1.0.
+ '';
+ };
+ };
+
+ package = mkOption {
+ type = types.package;
+ default = pkgs.gammastep;
+ defaultText = literalExample "pkgs.gammastep";
+ description = ''
+ gammastep derivation to use.
+ '';
+ };
+
+ tray = mkOption {
+ type = types.bool;
+ default = false;
+ example = true;
+ description = ''
+ Start the gammastep-indicator tray applet.
+ '';
+ };
+
+ extraOptions = mkOption {
+ type = types.listOf types.str;
+ default = [ ];
+ example = [ "-v" "-m randr" ];
+ description = ''
+ Additional command-line arguments to pass to
+ gammastep.
+ '';
+ };
+ };
+
+ config = mkIf cfg.enable {
+ assertions = [{
+ assertion = cfg.provider == "manual" -> cfg.latitude != null
+ && cfg.longitude != null;
+ message = "Must provide services.gammastep.latitude and"
+ + " services.gammastep.latitude when"
+ + " services.gammastep.provider is set to \"manual\".";
+ }];
+
+ systemd.user.services.gammastep = {
+ Unit = {
+ Description = "Gammastep colour temperature adjuster";
+ After = [ "graphical-session-pre.target" ];
+ PartOf = [ "graphical-session.target" ];
+ };
+
+ Install = { WantedBy = [ "graphical-session.target" ]; };
+
+ Service = {
+ ExecStart = let
+ providerString = if cfg.provider == "manual" then
+ "${cfg.latitude}:${cfg.longitude}"
+ else
+ cfg.provider;
+
+ args = [
+ "-l ${providerString}"
+ "-t ${toString cfg.temperature.day}:${
+ toString cfg.temperature.night
+ }"
+ "-b ${toString cfg.brightness.day}:${toString cfg.brightness.night}"
+ ] ++ cfg.extraOptions;
+
+ command = if cfg.tray then "gammastep-indicator" else "gammastep";
+ in "${cfg.package}/bin/${command} ${concatStringsSep " " args}";
+ RestartSec = 3;
+ Restart = "always";
+ };
+ };
+ };
+
+}