From e910608805bb52b52bb0bb63267ccf58d0440e7d Mon Sep 17 00:00:00 2001 From: mars Date: Fri, 14 Apr 2023 21:25:42 -0400 Subject: [PATCH] Add panic handler hook to exit alternative screen and raw mode --- src/main.rs | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index 6b48f45..06860f7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -21,7 +21,7 @@ use std::{ env::args, ffi::OsString, fs::{File, OpenOptions}, - io::{stdout, Read, Stdout, Write}, + io::{Read, Stdout, Write}, os::fd::FromRawFd, path::{Path, PathBuf}, sync::Arc, @@ -459,11 +459,28 @@ fn main() -> Result<()> { }); let state = State::from_str(file_name, &text)?; - let mut stdout = stdout(); + + // begin to enter alternate screen + let mut stdout = std::io::stdout(); terminal::enable_raw_mode()?; stdout.queue(terminal::EnterAlternateScreen)?; + + // register a panic handler to exit the alternate screen + let old_panic_handler = std::panic::take_hook(); + std::panic::set_hook(Box::new(move |info| { + let mut stdout = std::io::stdout(); + let _ = stdout.queue(terminal::LeaveAlternateScreen); + let _ = terminal::disable_raw_mode(); + let _ = stdout.flush(); + old_panic_handler(info) + })); + + // run inner event loop let result = screen_main(&mut stdout, state); + + // exit alternate screen stdout.queue(terminal::LeaveAlternateScreen)?; terminal::disable_raw_mode()?; + result }