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 anyhow::Result;
|
||||
use std::process::ExitStatus;
|
||||
use thiserror::Error;
|
||||
|
||||
use crate::cli::util::CommandExt;
|
||||
|
@ -31,8 +32,7 @@ pub fn launch_daemon(paths_overrides: &PathsOverrides) -> Result<()> {
|
|||
command.args(&["daemon"]);
|
||||
command.with_paths_overrides(paths_overrides);
|
||||
|
||||
let mut child = command.spawn()?;
|
||||
let result = child.wait()?;
|
||||
let result = spawn_and_wait(command)?;
|
||||
|
||||
if result.success() {
|
||||
Ok(())
|
||||
|
@ -46,3 +46,33 @@ pub enum DaemonError {
|
|||
#[error("unexpected error, 'espanso daemon' returned a non-zero exit code.")]
|
||||
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