more-wallpapers 0.4.0

crossplatform library to set desktop wallpaper per screen
Documentation
use crate::{error::CommandError, linux::run_command, Mode, Screen};
use std::process::Command;

pub(crate) fn get_screens() -> Result<Vec<Screen>, xrandr::XrandrError> {
	let monitors = xrandr::XHandle::open()?.monitors()?;
	let mut screens = Vec::new();
	for monitor in monitors {
		if monitor.is_automatic {
			screens.push(Screen {
				name: monitor.name,
				active: true,
				wallpaper: None,
				mode: None,
			})
		}
	}
	Ok(screens)
}

pub(crate) fn set_screens(screens: Vec<Screen>) -> Result<(), CommandError> {
	let mut command = Command::new("xwallpaper");
	for screen in screens {
		let mode = match screen.mode.unwrap() {
			Mode::Center => "center",
			Mode::Crop => "zoom",
			Mode::Fit => "maximize",
			Mode::Stretch => "stretch",
			Mode::Tile => "tile",
		};
		command.args([
			"--output",
			&screen.name,
			&format!("--{mode}"),
			screen.wallpaper.as_ref().unwrap().as_str(),
		]);
	}
	run_command(command)?;
	Ok(())
}