diff --git a/daemon/src/main.rs b/daemon/src/main.rs index 0dd4291..f732485 100644 --- a/daemon/src/main.rs +++ b/daemon/src/main.rs @@ -505,6 +505,15 @@ fn recover_display_env() { } fn main() -> Result<(), Box> { + // Ensure single instance to avoid duplicate daemon processes + let _listener = match std::os::unix::net::UnixListener::bind("\0vietc-daemon-lock") { + Ok(l) => l, + Err(_) => { + eprintln!("[vietc] Another instance is already running. Exiting."); + std::process::exit(0); + } + }; + recover_display_env(); let config_path = config::find_config_path(); let config = Config::load()?; diff --git a/ui/src/main.rs b/ui/src/main.rs index 3fb5211..6152764 100644 --- a/ui/src/main.rs +++ b/ui/src/main.rs @@ -180,6 +180,15 @@ fn config_path() -> PathBuf { } fn main() { + // Ensure single instance to avoid duplicate tray icons + let _listener = match std::os::unix::net::UnixListener::bind("\0vietc-tray-lock") { + Ok(l) => l, + Err(_) => { + eprintln!("[vietc-tray] Another instance is already running. Exiting."); + std::process::exit(0); + } + }; + eprintln!("[vietc-tray] Starting"); // Start daemon (with password prompt if first launch)