use libc::{termios, winsize}; pub fn size() -> Option { unsafe { let mut window: winsize = std::mem::zeroed(); if libc::ioctl(1, libc::TIOCGWINSZ, &mut window) < 0 { return None; } return Some(window); } } fn get_attr() -> Option { unsafe { let mut attr: termios = std::mem::zeroed(); if libc::tcgetattr(1, &mut attr) < 0 { return None; } return Some(attr); } } fn set_attr(attrs: &termios) -> Option<()> { unsafe { if libc::tcsetattr(1, libc::TCSANOW, attrs) < 0 { return None; } return Some(()); } } fn make_raw() -> termios { unsafe { let mut attr: termios = std::mem::zeroed(); libc::cfmakeraw(&mut attr); return attr; } } pub struct RawHandle { old: termios, } impl Drop for RawHandle { fn drop(&mut self) { set_attr(&self.old); } } pub fn raw() -> Option { let old = match get_attr() { Some(old) => old, None => { return None; } }; if let None = set_attr(&make_raw()) { return None; } return Some(RawHandle { old: old }); }