Add panic handler hook to exit alternative screen and raw mode

This commit is contained in:
mars 2023-04-14 21:25:42 -04:00
parent b2b69bf7b3
commit e910608805
1 changed files with 19 additions and 2 deletions

View File

@ -21,7 +21,7 @@ use std::{
env::args,
ffi::OsString,
fs::{File, OpenOptions},
io::{stdout, Read, Stdout, Write},
io::{Read, Stdout, Write},
os::fd::FromRawFd,
path::{Path, PathBuf},
sync::Arc,
@ -459,11 +459,28 @@ fn main() -> Result<()> {
});
let state = State::from_str(file_name, &text)?;
let mut stdout = stdout();
// begin to enter alternate screen
let mut stdout = std::io::stdout();
terminal::enable_raw_mode()?;
stdout.queue(terminal::EnterAlternateScreen)?;
// register a panic handler to exit the alternate screen
let old_panic_handler = std::panic::take_hook();
std::panic::set_hook(Box::new(move |info| {
let mut stdout = std::io::stdout();
let _ = stdout.queue(terminal::LeaveAlternateScreen);
let _ = terminal::disable_raw_mode();
let _ = stdout.flush();
old_panic_handler(info)
}));
// run inner event loop
let result = screen_main(&mut stdout, state);
// exit alternate screen
stdout.queue(terminal::LeaveAlternateScreen)?;
terminal::disable_raw_mode()?;
result
}