Skip to main content

cinder/tui/
terminal.rs

1//! Crossterm / ratatui terminal setup and teardown.
2
3use std::io::{self, Stdout};
4
5use crossterm::terminal::{
6    disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen,
7};
8use crossterm::{cursor, execute};
9use ratatui::backend::CrosstermBackend;
10use ratatui::Terminal;
11
12pub type TuiTerminal = Terminal<CrosstermBackend<Stdout>>;
13
14pub fn setup_terminal() -> io::Result<TuiTerminal> {
15    enable_raw_mode()?;
16    let mut stdout = io::stdout();
17    if let Err(err) = execute!(stdout, EnterAlternateScreen, cursor::Hide) {
18        let _ = disable_raw_mode();
19        return Err(err);
20    }
21
22    match Terminal::new(CrosstermBackend::new(stdout)) {
23        Ok(terminal) => Ok(terminal),
24        Err(err) => {
25            let _ = execute!(io::stdout(), LeaveAlternateScreen, cursor::Show);
26            let _ = disable_raw_mode();
27            Err(err)
28        }
29    }
30}
31
32pub fn restore_terminal(terminal: &mut TuiTerminal) {
33    let _ = disable_raw_mode();
34    let _ = execute!(terminal.backend_mut(), LeaveAlternateScreen, cursor::Show);
35}
36
37/// Best-effort terminal restore without access to the Terminal handle.
38/// Called from `app::run` on shutdown.
39pub fn cleanup_terminal() {
40    let _ = disable_raw_mode();
41    let _ = execute!(io::stdout(), LeaveAlternateScreen, cursor::Show);
42}