diff --git a/modules/modules.nix b/modules/modules.nix index 7c81102a9..8359bf8ff 100644 --- a/modules/modules.nix +++ b/modules/modules.nix @@ -116,6 +116,7 @@ let ./programs/hstr.nix ./programs/htop.nix ./programs/hyfetch.nix + ./programs/hyprpaper.nix ./programs/i3blocks.nix ./programs/i3status-rust.nix ./programs/i3status.nix diff --git a/modules/programs/hyprpaper.nix b/modules/programs/hyprpaper.nix new file mode 100644 index 000000000..0992f2580 --- /dev/null +++ b/modules/programs/hyprpaper.nix @@ -0,0 +1,108 @@ +{ pkgs, config, lib, ... }: + +with lib; + +let cfg = config.programs.hyprpaper; +in { + meta.maintainers = [ lib.maintainers.silmarp ]; + + options = { + programs.hyprpaper = { + enable = mkEnableOption "hyprpaper"; + + package = mkOption { + type = types.package; + default = pkgs.hyprpaper; + defaultText = literalExpression "pkgs.hyprpaper"; + description = "The package to use for the hyprpaper binary."; + }; + + systemd = { + enable = + mkEnableOption "Whether to enable hyprpaper systemd integration."; + + target = mkOption { + type = types.str; + default = "graphical-session.target"; + example = "hyprland-session.target"; + description = '' + The systemd target that will automatically start the Hyprpaper service. + ''; + }; + }; + + settings = with types; { + preload = mkOption { + type = listOf path; + default = [ ]; + description = '' + Wallpaper images that should be preloaded into memory + ''; + example = [ ./wallpapers/tensura.png ]; + }; + + wallpapers = mkOption { + type = listOf str; + default = [ ]; + description = '' + Wallpaper to monitor mapper + ''; + example = [ "monitor,./wallpapers/tensura.png" ]; + }; + }; + + extraConfig = mkOption { + type = types.str; + default = ""; + description = + "Check https://github.com/hyprwm/hyprpaper#usage for info"; + example = '' + newConfigOption = foo,bar + ''; + }; + }; + }; + + config = { + home.packages = mkIf cfg.enable [ cfg.package ]; + + systemd.user.services.hyprpaper = mkIf cfg.systemd.enable { + Unit = { + Description = "autostart service for Hyprpaper"; + Documentation = "https://github.com/hyprwm/hyprpaper"; + BindsTo = [ "graphical-session.target" ]; + After = [ "graphical-session-pre.target" ]; + }; + + Service = { + ExecStart = "${pkgs.hyprpaper}/bin/hyprpaper"; + ExecReload = "${pkgs.coreutils}/bin/kill -SIGUSR2 $MAINPID"; + Restart = "on-failure"; + KillMode = "mixed"; + }; + + Install = { WantedBy = [ cfg.systemd.target ]; }; + }; + + xdg.configFile = mkIf cfg.enable { + "hypr/hyprpaper.conf".text = '' + # Auto-generated by Nix home-manager module + + # hyprpaper.settings.preload + ${(lists.foldl (acc: v: + acc + '' + preload = ${v} + '') "" cfg.settings.preload)} + + # hyprpaper.settings.wallpapers + ${(lists.foldl (acc: v: + acc + '' + wallpaper = ${v} + '') "" cfg.settings.wallpapers)} + + # hyprpaper.extraConfig + ${cfg.extraConfig} + ''; + }; + }; +} diff --git a/tests/default.nix b/tests/default.nix index 7b714581d..125a5012e 100644 --- a/tests/default.nix +++ b/tests/default.nix @@ -85,6 +85,7 @@ in import nmtSrc { ./modules/programs/himalaya ./modules/programs/htop ./modules/programs/hyfetch + ./modules/programs/hyprpaper ./modules/programs/i3status ./modules/programs/irssi ./modules/programs/jujutsu diff --git a/tests/modules/programs/hyprpaper/default.nix b/tests/modules/programs/hyprpaper/default.nix new file mode 100644 index 000000000..041ceafde --- /dev/null +++ b/tests/modules/programs/hyprpaper/default.nix @@ -0,0 +1 @@ +{ hyprpaper = ./hyprpaper.nix; } diff --git a/tests/modules/programs/hyprpaper/hyprpaper.conf b/tests/modules/programs/hyprpaper/hyprpaper.conf new file mode 100644 index 000000000..65d54d02a --- /dev/null +++ b/tests/modules/programs/hyprpaper/hyprpaper.conf @@ -0,0 +1,16 @@ +# Auto-generated by Nix home-manager module + +# hyprpaper.settings.preload +preload = /path/to/image.png +preload = /path/to/next_image.png + + +# hyprpaper.settings.wallpapers +wallpaper = monitor1,/path/to/image.png +wallpaper = monitor2,/path/to/next_image.png + + +# hyprpaper.extraConfig +splash = true +ipc = off + diff --git a/tests/modules/programs/hyprpaper/hyprpaper.nix b/tests/modules/programs/hyprpaper/hyprpaper.nix new file mode 100644 index 000000000..c21ce6b2a --- /dev/null +++ b/tests/modules/programs/hyprpaper/hyprpaper.nix @@ -0,0 +1,29 @@ +{ ... }: + +{ + programs.hyprpaper = { + enable = true; + systemd.enable = true; + settings = { + preload = [ "/path/to/image.png" "/path/to/next_image.png" ]; + wallpapers = + [ "monitor1,/path/to/image.png" "monitor2,/path/to/next_image.png" ]; + }; + extraConfig = '' + splash = true + ipc = off + ''; + }; + + test.stubs.hyprpaper = { }; + + nmt.script = '' + serviceFile=home-files/.config/systemd/user/hyprpaper.service + + assertFileExists $serviceFile + assertFileRegex $serviceFile 'ExecStart=.*/bin/hyprpaper' + + assertFileExists home-files/.config/hypr/hyprpaper.conf + assertFileContent home-files/.config/hypr/hyprpaper.conf ${./hyprpaper.conf} + ''; +}