mirror of https://github.com/bobwen-dev/hunter
properly reset terminal when quitting/crashing
This commit is contained in:
parent
84d53f6afa
commit
4c1f7e88a4
|
@ -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();
|
||||
|
||||
|
|
29
src/main.rs
29
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);
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in New Issue