diff --git a/src/common.rs b/src/common.rs index 1ed9d6a8f..2e801e66d 100644 --- a/src/common.rs +++ b/src/common.rs @@ -84,6 +84,7 @@ lazy_static::lazy_static! { // Is server logic running. The server code can invoked to run by the main process if --server is not running. static ref SERVER_RUNNING: Arc> = Default::default(); static ref IS_MAIN: bool = std::env::args().nth(1).map_or(true, |arg| !arg.starts_with("--")); + static ref IS_CM: bool = std::env::args().nth(1) == Some("--cm".to_owned()) || std::env::args().nth(1) == Some("--cm-no-ui".to_owned()); } pub struct SimpleCallOnReturn { @@ -137,6 +138,11 @@ pub fn is_main() -> bool { *IS_MAIN } +#[inline] +pub fn is_cm() -> bool { + *IS_CM +} + // Is server logic running. #[inline] pub fn is_server_running() -> bool { diff --git a/src/core_main.rs b/src/core_main.rs index 375b1dbc5..6cf3b9d02 100644 --- a/src/core_main.rs +++ b/src/core_main.rs @@ -477,7 +477,10 @@ pub fn core_main() -> Option> { } else if args[0] == "--cm-no-ui" { #[cfg(feature = "flutter")] #[cfg(not(any(target_os = "android", target_os = "ios", target_os = "windows")))] - crate::flutter::connection_manager::start_cm_no_ui(); + { + crate::ui_interface::start_option_status_sync(); + crate::flutter::connection_manager::start_cm_no_ui(); + } return None; } else { #[cfg(all(feature = "flutter", feature = "plugin_framework"))] diff --git a/src/ui_cm_interface.rs b/src/ui_cm_interface.rs index f1748112e..c9b46ff1f 100644 --- a/src/ui_cm_interface.rs +++ b/src/ui_cm_interface.rs @@ -625,7 +625,6 @@ pub async fn start_ipc(cm: ConnectionManager) { OPTION_ENABLE_FILE_TRANSFER, &Config::get_option(OPTION_ENABLE_FILE_TRANSFER), )); - match ipc::new_listener("_cm").await { Ok(mut incoming) => { while let Some(result) = incoming.next().await { @@ -647,7 +646,7 @@ pub async fn start_ipc(cm: ConnectionManager) { log::error!("Failed to start cm ipc server: {}", err); } } - crate::platform::quit_gui(); + quit_cm(); } #[cfg(target_os = "android")] @@ -1042,3 +1041,11 @@ pub fn close_voice_call(id: i32) { allow_err!(client.tx.send(Data::CloseVoiceCall("".to_owned()))); }; } + +#[cfg(not(any(target_os = "android", target_os = "ios")))] +pub fn quit_cm() { + // in case of std::process::exit not work + log::info!("quit cm"); + CLIENTS.write().unwrap().clear(); + crate::platform::quit_gui(); +} diff --git a/src/ui_interface.rs b/src/ui_interface.rs index aad968bb4..ad2db6d01 100644 --- a/src/ui_interface.rs +++ b/src/ui_interface.rs @@ -1138,6 +1138,7 @@ async fn check_connect_status_(reconnect: bool, rx: mpsc::UnboundedReceiver { log::error!("ipc connection closed: {}", err); + if is_cm { + crate::ui_cm_interface::quit_cm(); + } break; } #[cfg(not(any(target_os = "android", target_os = "ios")))]