diff --git a/Cargo.lock b/Cargo.lock index c9cc2dc..f7831a8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1072,6 +1072,7 @@ version = "0.1.0" dependencies = [ "dirs", "env_logger", + "fork", "gstreamer-tag", "i18n-embed", "i18n-embed-fl", @@ -1765,6 +1766,15 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" +[[package]] +name = "fork" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05dc8b302e04a1c27f4fe694439ef0f29779ca4edc205b7b58f00db04e29656d" +dependencies = [ + "libc", +] + [[package]] name = "form_urlencoded" version = "1.2.1" diff --git a/Cargo.toml b/Cargo.toml index d18e5bc..a1c90a2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -42,6 +42,9 @@ optional = true version = "0.2.1" features = ["serde"] +[target.'cfg(unix)'.dependencies] +fork = "0.2" + [features] default = ["mpris-server", "xdg-portal", "wgpu"] xdg-portal = ["libcosmic/xdg-portal"] diff --git a/src/main.rs b/src/main.rs index 5e52ea5..a657a55 100644 --- a/src/main.rs +++ b/src/main.rs @@ -68,7 +68,17 @@ fn language_name(code: &str) -> Option { /// Runs application with these settings #[rustfmt::skip] -pub fn main() -> Result<(), Box> { +fn main() -> Result<(), Box> { + #[cfg(all(unix, not(target_os = "redox")))] + match fork::daemon(true, true) { + Ok(fork::Fork::Child) => (), + Ok(fork::Fork::Parent(_child_pid)) => process::exit(0), + Err(err) => { + eprintln!("failed to daemonize: {:?}", err); + process::exit(1); + } + } + env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("warn")).init(); localize::localize();