summaryrefslogtreecommitdiffstats
path: root/src/main.rs
diff options
context:
space:
mode:
authorrabite <rabite@posteo.de>2019-04-13 17:51:09 +0200
committerrabite <rabite@posteo.de>2019-04-13 17:52:20 +0200
commit4c1f7e88a4eed75485209f18da04136635aa3909 (patch)
treec83d72b9c7f8059a904336536a4a349f1a3a84ec /src/main.rs
parent84d53f6afa08188037b93a5dc8d9e780a6fcd45f (diff)
properly reset terminal when quitting/crashing
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs29
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);
}