trix-player 1.0.0

A beautiful, keyboard-driven terminal music player for Linux.
Documentation
use std::io::{self, Write};

use anyhow::{Context, Result};
use crossterm::{cursor, terminal};
use ratatui::{backend::CrosstermBackend, Terminal};

pub(crate) type AppTerminal = Terminal<CrosstermBackend<io::Stdout>>;

pub(crate) mod shell;
pub(crate) use shell::hide_to_shell_toggleable;

pub(crate) fn init_terminal() -> Result<AppTerminal> {
    terminal::enable_raw_mode().context("enable raw mode")?;
    let mut stdout = io::stdout();
    crossterm::execute!(stdout, terminal::EnterAlternateScreen, cursor::Hide)
        .context("enter alternate screen")?;

    let backend = CrosstermBackend::new(stdout);
    let mut terminal = Terminal::new(backend).context("create terminal")?;
    terminal.clear().ok();
    Ok(terminal)
}

fn restore_terminal_minimal() {
    let _ = terminal::disable_raw_mode();
    let mut stdout = io::stdout();
    let _ = crossterm::execute!(stdout, terminal::LeaveAlternateScreen, cursor::Show);
    let _ = stdout.flush();
}

pub(crate) struct TerminalCleanup;

impl TerminalCleanup {
    pub(crate) fn install_panic_hook() {
        let default_hook = std::panic::take_hook();
        std::panic::set_hook(Box::new(move |info| {
            restore_terminal_minimal();
            default_hook(info);
        }));
    }
}

impl Drop for TerminalCleanup {
    fn drop(&mut self) {
        restore_terminal_minimal();
    }
}