properly reset terminal when quitting/crashing

This commit is contained in:
rabite 2019-04-13 17:51:09 +02:00
parent 84d53f6afa
commit 4c1f7e88a4
3 changed files with 26 additions and 7 deletions

View File

@ -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();

View File

@ -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);
}

View File

@ -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();