use std::mem;
use libc::*;
pub struct Terminal {
previous: libc::termios
}
impl Terminal {
pub fn get_size(&self) -> (u16, u16) {
let mut win_size = winsize { ws_row: 0, ws_col: 0, ws_xpixel: 0, ws_ypixel: 0 };
unsafe {
ioctl(STDOUT_FILENO, TIOCGWINSZ, &mut win_size);
}
(win_size.ws_col, win_size.ws_row)
}
}
impl Default for Terminal {
fn default() -> Terminal {
raw()
}
}
impl Drop for Terminal {
fn drop(&mut self) {
drop(self.previous);
}
}
pub fn drop(termios: libc::termios) {
print!("\x1b[?1049l\x1b[?7h");
unsafe {
libc::tcsetattr(libc::STDIN_FILENO, libc::TCSAFLUSH, &termios);
}
}
pub fn raw() -> Terminal {
let mut previous;
unsafe {
previous = mem::zeroed();
libc::tcgetattr(libc::STDIN_FILENO, &mut previous);
}
let mut new = previous;
new.c_iflag &= !(BRKINT | ICRNL | INPCK | ISTRIP | IXON);
new.c_oflag &= !OPOST;
new.c_lflag &= !(ECHO | ICANON | IEXTEN | ISIG);
new.c_cc[VMIN] = 0;
new.c_cc[VTIME] = 1;
unsafe {
libc::tcsetattr(libc::STDIN_FILENO, libc::TCSAFLUSH, &new);
}
print!("\x1b[?1049h\x1b[?7l");
Terminal { previous }
}