From 428d33ab504cea9b66404356c6fe12fbbdc4db7d Mon Sep 17 00:00:00 2001 From: Michael Davis Date: Mon, 5 Jun 2023 08:27:57 -0500 Subject: Exit gracefully on termination signals (#7236) --- helix-term/src/application.rs | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/helix-term/src/application.rs b/helix-term/src/application.rs index 0ea31413..7e968482 100644 --- a/helix-term/src/application.rs +++ b/helix-term/src/application.rs @@ -231,8 +231,14 @@ impl Application { #[cfg(windows)] let signals = futures_util::stream::empty(); #[cfg(not(windows))] - let signals = Signals::new([signal::SIGTSTP, signal::SIGCONT, signal::SIGUSR1]) - .context("build signal handler")?; + let signals = Signals::new([ + signal::SIGTSTP, + signal::SIGCONT, + signal::SIGUSR1, + signal::SIGTERM, + signal::SIGINT, + ]) + .context("build signal handler")?; let app = Self { compositor, @@ -318,7 +324,9 @@ impl Application { biased; Some(signal) = self.signals.next() => { - self.handle_signals(signal).await; + if !self.handle_signals(signal).await { + return false; + }; } Some(event) = input_stream.next() => { self.handle_terminal_events(event).await; @@ -442,10 +450,12 @@ impl Application { #[cfg(windows)] // no signal handling available on windows - pub async fn handle_signals(&mut self, _signal: ()) {} + pub async fn handle_signals(&mut self, _signal: ()) -> bool { + true + } #[cfg(not(windows))] - pub async fn handle_signals(&mut self, signal: i32) { + pub async fn handle_signals(&mut self, signal: i32) -> bool { match signal { signal::SIGTSTP => { self.restore_term().unwrap(); @@ -499,8 +509,14 @@ impl Application { self.refresh_config(); self.render().await; } + signal::SIGTERM | signal::SIGINT => { + self.restore_term().unwrap(); + return false; + } _ => unreachable!(), } + + true } pub async fn handle_idle_timeout(&mut self) { -- cgit v1.2.3-70-g09d2