From 1b1aa97be4eb883ab8f3b7b27eb8396eafc60b1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Orhun=20Parmaks=C4=B1z?= Date: Thu, 14 Sep 2023 18:51:34 +0300 Subject: [PATCH] feat(tui): add a panic hook to reset terminal upon panic (#112) --- systeroid-tui/src/main.rs | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) 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) => {