mirror of
https://github.com/nix-community/home-manager.git
synced 2025-11-08 11:36:05 +01:00
Some files don't need nesting and can be root level again to reduce conflicts with other PRs. Signed-off-by: Austin Horstman <khaneliman12@gmail.com>
153 lines
4.2 KiB
Nix
153 lines
4.2 KiB
Nix
{
|
|
config,
|
|
lib,
|
|
pkgs,
|
|
...
|
|
}:
|
|
let
|
|
inherit (lib) mkOption types;
|
|
|
|
cfg = config.services.linux-wallpaperengine;
|
|
|
|
in
|
|
{
|
|
meta.maintainers = [ lib.hm.maintainers.ckgxrg ];
|
|
|
|
options.services.linux-wallpaperengine = {
|
|
enable = lib.mkEnableOption "linux-wallpaperengine, an implementation of Wallpaper Engine functionality";
|
|
|
|
package = lib.mkPackageOption pkgs "linux-wallpaperengine" { };
|
|
|
|
assetsPath = mkOption {
|
|
type = types.nullOr types.path;
|
|
default = null;
|
|
description = "Path to the assets directory.";
|
|
};
|
|
|
|
clamping = mkOption {
|
|
type = types.nullOr (
|
|
types.enum [
|
|
"clamp"
|
|
"border"
|
|
"repeat"
|
|
]
|
|
);
|
|
default = null;
|
|
description = "Clamping mode for all wallpapers.";
|
|
};
|
|
|
|
wallpapers = mkOption {
|
|
type = types.listOf (
|
|
types.submodule {
|
|
options = {
|
|
monitor = mkOption {
|
|
type = types.str;
|
|
description = "Which monitor to display the wallpaper.";
|
|
};
|
|
|
|
wallpaperId = mkOption {
|
|
type = types.str;
|
|
description = "Wallpaper ID to be used.";
|
|
};
|
|
|
|
extraOptions = mkOption {
|
|
type = types.listOf types.str;
|
|
default = [ ];
|
|
description = "Extra arguments to pass to the linux-wallpaperengine command for this wallpaper.";
|
|
};
|
|
|
|
scaling = mkOption {
|
|
type = types.nullOr (
|
|
types.enum [
|
|
"stretch"
|
|
"fit"
|
|
"fill"
|
|
"default"
|
|
]
|
|
);
|
|
default = null;
|
|
description = "Scaling mode for this wallpaper.";
|
|
};
|
|
|
|
fps = mkOption {
|
|
type = types.nullOr types.int;
|
|
default = null;
|
|
description = "Limits the FPS to a given number.";
|
|
};
|
|
|
|
audio = {
|
|
silent = mkOption {
|
|
type = types.bool;
|
|
default = false;
|
|
description = "Mutes all sound of the wallpaper.";
|
|
};
|
|
|
|
automute = mkOption {
|
|
type = types.bool;
|
|
default = true;
|
|
description = "Automute when another app is playing sound.";
|
|
};
|
|
|
|
processing = mkOption {
|
|
type = types.bool;
|
|
default = true;
|
|
description = "Enables audio processing for background.";
|
|
};
|
|
};
|
|
};
|
|
}
|
|
);
|
|
default = [ ];
|
|
description = "Define wallpapers.";
|
|
};
|
|
};
|
|
|
|
config = lib.mkIf cfg.enable {
|
|
assertions = [
|
|
(lib.hm.assertions.assertPlatform "services.linux-wallpaperengine" pkgs lib.platforms.linux)
|
|
({
|
|
assertion = cfg.wallpapers != null;
|
|
message = "linux-wallpaperengine: You must set at least one wallpaper";
|
|
})
|
|
];
|
|
|
|
home.packages = [ cfg.package ];
|
|
|
|
systemd.user.services."linux-wallpaperengine" =
|
|
let
|
|
args = lib.lists.forEach cfg.wallpapers (
|
|
each:
|
|
lib.concatStringsSep " " (
|
|
lib.cli.toGNUCommandLine { } {
|
|
screen-root = each.monitor;
|
|
inherit (each) scaling fps;
|
|
silent = each.audio.silent;
|
|
noautomute = !each.audio.automute;
|
|
no-audio-processing = !each.audio.processing;
|
|
}
|
|
++ each.extraOptions
|
|
)
|
|
# This has to be the last argument in each group
|
|
+ " --bg ${each.wallpaperId}"
|
|
);
|
|
in
|
|
{
|
|
Unit = {
|
|
Description = "Implementation of Wallpaper Engine on Linux";
|
|
After = [ "graphical-session.target" ];
|
|
PartOf = [ "graphical-session.target" ];
|
|
};
|
|
Service = {
|
|
ExecStart =
|
|
lib.getExe cfg.package
|
|
+ (lib.optionalString (cfg.assetsPath != null) " --assets-dir ${cfg.assetsPath} ")
|
|
+ (lib.optionalString (cfg.clamping != null) "--clamping ${cfg.clamping} ")
|
|
+ (lib.strings.concatStringsSep " " args);
|
|
Restart = "on-failure";
|
|
};
|
|
Install = {
|
|
WantedBy = [ "graphical-session.target" ];
|
|
};
|
|
};
|
|
};
|
|
}
|