@@ -231,8 +231,14 @@ impl Application {
231231 #[cfg(windows)]
232232 let signals = futures_util::stream::empty();
233233 #[cfg(not(windows))]
234− let signals = Signals::new([signal::SIGTSTP, signal::SIGCONT, signal::SIGUSR1])
235− .context("build signal handler")?;
234+ let signals = Signals::new([
235+ signal::SIGTSTP,
236+ signal::SIGCONT,
237+ signal::SIGUSR1,
238+ signal::SIGTERM,
239+ signal::SIGINT,
240+ ])
241+ .context("build signal handler")?;
236242
237243 let app = Self {
238244 compositor,
@@ -318,7 +324,9 @@ impl Application {
318324 biased;
319325
320326 Some(signal) = self.signals.next() => {
321− self.handle_signals(signal).await;
327+ if !self.handle_signals(signal).await {
328+ return false;
329+ };
322330 }
323331 Some(event) = input_stream.next() => {
324332 self.handle_terminal_events(event).await;
@@ -442,10 +450,12 @@ impl Application {
442450
443451 #[cfg(windows)]
444452 // 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+ }
446456
447457 #[cfg(not(windows))]
448− pub async fn handle_signals(&mut self, signal: i32) {
458+ pub async fn handle_signals(&mut self, signal: i32) -> bool {
449459 match signal {
450460 signal::SIGTSTP => {
451461 self.restore_term().unwrap();
@@ -499,8 +509,14 @@ impl Application {
499509 self.refresh_config();
500510 self.render().await;
501511 }
512+ signal::SIGTERM | signal::SIGINT => {
513+ self.restore_term().unwrap();
514+ return false;
515+ }
502516 _ => unreachable!(),
503517 }
518+
519+ true
504520 }
505521
506522 pub async fn handle_idle_timeout(&mut self) {