diff options
author | Michael Davis | 2023-06-05 13:27:57 +0000 |
---|---|---|
committer | GitHub | 2023-06-05 13:27:57 +0000 |
commit | 428d33ab504cea9b66404356c6fe12fbbdc4db7d (patch) | |
tree | 537b6d4ec1e4bae944dc0a0b52ea25cd872dc5b8 /helix-term/src | |
parent | d5707a4696af0c63ec350791501440e7d0adc036 (diff) |
Exit gracefully on termination signals (#7236)
Diffstat (limited to 'helix-term/src')
-rw-r--r-- | helix-term/src/application.rs | 26 |
1 files 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) { |