on master help sign in
Exit gracefully on termination signals (#7236)
428d33aMichael Davis
helix-term/src/application.rs+21−5
@@ -231,8 +231,14 @@ impl Application {
231 #[cfg(windows)]
231 #[cfg(windows)]
232 let signals = futures_util::stream::empty();
232 let signals = futures_util::stream::empty();
233 #[cfg(not(windows))]
233 #[cfg(not(windows))]
234− let signals = Signals::new([signal::SIGTSTP, signal::SIGCONT, signal::SIGUSR1])
234+ let signals = Signals::new([
235+ signal::SIGTSTP,
236+ signal::SIGCONT,
237+ signal::SIGUSR1,
238+ signal::SIGTERM,
239+ signal::SIGINT,
240+ ])
235− .context("build signal handler")?;
241+ .context("build signal handler")?;
236
242
237 let app = Self {
243 let app = Self {
238 compositor,
244 compositor,
@@ -318,7 +324,9 @@ impl Application {
318 biased;
324 biased;
319
325
320 Some(signal) = self.signals.next() => {
326 Some(signal) = self.signals.next() => {
321− self.handle_signals(signal).await;
327+ if !self.handle_signals(signal).await {
328+ return false;
329+ };
322 }
330 }
323 Some(event) = input_stream.next() => {
331 Some(event) = input_stream.next() => {
324 self.handle_terminal_events(event).await;
332 self.handle_terminal_events(event).await;
@@ -442,10 +450,12 @@ impl Application {
442
450
443 #[cfg(windows)]
451 #[cfg(windows)]
444 // no signal handling available on windows
452 // no signal handling available on windows
445− pub async fn handle_signals(&mut self, _signal: ()) {}
453+ pub async fn handle_signals(&mut self, _signal: ()) -> bool {
454+ true
455+ }
446
456
447 #[cfg(not(windows))]
457 #[cfg(not(windows))]
448− pub async fn handle_signals(&mut self, signal: i32) {
458+ pub async fn handle_signals(&mut self, signal: i32) -> bool {
449 match signal {
459 match signal {
450 signal::SIGTSTP => {
460 signal::SIGTSTP => {
451 self.restore_term().unwrap();
461 self.restore_term().unwrap();
@@ -499,8 +509,14 @@ impl Application {
499 self.refresh_config();
509 self.refresh_config();
500 self.render().await;
510 self.render().await;
501 }
511 }
512+ signal::SIGTERM | signal::SIGINT => {
513+ self.restore_term().unwrap();
514+ return false;
515+ }
502 _ => unreachable!(),
516 _ => unreachable!(),
503 }
517 }
518+
519+ true
504 }
520 }
505
521
506 pub async fn handle_idle_timeout(&mut self) {
522 pub async fn handle_idle_timeout(&mut self) {