1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
use crossterm::event::{read, Event, KeyEvent, KeyCode, KeyModifiers};
use crossterm::terminal;
use crate::types::ErrBox;

pub fn get_terminal_width() -> Option<u16> {
    get_terminal_size().map(|(cols, _)| cols)
}

/// Gets the terminal size (width/cols, height/rows).
pub fn get_terminal_size() -> Option<(u16, u16)> {
    match crossterm::terminal::size() {
        Ok(size) => Some(size),
        Err(_) => None,
    }
}

pub(crate) fn read_terminal_event() -> Result<Event, ErrBox> {
    // https://github.com/crossterm-rs/crossterm/issues/521
    terminal::enable_raw_mode()?;
    let result = read();
    terminal::disable_raw_mode()?;
    match result {
        Ok(Event::Key(KeyEvent {
            code: KeyCode::Char('c'),
            modifiers: KeyModifiers::CONTROL
        })) => Ok(Event::Key(KeyEvent {
            code: KeyCode::Esc,
            modifiers: KeyModifiers::NONE,
        })),
        _ => Ok(result?),
    }
}