fix: crash on resize (#1683)

Without this, resizing the terminal prints "Error: The cursor position
could not be read within a normal duration" and quits the app.
This commit is contained in:
Jeremy Rose
2025-07-25 14:23:38 -07:00
committed by GitHub
parent 75b4008094
commit c66c99c5b5

View File

@@ -88,7 +88,15 @@ impl App<'_> {
{ {
let app_event_tx = app_event_tx.clone(); let app_event_tx = app_event_tx.clone();
std::thread::spawn(move || { std::thread::spawn(move || {
while let Ok(event) = crossterm::event::read() { loop {
// This timeout is necessary to avoid holding the event lock
// that crossterm::event::read() acquires. In particular,
// reading the cursor position (crossterm::cursor::position())
// needs to acquire the event lock, and so will fail if it
// can't acquire it within 2 sec. Resizing the terminal
// crashes the app if the cursor position can't be read.
if let Ok(true) = crossterm::event::poll(Duration::from_millis(100)) {
if let Ok(event) = crossterm::event::read() {
match event { match event {
crossterm::event::Event::Key(key_event) => { crossterm::event::Event::Key(key_event) => {
app_event_tx.send(AppEvent::KeyEvent(key_event)); app_event_tx.send(AppEvent::KeyEvent(key_event));
@@ -123,6 +131,10 @@ impl App<'_> {
} }
} }
} }
} else {
// Timeout expired, no `Event` is available
}
}
}); });
} }