summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOrhun Parmaksız <orhunparmaksiz@gmail.com>2023-09-14 18:51:34 +0300
committerOrhun Parmaksız <orhunparmaksiz@gmail.com>2023-09-14 18:51:49 +0300
commit1b1aa97be4eb883ab8f3b7b27eb8396eafc60b1a (patch)
treeff7c676f5e7cc67da170081d6d35b0345ae473db
parent3f862ffcddc0449fab72867e10ce80c956965c11 (diff)
feat(tui): add a panic hook to reset terminal upon panic (#112)
-rw-r--r--systeroid-tui/src/main.rs21
1 files changed, 20 insertions, 1 deletions
diff --git a/systeroid-tui/src/main.rs b/systeroid-tui/src/main.rs
index 0e9403e..55a1dcd 100644
--- a/systeroid-tui/src/main.rs
+++ b/systeroid-tui/src/main.rs
@@ -1,6 +1,7 @@
use ratatui::backend::TermionBackend;
use std::env;
-use std::io;
+use std::io::{self, Write};
+use std::panic;
use std::process;
use systeroid_tui::args::Args;
use systeroid_tui::error::Result;
@@ -15,6 +16,24 @@ fn main() -> Result<()> {
let output = MouseTerminal::from(output);
let output = output.into_alternate_screen()?;
let backend = TermionBackend::new(output);
+ let panic_hook = panic::take_hook();
+ panic::set_hook(Box::new(move |panic| {
+ let panic_cleanup = || -> Result<()> {
+ let mut output = io::stderr();
+ write!(
+ output,
+ "{}{}{}",
+ termion::clear::All,
+ termion::screen::ToMainScreen,
+ termion::cursor::Show
+ )?;
+ output.into_raw_mode()?.suspend_raw_mode()?;
+ io::stderr().flush()?;
+ Ok(())
+ };
+ panic_cleanup().expect("failed to clean up for panic");
+ panic_hook(panic);
+ }));
match systeroid_tui::run(args, backend) {
Ok(_) => process::exit(0),
Err(e) => {