mirror of
https://github.com/bobwen-dev/hunter
synced 2025-04-12 00:55:41 +02:00
properly reset terminal when quitting/crashing
This commit is contained in:
parent
84d53f6afa
commit
4c1f7e88a4
@ -402,11 +402,13 @@ impl FileBrowser {
|
|||||||
|
|
||||||
} else {
|
} else {
|
||||||
self.core.get_sender().send(Events::InputEnabled(false))?;
|
self.core.get_sender().send(Events::InputEnabled(false))?;
|
||||||
|
self.core.screen.drop_screen();
|
||||||
|
|
||||||
let status = std::process::Command::new("rifle")
|
let status = std::process::Command::new("rifle")
|
||||||
.args(file.path.file_name())
|
.args(file.path.file_name())
|
||||||
.status();
|
.status();
|
||||||
|
|
||||||
|
self.core.screen.reset_screen();
|
||||||
self.clear().log();
|
self.clear().log();
|
||||||
self.core.screen.cursor_hide().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 failure::Fail;
|
||||||
|
|
||||||
use std::io::Write;
|
use std::io::Write;
|
||||||
|
use std::panic;
|
||||||
|
|
||||||
mod coordinates;
|
mod coordinates;
|
||||||
mod file_browser;
|
mod file_browser;
|
||||||
@ -61,20 +62,36 @@ use file_browser::FileBrowser;
|
|||||||
use tabview::TabView;
|
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<()> {
|
fn main() -> HResult<()> {
|
||||||
// do this early so it might be ready when needed
|
// do this early so it might be ready when needed
|
||||||
crate::files::load_tags().ok();
|
crate::files::load_tags().ok();
|
||||||
|
|
||||||
let mut core = WidgetCore::new().expect("Can't create WidgetCore!");
|
let mut core = WidgetCore::new().expect("Can't create WidgetCore!");
|
||||||
|
|
||||||
|
// Resets terminal when hunter crashes :(
|
||||||
|
die_gracefully(&mut core);
|
||||||
|
|
||||||
match run(core.clone()) {
|
match run(core.clone()) {
|
||||||
Ok(_) => Ok(()),
|
Ok(_) => drop_screen(&mut core),
|
||||||
Err(HError::Quit) => {
|
Err(HError::Quit) => drop_screen(&mut core),
|
||||||
core.screen.drop_screen();
|
|
||||||
return Ok(())
|
|
||||||
},
|
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
core.screen.drop_screen();
|
drop_screen(&mut core)?;
|
||||||
eprintln!("{:?}\n{:?}", err, err.cause());
|
eprintln!("{:?}\n{:?}", err, err.cause());
|
||||||
return Err(err);
|
return Err(err);
|
||||||
}
|
}
|
||||||
|
@ -37,7 +37,7 @@ impl Screen {
|
|||||||
pub fn drop_screen(&mut self) {
|
pub fn drop_screen(&mut self) {
|
||||||
self.cursor_show().log();
|
self.cursor_show().log();
|
||||||
self.to_main_screen().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?
|
// Terminal stays fucked without this. Why?
|
||||||
Ok(std::process::Command::new("reset").arg("-I").spawn()).log();
|
Ok(std::process::Command::new("reset").arg("-I").spawn()).log();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user