fix(core): add workaround to prevent launcher process from appearing 'not responding' on macOS
This commit is contained in:
parent
806ac8112e
commit
82c05d6615
|
@ -20,6 +20,7 @@
|
||||||
use std::process::Command;
|
use std::process::Command;
|
||||||
|
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
|
use std::process::ExitStatus;
|
||||||
use thiserror::Error;
|
use thiserror::Error;
|
||||||
|
|
||||||
use crate::cli::util::CommandExt;
|
use crate::cli::util::CommandExt;
|
||||||
|
@ -31,8 +32,7 @@ pub fn launch_daemon(paths_overrides: &PathsOverrides) -> Result<()> {
|
||||||
command.args(&["daemon"]);
|
command.args(&["daemon"]);
|
||||||
command.with_paths_overrides(paths_overrides);
|
command.with_paths_overrides(paths_overrides);
|
||||||
|
|
||||||
let mut child = command.spawn()?;
|
let result = spawn_and_wait(command)?;
|
||||||
let result = child.wait()?;
|
|
||||||
|
|
||||||
if result.success() {
|
if result.success() {
|
||||||
Ok(())
|
Ok(())
|
||||||
|
@ -46,3 +46,33 @@ pub enum DaemonError {
|
||||||
#[error("unexpected error, 'espanso daemon' returned a non-zero exit code.")]
|
#[error("unexpected error, 'espanso daemon' returned a non-zero exit code.")]
|
||||||
NonZeroExitCode,
|
NonZeroExitCode,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(not(target_os = "macos"))]
|
||||||
|
fn spawn_and_wait(mut command: Command) -> Result<ExitStatus> {
|
||||||
|
let mut child = command.spawn()?;
|
||||||
|
Ok(child.wait()?)
|
||||||
|
}
|
||||||
|
|
||||||
|
// On macOS, if we simply wait for the daemon process to terminate, the application will
|
||||||
|
// appear as "Not Responding" after a few seconds, even though it's working correctly.
|
||||||
|
// To avoid this undesirable behavior, we spawn an headless eventloop so that the
|
||||||
|
// launcher looks "alive", while waiting for the daemon
|
||||||
|
#[cfg(target_os = "macos")]
|
||||||
|
fn spawn_and_wait(mut command: Command) -> Result<ExitStatus> {
|
||||||
|
let mut child = command.spawn()?;
|
||||||
|
|
||||||
|
let result = std::thread::Builder::new()
|
||||||
|
.name("daemon-monitor-thread".to_owned())
|
||||||
|
.spawn(move || {
|
||||||
|
let results = child.wait();
|
||||||
|
|
||||||
|
espanso_mac_utils::exit_headless_eventloop();
|
||||||
|
|
||||||
|
results
|
||||||
|
})?;
|
||||||
|
|
||||||
|
espanso_mac_utils::start_headless_eventloop();
|
||||||
|
|
||||||
|
let thread_result = result.join().expect("unable to join daemon-monitor-thread");
|
||||||
|
Ok(thread_result?)
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user