nix-dotfiles/modules/desktop/awww.nix

82 lines
2.6 KiB
Nix

{ lib, config, inputs, system, pkgs, ... }:
with lib;
let
cfg = config.modules.desktop.awww;
in {
options.modules.desktop.awww = {
enable = mkEnableOption "Enable awww, an Answer to your Wayland Wallpaper Woes";
package = mkOption {
type = types.package;
default = pkgs.awww;
example = "pkgs.awww";
};
wallpapersFolder = mkOption {
type = types.str;
default = "${pkgs.my.wallpapers}/share/backgrounds";
example = "$XDG_PICTURES_DIR/wallpapers";
};
lastWallpaper = mkOption {
type = types.str;
default = "$XDG_DATA_HOME/awww-last-wallpaper";
example = "$XDG_DATA_HOME/awww-last-wallpaper";
};
lastWallpaperSym = mkOption {
type = types.str;
default = "$XDG_DATA_HOME/awww-last-wallpaper-sym";
example = "$XDG_DATA_HOME/awww-last-wallpaper-sym";
};
setScript = mkOption {
type = types.package;
default = pkgs.writeShellScript "awww-set" ''
set -euo pipefail
if [ ! -f "${cfg.lastWallpaper}" ]; then
echo "$(ls ${cfg.wallpapersFolder} | shuf -n 1)" > "${cfg.lastWallpaper}"
fi
ln -sf "${cfg.wallpapersFolder}/$(cat ${cfg.lastWallpaper})" "${cfg.lastWallpaperSym}" # in case the hash of the pkg changes
${lib.getExe cfg.package} img "${cfg.wallpapersFolder}/$(cat ${cfg.lastWallpaper})" --transition-type none
'';
};
swapScript = mkOption {
type = types.package;
default = pkgs.writeShellScript "awww-swap" ''
set -euo pipefail
file=$(ls ${cfg.wallpapersFolder} | ${lib.getExe config.modules.desktop.rofi.package} -dmenu -sep '\n' -i -p "select a wallpaper")
wallpaper="${cfg.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
ln -sf "$wallpaper" "${cfg.lastWallpaperSym}"
echo "$file" > "${cfg.lastWallpaper}"
'';
};
};
config = mkIf cfg.enable {
hm.home.packages = [ cfg.package ];
hm.systemd.user.services.awww = {
Unit = {
Description = "awww, an Answer 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/awww-daemon";
ExecStartPost = "${cfg.setScript}";
Restart = "on-failure";
RestartSec = 5;
};
};
};
}