diff options
author | rabite <rabite@posteo.de> | 2019-04-13 17:51:09 +0200 |
---|---|---|
committer | rabite <rabite@posteo.de> | 2019-04-13 17:52:20 +0200 |
commit | 4c1f7e88a4eed75485209f18da04136635aa3909 (patch) | |
tree | c83d72b9c7f8059a904336536a4a349f1a3a84ec /src/main.rs | |
parent | 84d53f6afa08188037b93a5dc8d9e780a6fcd45f (diff) |
properly reset terminal when quitting/crashing
Diffstat (limited to 'src/main.rs')
-rw-r--r-- | src/main.rs | 29 |
1 files changed, 23 insertions, 6 deletions
diff --git a/src/main.rs b/src/main.rs index 4a899ff..d91c078 100644 --- a/src/main.rs +++ b/src/main.rs @@ -26,6 +26,7 @@ extern crate systemstat; use failure::Fail; use std::io::Write; +use std::panic; mod coordinates; mod file_browser; @@ -61,20 +62,36 @@ use file_browser::FileBrowser; use tabview::TabView; +fn drop_screen(core: &mut WidgetCore) -> HResult<()> { + core.screen.drop_screen(); + Ok(()) +} + +fn die_gracefully(core: &WidgetCore) { + let panic_hook = panic::take_hook(); + let core = core.clone(); + + panic::set_hook(Box::new(move |info| { + let mut core = core.clone(); + drop_screen(&mut core).ok(); + panic_hook(info); + })); +} + fn main() -> HResult<()> { // do this early so it might be ready when needed crate::files::load_tags().ok(); let mut core = WidgetCore::new().expect("Can't create WidgetCore!"); + // Resets terminal when hunter crashes :( + die_gracefully(&mut core); + match run(core.clone()) { - Ok(_) => Ok(()), - Err(HError::Quit) => { - core.screen.drop_screen(); - return Ok(()) - }, + Ok(_) => drop_screen(&mut core), + Err(HError::Quit) => drop_screen(&mut core), Err(err) => { - core.screen.drop_screen(); + drop_screen(&mut core)?; eprintln!("{:?}\n{:?}", err, err.cause()); return Err(err); } |