nix-dotfiles/modules/desktop/swww.nix
2025-05-18 23:05:26 -07:00

68 lines
2 KiB
Nix

{ lib, config, inputs, system, pkgs, ... }:
with lib;
let
cfg = config.modules.desktop.swww;
wallpapersFolder = "${pkgs.my.wallpapers}/share/backgrounds";
lastWallpaper = "$XDG_DATA_HOME/swww-last-wallpaper";
in {
options.modules.desktop.swww = {
enable = mkEnableOption "Enable swww, a Solution to your Wayland Wallpaper Woes";
package = mkOption {
type = types.package;
default = pkgs.swww;
example = "pkgs.swww";
};
setScript = mkOption {
type = types.package;
default = pkgs.writeShellScript "swww-set" ''
set -euo pipefail
if [ ! -f "${lastWallpaper}" ]; then
echo "$(ls ${wallpapersFolder} | shuf -n 1)" > "${lastWallpaper}"
fi
${lib.getExe cfg.package} img "${wallpapersFolder}/$(cat ${lastWallpaper})" --transition-type none
'';
};
swapScript = mkOption {
type = types.package;
default = pkgs.writeShellScript "swww-swap" ''
set -euo pipefail
file=$(ls ${wallpapersFolder} | ${lib.getExe config.modules.desktop.rofi.package} -dmenu -sep '\n' -i -p "select a wallpaper")
wallpaper="${wallpapersFolder}/$file"
[ ! -f "$wallpaper" ] && exit 1
${lib.getExe cfg.package} img "$wallpaper" --transition-type grow --transition-fps 60 --transition-pos 1.0,1.0 --transition-duration 1.5
echo "$file" > "${lastWallpaper}"
'';
};
};
config = mkIf cfg.enable {
hm.home.packages = [ cfg.package ];
hm.systemd.user.services.swww = {
Unit = {
Description = "swww, a Solution to your Wayland Wallpaper Woes";
After = [ "graphical-session-pre.target" ];
PartOf = [ "graphical-session.target" ];
};
Install = {
WantedBy = [ "graphical-session.target" ];
};
Service = {
Type = "simple";
ExecStart = "${cfg.package}/bin/swww-daemon --no-cache";
ExecStartPost = "${cfg.setScript}";
Restart = "on-failure";
RestartSec = 5;
};
};
};
}