use crate::{
CommandExt, Config, DaemonConfig, DaemonManager, FileInfo, WallSwitchResult, WallpaperBackend,
detect_monitors,
};
use std::process::Command;
pub struct HyprlandBackend;
impl WallpaperBackend for HyprlandBackend {
fn apply(images: &[FileInfo], config: &Config) -> WallSwitchResult<()> {
let monitors = detect_monitors(config)?;
if config.verbose {
println!("monitors:\n{monitors:#?}\n");
}
let daemon_cfg = DaemonConfig {
cmd_name: "hyprpaper",
pre_spawn_hook: None,
};
DaemonManager::ensure_running(config, &daemon_cfg)?;
for (image, monitor) in images.iter().cycle().zip(&monitors) {
let path_str = image.path.to_str().unwrap_or_default();
let mut wall_cmd = Command::new("hyprctl");
let wall_arg = format!("{monitor},{path_str}");
wall_cmd.args(["hyprpaper", "wallpaper", &wall_arg]);
if config.dry_run {
println!("[DRY-RUN] Would execute: {:?}", wall_cmd);
} else {
wall_cmd.run_with_config(config, &format!("Apply hyprpaper on {monitor}"))?;
}
}
Ok(())
}
}
#[cfg(test)]
mod tests_hyprpaper_backend {
use crate::is_process_running;
#[test]
fn test_is_daemon_alive_on_idle() {
let _ = is_process_running("hyprpaper");
}
}