aboutsummaryrefslogtreecommitdiff
path: root/home-manager/modules/services/random-background.nix
diff options
context:
space:
mode:
Diffstat (limited to 'home-manager/modules/services/random-background.nix')
-rw-r--r--home-manager/modules/services/random-background.nix103
1 files changed, 103 insertions, 0 deletions
diff --git a/home-manager/modules/services/random-background.nix b/home-manager/modules/services/random-background.nix
new file mode 100644
index 00000000000..cbec97ae7cb
--- /dev/null
+++ b/home-manager/modules/services/random-background.nix
@@ -0,0 +1,103 @@
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+let
+
+ cfg = config.services.random-background;
+
+ flags = lib.concatStringsSep " " (
+ [
+ "--bg-${cfg.display}"
+ "--no-fehbg"
+ "--randomize"
+ ]
+ ++ lib.optional (!cfg.enableXinerama) "--no-xinerama"
+ );
+
+in
+
+{
+ meta.maintainers = [ maintainers.rycee ];
+
+ options = {
+ services.random-background = {
+ enable = mkEnableOption "random desktop background";
+
+ imageDirectory = mkOption {
+ type = types.str;
+ example = "%h/backgrounds";
+ description = ''
+ The directory of images from which a background should be
+ chosen. Should be formatted in a way understood by systemd,
+ e.g., '%h' is the home directory.
+ '';
+ };
+
+ display = mkOption {
+ type = types.enum [ "center" "fill" "max" "scale" "tile" ];
+ default = "fill";
+ description = "Display background images according to this option.";
+ };
+
+ interval = mkOption {
+ default = null;
+ type = types.nullOr types.str;
+ example = "1h";
+ description = ''
+ The duration between changing background image, set to null
+ to only set background when logging in. Should be formatted
+ as a duration understood by systemd.
+ '';
+ };
+
+ enableXinerama = mkOption {
+ default = true;
+ type = types.bool;
+ description = ''
+ Will place a separate image per screen when enabled,
+ otherwise a single image will be stretched across all
+ screens.
+ '';
+ };
+ };
+ };
+
+ config = mkIf cfg.enable (
+ mkMerge ([
+ {
+ systemd.user.services.random-background = {
+ Unit = {
+ Description = "Set random desktop background using feh";
+ After = [ "graphical-session-pre.target" ];
+ PartOf = [ "graphical-session.target" ];
+ };
+
+ Service = {
+ Type = "oneshot";
+ ExecStart = "${pkgs.feh}/bin/feh ${flags} ${cfg.imageDirectory}";
+ IOSchedulingClass = "idle";
+ };
+
+ Install = {
+ WantedBy = [ "graphical-session.target" ];
+ };
+ };
+ }
+ (mkIf (cfg.interval != null) {
+ systemd.user.timers.random-background = {
+ Unit = {
+ Description = "Set random desktop background using feh";
+ };
+
+ Timer = {
+ OnUnitActiveSec = cfg.interval;
+ };
+
+ Install = {
+ WantedBy = [ "timers.target" ];
+ };
+ };
+ })
+ ]));
+}