Skip to content

Commit

Permalink
Add panic hook to not mess terminal upon panic (#13)
Browse files Browse the repository at this point in the history
* Adds panic hook to not mess terminal upon panic.

* Define a reset function for the panic hook

---------

Co-authored-by: Orhun Parmaksız <[email protected]>
  • Loading branch information
KarlHeitmann and orhun committed Aug 9, 2023
1 parent 33bde3d commit 44cb4d3
Showing 1 changed file with 21 additions and 2 deletions.
23 changes: 21 additions & 2 deletions src/tui.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ use crate::ui;
use crossterm::event::{DisableMouseCapture, EnableMouseCapture};
use crossterm::terminal::{self, EnterAlternateScreen, LeaveAlternateScreen};
use std::io;
use std::panic;
use tui::backend::Backend;
use tui::Terminal;

Expand Down Expand Up @@ -31,6 +32,15 @@ impl<B: Backend> Tui<B> {
pub fn init(&mut self) -> AppResult<()> {
terminal::enable_raw_mode()?;
crossterm::execute!(io::stderr(), EnterAlternateScreen, EnableMouseCapture)?;

// Define a custom panic hook to reset the terminal properties.
// This way, you won't have your terminal messed up if an unexpected error happens.
let panic_hook = panic::take_hook();
panic::set_hook(Box::new(move |panic| {
Self::reset().expect("failed to reset the terminal");
panic_hook(panic);
}));

self.terminal.hide_cursor()?;
self.terminal.clear()?;
Ok(())
Expand All @@ -45,12 +55,21 @@ impl<B: Backend> Tui<B> {
Ok(())
}

/// Resets the terminal interface.
///
/// This function is also used for the panic hook to revert
/// the terminal properties if unexpected errors occur.
fn reset() -> AppResult<()> {
terminal::disable_raw_mode()?;
crossterm::execute!(io::stdout(), LeaveAlternateScreen, DisableMouseCapture)?;
Ok(())
}

/// Exits the terminal interface.
///
/// It disables the raw mode and reverts back the terminal properties.
pub fn exit(&mut self) -> AppResult<()> {
terminal::disable_raw_mode()?;
crossterm::execute!(io::stderr(), LeaveAlternateScreen, DisableMouseCapture)?;
Self::reset()?;
self.terminal.show_cursor()?;
Ok(())
}
Expand Down

0 comments on commit 44cb4d3

Please sign in to comment.