diff --git a/cosmic-app-list/src/app.rs b/cosmic-app-list/src/app.rs index 5e789ff2..1d065b3a 100755 --- a/cosmic-app-list/src/app.rs +++ b/cosmic-app-list/src/app.rs @@ -785,7 +785,7 @@ impl cosmic::Application for CosmicAppList { WaylandUpdate::ActivationToken { token, exec } => { let mut exec = shlex::Shlex::new(&exec); let mut cmd = match exec.next() { - Some(cmd) if !cmd.contains('=') => tokio::process::Command::new(cmd), + Some(cmd) if !cmd.contains('=') => std::process::Command::new(cmd), _ => return Command::none(), }; for arg in exec { @@ -798,7 +798,9 @@ impl cosmic::Application for CosmicAppList { cmd.env("XDG_ACTIVATION_TOKEN", &token); cmd.env("DESKTOP_STARTUP_ID", &token); } - let _ = cmd.spawn(); + tokio::task::spawn_blocking(|| { + crate::process::spawn(cmd); + }); } } } diff --git a/cosmic-app-list/src/main.rs b/cosmic-app-list/src/main.rs index a68df1f8..ab85a26d 100644 --- a/cosmic-app-list/src/main.rs +++ b/cosmic-app-list/src/main.rs @@ -2,6 +2,7 @@ mod app; mod config; mod localize; +mod process; mod wayland_handler; mod wayland_subscription; diff --git a/cosmic-app-list/src/process.rs b/cosmic-app-list/src/process.rs new file mode 100644 index 00000000..1f58531a --- /dev/null +++ b/cosmic-app-list/src/process.rs @@ -0,0 +1,31 @@ +use std::process::{exit, Command, Stdio}; + +use nix::sys::wait::waitpid; +use nix::unistd::{fork, ForkResult}; + +/// Performs a double fork with setsid to spawn and detach a command. +pub fn spawn(mut command: Command) { + command + .stdin(Stdio::null()) + .stdout(Stdio::null()) + .stderr(Stdio::null()); + + unsafe { + match fork() { + Ok(ForkResult::Parent { child }) => { + let _res = waitpid(Some(child), None); + } + + Ok(ForkResult::Child) => { + let _res = nix::unistd::setsid(); + let _res = command.spawn(); + + exit(0); + } + + Err(why) => { + println!("failed to fork and spawn command: {}", why.desc()); + } + } + } +}