git.lucas.co / cce-system-interface
system settings
git clone https://git.lucas.co/cce-system-interface.git

commitef75f6340cc10520009bae161f988b80eaba676a
parent5c3f3e7c59
authorLucas Galante <[email protected]>
date2026-06-22 08:40
Use cce_ui::process::spawn_detached to spawn background processes and prevent zombie processes

 src/pages/accounts.rs    |  8 ++++++--
 src/pages/display.rs     | 16 +++++++---------
 src/pages/interface.rs   |  6 +++---
 src/pages/system_info.rs | 16 +++++++++-------
 4 files changed, 25 insertions(+), 21 deletions(-)

diff --git a/src/pages/accounts.rs b/src/pages/accounts.rs
index 4aff9a6..3e16e3f 100644
--- a/src/pages/accounts.rs
+++ b/src/pages/accounts.rs
@@ -216,7 +216,9 @@ pub async fn run_google_login(sender: calloop::channel::Sender<AppAction>) {
         client_config.client_id,
         PKCE_CHALLENGE
     );
-    let _ = std::process::Command::new("xdg-open").arg(&auth_url).spawn();
+    let mut cmd = std::process::Command::new("xdg-open");
+    cmd.arg(&auth_url);
+    let _ = cce_ui::process::spawn_detached(cmd);
 
     if let Ok((mut stream, _)) = listener.accept().await {
         use tokio::io::{AsyncReadExt, AsyncWriteExt};
@@ -751,7 +753,9 @@ pub fn update(state: &mut AccountsState, msg: AccountsMessage) {
             state.status_msg = Some("Google account authenticated!".to_string());
         }
         AccountsMessage::ICloudLoginHelp => {
-            let _ = std::process::Command::new("xdg-open").arg("https://appleid.apple.com/").spawn();
+            let mut cmd = std::process::Command::new("xdg-open");
+            cmd.arg("https://appleid.apple.com/");
+            let _ = cce_ui::process::spawn_detached(cmd);
             state.status_msg = Some("Generate iCloud App Password...".to_string());
         }
         AccountsMessage::EditOAuthCredsStart => {
diff --git a/src/pages/display.rs b/src/pages/display.rs
index 57b61e8..847f2e4 100644
--- a/src/pages/display.rs
+++ b/src/pages/display.rs
@@ -463,15 +463,13 @@ pub fn update(state: &mut DisplayState, msg: DisplayMessage) {
             };
             
             // Spawn screensaver tool from PATH or local directory
-            std::process::Command::new("/home/lsgalante/Dropbox/Clear/cce-screenaver/target/debug/cce-screenaver")
-                .arg(style_flag)
-                .spawn()
-                .or_else(|_| {
-                    std::process::Command::new("cce-screenaver")
-                        .arg(style_flag)
-                        .spawn()
-                })
-                .ok();
+            let mut cmd = std::process::Command::new("/home/lsgalante/Dropbox/Clear/cce-screenaver/target/debug/cce-screenaver");
+            cmd.arg(style_flag);
+            if cce_ui::process::spawn_detached(cmd).is_err() {
+                let mut cmd_fallback = std::process::Command::new("cce-screenaver");
+                cmd_fallback.arg(style_flag);
+                let _ = cce_ui::process::spawn_detached(cmd_fallback);
+            }
         }
     }
 }
diff --git a/src/pages/interface.rs b/src/pages/interface.rs
index 08f2be7..34dd754 100644
--- a/src/pages/interface.rs
+++ b/src/pages/interface.rs
@@ -2235,9 +2235,9 @@ fn read_status_size() -> Option<u16> {
 
 fn write_status_size(size: u16) {
     write_config_value("status_font_size", &size.to_string());
-    let _ = std::process::Command::new("pkill")
-        .args(["-f", "cce-status-interface"])
-        .spawn();
+    let mut cmd = std::process::Command::new("pkill");
+    cmd.args(["-f", "cce-status-interface"]);
+    let _ = cce_ui::process::spawn_detached(cmd);
 }
 
 fn read_fuzzel_size() -> Option<u16> {
diff --git a/src/pages/system_info.rs b/src/pages/system_info.rs
index 5743917..ab2427d 100644
--- a/src/pages/system_info.rs
+++ b/src/pages/system_info.rs
@@ -209,16 +209,16 @@ fn format_duration(secs: i64) -> String {
 
 fn spawn_cpu_power(powersave: bool) {
     let script = if powersave { "cpu-powersave-on" } else { "cpu-powersave-off" };
-    let _ = std::process::Command::new("pkexec")
-        .arg(format!("/home/lsgalante/.local/share/cce-system-interface/helpers/{}", script))
-        .spawn();
+    let mut cmd = std::process::Command::new("pkexec");
+    cmd.arg(format!("/home/lsgalante/.local/share/cce-system-interface/helpers/{}", script));
+    let _ = cce_ui::process::spawn_detached(cmd);
 }
 
 fn spawn_gpu_power(powersave: bool) {
     let script = if powersave { "gpu-powersave-on" } else { "gpu-powersave-off" };
-    let _ = std::process::Command::new("pkexec")
-        .arg(format!("/home/lsgalante/.local/share/cce-system-interface/helpers/{}", script))
-        .spawn();
+    let mut cmd = std::process::Command::new("pkexec");
+    cmd.arg(format!("/home/lsgalante/.local/share/cce-system-interface/helpers/{}", script));
+    let _ = cce_ui::process::spawn_detached(cmd);
 }
 
 fn current_cpu_governor() -> String {
@@ -325,7 +325,9 @@ async fn read_nvidia_gpu_temp() -> Option<f32> {
 }
 
 fn spawn_systemctl(action: &str) {
-    let _ = std::process::Command::new("systemctl").arg(action).spawn();
+    let mut cmd = std::process::Command::new("systemctl");
+    cmd.arg(action);
+    let _ = cce_ui::process::spawn_detached(cmd);
 }
 
 pub async fn fetch_system_state() -> SystemState {