Add panic handler hook to exit alternative screen and raw mode
This commit is contained in:
parent
b2b69bf7b3
commit
e910608805
21
src/main.rs
21
src/main.rs
|
@ -21,7 +21,7 @@ use std::{
|
||||||
env::args,
|
env::args,
|
||||||
ffi::OsString,
|
ffi::OsString,
|
||||||
fs::{File, OpenOptions},
|
fs::{File, OpenOptions},
|
||||||
io::{stdout, Read, Stdout, Write},
|
io::{Read, Stdout, Write},
|
||||||
os::fd::FromRawFd,
|
os::fd::FromRawFd,
|
||||||
path::{Path, PathBuf},
|
path::{Path, PathBuf},
|
||||||
sync::Arc,
|
sync::Arc,
|
||||||
|
@ -459,11 +459,28 @@ fn main() -> Result<()> {
|
||||||
});
|
});
|
||||||
|
|
||||||
let state = State::from_str(file_name, &text)?;
|
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()?;
|
terminal::enable_raw_mode()?;
|
||||||
stdout.queue(terminal::EnterAlternateScreen)?;
|
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);
|
let result = screen_main(&mut stdout, state);
|
||||||
|
|
||||||
|
// exit alternate screen
|
||||||
stdout.queue(terminal::LeaveAlternateScreen)?;
|
stdout.queue(terminal::LeaveAlternateScreen)?;
|
||||||
terminal::disable_raw_mode()?;
|
terminal::disable_raw_mode()?;
|
||||||
|
|
||||||
result
|
result
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue