diff --git a/src/file_browser.rs b/src/file_browser.rs index dc24fa8..af700a8 100644 --- a/src/file_browser.rs +++ b/src/file_browser.rs @@ -402,11 +402,13 @@ impl FileBrowser { } else { self.core.get_sender().send(Events::InputEnabled(false))?; + self.core.screen.drop_screen(); let status = std::process::Command::new("rifle") .args(file.path.file_name()) .status(); + self.core.screen.reset_screen(); self.clear().log(); self.core.screen.cursor_hide().log(); 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); } diff --git a/src/term.rs b/src/term.rs index b55734d..4d9d228 100644 --- a/src/term.rs +++ b/src/term.rs @@ -37,7 +37,7 @@ impl Screen { pub fn drop_screen(&mut self) { self.cursor_show().log(); self.to_main_screen().log(); - self.screen = Arc::new(Mutex::new(None)); + self.screen.lock().map(|mut screen| std::mem::drop(screen.take())).ok(); // Terminal stays fucked without this. Why? Ok(std::process::Command::new("reset").arg("-I").spawn()).log();