From 73a0d7fc13447c5c37c09c7dd95ce25e681769f8 Mon Sep 17 00:00:00 2001 From: Alastair Scheuermann Date: Thu, 18 Jun 2026 15:40:44 -0600 Subject: [PATCH] fix: don't quit yazi when blocking child takes the TTY --- yazi-term/src/source/unix.rs | 2 +- yazi-term/src/stream/stream.rs | 1 + yazi-tui/src/raterm.rs | 22 ++++++++++++++-------- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/yazi-term/src/source/unix.rs b/yazi-term/src/source/unix.rs index eb341ab4..7e7f94a3 100644 --- a/yazi-term/src/source/unix.rs +++ b/yazi-term/src/source/unix.rs @@ -49,7 +49,7 @@ impl<'a> EventSource<'a> { // Stop waiting for events. if wakeup_ready { while read_complete(&*self.waker, &mut [0u8; 1024])? != 0 {} - return Err(io::Error::from(io::ErrorKind::UnexpectedEof)); + return Err(io::Error::from(io::ErrorKind::ConnectionAborted)); } // More input is ready. diff --git a/yazi-term/src/stream/stream.rs b/yazi-term/src/stream/stream.rs index 69f699a7..adf21d2d 100644 --- a/yazi-term/src/stream/stream.rs +++ b/yazi-term/src/stream/stream.rs @@ -33,6 +33,7 @@ impl EventStream { } // try_poll() already handles Interrupted, this is defensive. Err(e) if e.kind() == io::ErrorKind::Interrupted => continue, + Err(e) if e.kind() == io::ErrorKind::ConnectionAborted => break, Err(e) => { tx.send(Err(e)).ok(); break; diff --git a/yazi-tui/src/raterm.rs b/yazi-tui/src/raterm.rs index c50cc013..dcdd97b9 100644 --- a/yazi-tui/src/raterm.rs +++ b/yazi-tui/src/raterm.rs @@ -97,16 +97,22 @@ impl Raterm { let mut rx = self.stream.take().unwrap(); tokio::spawn(async move { - while let Some(Ok(event)) = rx.recv().await { - match event { - Event::Key(key) if key.kind != KeyEventKind::Press => continue, - Event::Mouse(mouse) if !YAZI.mgr.mouse_events.get().contains(mouse.kind.into()) => { - continue; - } - _ => yazi_shared::event::Event::Term(event).emit(), + loop { + match rx.recv().await { + Some(Ok(event)) => match event { + Event::Key(key) if key.kind != KeyEventKind::Press => continue, + Event::Mouse(mouse) if !YAZI.mgr.mouse_events.get().contains(mouse.kind.into()) => { + continue; + } + _ => yazi_shared::event::Event::Term(event).emit(), + }, + Some(Err(_)) => { + AppProxy::quit(Default::default()); + break; + }, + None => break, } } - AppProxy::quit(Default::default()); }); }