diff --git a/src/helpers.rs b/src/helpers.rs index 4372abd..73b5ef8 100644 --- a/src/helpers.rs +++ b/src/helpers.rs @@ -1,4 +1,4 @@ -use crate::{util::config::Config, wallpaper}; +use crate::wallpaper; use color_eyre::{eyre::Result, Report}; use log::LevelFilter; use matugen::color::color::Source; @@ -56,24 +56,17 @@ pub fn setup_logging(args: &Cli) -> Result<(), Report> { Ok(()) } -pub fn set_wallpaper(source: &Source, config: &Config) -> Result<(), Report> { +pub fn set_wallpaper(source: &Source, wallpaper_cfg: wallpaper::Wallpaper) -> Result<(), Report> { let path = match &source { Source::Image { path } => path, Source::Color { .. } => return Ok(()), #[cfg(feature = "web-image")] Source::WebImage { .. } => return Ok(()), }; - #[cfg(any(target_os = "linux", target_os = "netbsd"))] - let wallpaper_tool = match &config.wallpaper_tool { - Some(wallpaper_tool) => wallpaper_tool, - None => { - if cfg!(windows) { - return Ok(()); - } - return Ok(warn!( - "Wallpaper tool not set, not setting wallpaper..." - )); - } + if !wallpaper_cfg.set { + return Ok(warn!( + "Wallpaper setting disabled, not setting wallpaper..." + )); }; #[cfg(target_os = "windows")] wallpaper::windows::set(path)?; @@ -82,9 +75,7 @@ pub fn set_wallpaper(source: &Source, config: &Config) -> Result<(), Report> { #[cfg(any(target_os = "linux", target_os = "netbsd"))] wallpaper::unix::set( path, - wallpaper_tool, - &config.feh_options, - &config.swww_options, + wallpaper_cfg )?; Ok(()) } diff --git a/src/main.rs b/src/main.rs index 5772d11..dbee85d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,7 +5,6 @@ extern crate pretty_env_logger; extern crate paris_log; mod helpers; -mod reload; pub mod template; mod util; mod wallpaper; @@ -77,13 +76,8 @@ fn main() -> Result<(), Report> { config_path, )?; - if config.config.reload_apps == Some(true) { - #[cfg(any(target_os = "linux", target_os = "netbsd"))] - reload::unix::reload(&args, &config)?; - } - - if config.config.set_wallpaper == Some(true) { - set_wallpaper(&args.source, &config.config)?; + if let Some(wallpaper_cfg) = config.config.wallpaper { + set_wallpaper(&args.source, wallpaper_cfg)?; } } diff --git a/src/reload/mod.rs b/src/reload/mod.rs deleted file mode 100644 index 824b010..0000000 --- a/src/reload/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -#[cfg(any(target_os = "linux", target_os = "netbsd"))] -pub mod unix; diff --git a/src/reload/unix.rs b/src/reload/unix.rs deleted file mode 100644 index 85543c0..0000000 --- a/src/reload/unix.rs +++ /dev/null @@ -1,73 +0,0 @@ -use crate::util::{arguments::Cli, config::ConfigFile}; -use color_eyre::{eyre::Result, Report}; - -use std::process::Command; - -use crate::SchemesEnum; - -#[cfg(any(target_os = "linux", target_os = "netbsd"))] -pub fn reload(args: &Cli, config: &ConfigFile) -> Result<(), Report> { - if config.config.reload_apps_list.is_none() { - warn!("The option config.reload_apps is set to TRUE, but config.reload_apps_list is EMPTY. Not restarting any apps..."); - return Ok(()); - } - - let reload_apps_list = &config.config.reload_apps_list.as_ref().unwrap(); - - if reload_apps_list.waybar == Some(true) || reload_apps_list.waybar.is_none() { - reload_app("waybar", "SIGUSR2")?; - } - - if reload_apps_list.kitty == Some(true) || reload_apps_list.waybar.is_none() { - reload_app("kitty", "SIGUSR1")?; - } - - if reload_apps_list.dunst == Some(true) || reload_apps_list.waybar.is_none() { - reload_app("dunst", "SIGUSR2")?; - } - - if reload_apps_list.gtk_theme == Some(true) || reload_apps_list.waybar.is_none() { - reload_gtk_theme(args)?; - } - - if reload_apps_list.mako == Some(true) || reload_apps_list.waybar.is_none() { - reload_app("mako", "SIGUSR2")?; - } - - Ok(()) -} - -#[cfg(any(target_os = "linux", target_os = "netbsd"))] -pub fn reload_app(name: &str, signal: &str) -> Result<(), Report> { - info!("Restarting {}", name); - let mut kill = Command::new("pkill"); - kill.arg(format!("-{}", signal)); - kill.arg(name); - - kill.spawn()?; - Ok(()) -} - -#[cfg(any(target_os = "linux", target_os = "netbsd"))] -fn reload_gtk_theme(args: &Cli) -> Result<(), Report> { - let mode = match args.mode { - Some(SchemesEnum::Light) => "light", - Some(SchemesEnum::Dark) => "dark", - None => "dark", - }; - - info!("Setting gtk theme to adw-gtk3-{}", mode); - - set_theme("")?; - set_theme(format!("adw-gtk3-{}", mode).as_str())?; - Ok(()) -} - -#[cfg(any(target_os = "linux", target_os = "netbsd"))] -fn set_theme(theme: &str) -> Result<(), Report> { - Command::new("gsettings") - .args(["set", "org.gnome.desktop.interface", "gtk-theme", theme]) - .spawn()?; - - Ok(()) -} diff --git a/src/util/config.rs b/src/util/config.rs index 82d2602..4f1655c 100644 --- a/src/util/config.rs +++ b/src/util/config.rs @@ -9,39 +9,18 @@ use serde::{Deserialize, Serialize}; use super::arguments::Cli; use crate::Template; - -#[derive(Serialize, Deserialize, Debug)] -pub enum WallpaperTool { - Swaybg, - Swww, - Nitrogen, - Feh, -} +use crate::wallpaper::Wallpaper; #[derive(Serialize, Deserialize, Debug)] pub struct Config { - pub reload_apps: Option, pub version_check: Option, - pub reload_apps_list: Option, - pub set_wallpaper: Option, - pub wallpaper_tool: Option, + pub wallpaper: Option, // TODO: Add a `Command` struct - pub swww_options: Option>, - pub feh_options: Option>, pub prefix: Option, pub custom_keywords: Option>, pub custom_colors: Option>, } -#[derive(Deserialize, Serialize, Debug)] -pub struct Apps { - pub kitty: Option, - pub waybar: Option, - pub gtk_theme: Option, - pub dunst: Option, - pub mako: Option, -} - #[derive(Serialize, Deserialize, Debug)] pub struct ConfigFile { pub config: Config, diff --git a/src/wallpaper/mod.rs b/src/wallpaper/mod.rs index 9bc53c6..a261724 100644 --- a/src/wallpaper/mod.rs +++ b/src/wallpaper/mod.rs @@ -1,3 +1,15 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Clone, Debug, Deserialize, Serialize)] +pub struct Wallpaper { + pub set: bool, + /// Useful for, for example, killing the wallpaper daemon + pub pre_hook: Option, + pub command: String, + /// The last argument will be the image path + pub arguments: Option>, +} + #[cfg(any(target_os = "linux", target_os = "netbsd"))] pub mod unix; diff --git a/src/wallpaper/unix.rs b/src/wallpaper/unix.rs index 793ac9f..084dd7f 100644 --- a/src/wallpaper/unix.rs +++ b/src/wallpaper/unix.rs @@ -1,41 +1,35 @@ use color_eyre::Report; -use std::process::Command; -use std::process::Stdio; - -use crate::reload::unix::reload_app; -use crate::util::config::WallpaperTool; +use std::process::{Command, Stdio}; +use crate::wallpaper::Wallpaper; +use execute::Execute; #[cfg(any(target_os = "linux", target_os = "netbsd"))] pub fn set( path: &String, - wallpaper_tool: &WallpaperTool, - feh_options: &Option>, - swww_options: &Option>, + Wallpaper { pre_hook, command, arguments, .. }: Wallpaper, ) -> Result<(), Report> { info!("Setting wallpaper..."); - match &wallpaper_tool { - WallpaperTool::Swaybg => set_wallaper_swaybg(path), - WallpaperTool::Swww => set_wallaper_swww(path, swww_options), - WallpaperTool::Nitrogen => set_wallaper_nitrogen(path), - WallpaperTool::Feh => set_wallaper_feh(path, feh_options), + if let Some(hook) = pre_hook { + spawn_hook(hook)? } -} -#[cfg(any(target_os = "linux", target_os = "netbsd"))] -fn set_wallaper_swaybg(path: &String) -> Result<(), Report> { - reload_app("swaybg", "SIGUSR1")?; + let mut binding = Command::new(&command); + let cmd = binding + .stdout(Stdio::null()) + .stderr(Stdio::null()); - let mut binding = Command::new("swaybg"); - let cmd = binding.stdout(Stdio::null()).stderr(Stdio::null()); - cmd.arg("-i"); + if let Some(args) = arguments { + cmd.args(args); + } cmd.arg(path); + match cmd.spawn() { - Ok(_) => info!("Successfully set the wallpaper with swaybg"), + Ok(_) => info!("Successfully set the wallpaper with {command}"), Err(e) => { if let std::io::ErrorKind::NotFound = e.kind() { - error!("Failed to set wallpaper, the program swaybg was not found in PATH!") + error!("Failed to set wallpaper, the program {command} was not found in PATH!") } else { error!("Some error(s) occured while setting wallpaper!"); } @@ -44,77 +38,23 @@ fn set_wallaper_swaybg(path: &String) -> Result<(), Report> { Ok(()) } -#[cfg(any(target_os = "linux", target_os = "netbsd"))] -fn set_wallaper_swww(path: &String, swww_options: &Option>) -> Result<(), Report> { - let mut binding = Command::new("swww"); - let cmd = binding.stdout(Stdio::null()).stderr(Stdio::null()); - cmd.arg("img"); - cmd.arg(path); - if let Some(options) = &swww_options { - if !options[0].is_empty() { - cmd.args(options); - } - } - - match cmd.spawn() { - Ok(_) => info!("Successfully set the wallpaper with swww"), - Err(e) => { - if let std::io::ErrorKind::NotFound = e.kind() { - error!("Failed to set wallpaper, the program swww was not found in PATH!") - } else { - error!("Some error(s) occured while setting wallpaper!"); - } - } - }; - Ok(()) -} #[cfg(any(target_os = "linux", target_os = "netbsd"))] -fn set_wallaper_nitrogen(path: &String) -> Result<(), Report> { - let mut binding = Command::new("nitrogen"); - let cmd = binding.stdout(Stdio::null()).stderr(Stdio::null()); - cmd.arg(path); +fn spawn_hook(hook: String) -> Result<(), Report> { + let mut command = execute::shell(&hook); - match cmd.spawn() { - Ok(_) => info!("Successfully set the wallpaper with nitrogen"), - Err(e) => { - if let std::io::ErrorKind::NotFound = e.kind() { - error!( - "Failed to set wallpaper, the program nitrogen was not found in PATH!" - ) - } else { - error!("Some error(s) occured while setting wallpaper!"); - } - } - }; - Ok(()) -} + command.stdout(Stdio::inherit()); -#[cfg(any(target_os = "linux", target_os = "netbsd"))] -fn set_wallaper_feh(path: &String, feh_options: &Option>) -> Result<(), Report> { - let mut binding = Command::new("feh"); - let cmd = binding.stdout(Stdio::null()).stderr(Stdio::null()); + let output = command.execute_output()?; - if let Some(options) = &feh_options { - if !options[0].is_empty() { - cmd.args(options); - } else { - cmd.arg("--bg-scale"); + if let Some(exit_code) = output.status.code() { + if exit_code != 0 { + error!("Failed executing command: {:?}", hook) } + } else { + eprintln!("Interrupted!"); } - cmd.arg(path); - - match cmd.spawn() { - Ok(_) => info!("Successfully set the wallpaper with feh"), - Err(e) => { - if let std::io::ErrorKind::NotFound = e.kind() { - error!("Failed to set wallpaper, the program feh was not found in PATH!") - } else { - error!("Some error(s) occured while setting wallpaper!"); - } - } - }; Ok(()) }