@@ -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− .context("build signal handler")?;
241+ .context("build signal handler")?;
237 let app = Self {
243 let app = Self {
238 compositor,
244 compositor,
@@ -318,7 +324,9 @@ impl Application {
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 {
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 {
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 {
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;
512+ signal::SIGTERM | signal::SIGINT => {
513+ self.restore_term().unwrap();
502 _ => unreachable!(),
516 _ => unreachable!(),
506 pub async fn handle_idle_timeout(&mut self) {
522 pub async fn handle_idle_timeout(&mut self) {