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"; + }; + }; + }; + +}