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:
@@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user