Fix terminal not restoring properly on exit

Ensure disable_raw_mode and LeaveAlternateScreen run even when the
app returns an error. Also add a panic hook to restore the terminal
on unexpected panics.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Shautvast 2026-02-18 09:03:04 +01:00
parent 0eda9045cd
commit df9d67a7c9

View file

@ -13,6 +13,14 @@ use ratatui::{
fn main() -> io::Result<()> { fn main() -> io::Result<()> {
let config = Config::load().unwrap(); let config = Config::load().unwrap();
// Restore terminal on panic
let default_hook = std::panic::take_hook();
std::panic::set_hook(Box::new(move |info| {
let _ = disable_raw_mode();
let _ = execute!(io::stdout(), LeaveAlternateScreen);
default_hook(info);
}));
// --- Setup terminal --- // --- Setup terminal ---
let mut stdout = io::stdout(); let mut stdout = io::stdout();
execute!(stdout, EnterAlternateScreen)?; execute!(stdout, EnterAlternateScreen)?;
@ -21,12 +29,12 @@ fn main() -> io::Result<()> {
let backend = CrosstermBackend::new(stdout); let backend = CrosstermBackend::new(stdout);
let mut terminal = Terminal::new(backend)?; let mut terminal = Terminal::new(backend)?;
skim::main(&config, &mut terminal)?; let result = skim::main(&config, &mut terminal);
// --- Restore terminal --- // --- Restore terminal (always, even on error) ---
disable_raw_mode()?; disable_raw_mode()?;
execute!(terminal.backend_mut(), LeaveAlternateScreen)?; execute!(terminal.backend_mut(), LeaveAlternateScreen)?;
terminal.show_cursor()?; terminal.show_cursor()?;
Ok(()) result
} }