| use std::{io, mem}; |
| |
| use super::cvt; |
| use super::libc::{c_ushort, ioctl, STDOUT_FILENO}; |
| |
| #[repr(C)] |
| struct TermSize { |
| row: c_ushort, |
| col: c_ushort, |
| _x: c_ushort, |
| _y: c_ushort, |
| } |
| |
| #[cfg(target_os = "linux")] |
| pub const TIOCGWINSZ: usize = 0x00005413; |
| |
| #[cfg(not(target_os = "linux"))] |
| pub const TIOCGWINSZ: usize = 0x40087468; |
| |
| // Since attributes on non-item statements is not stable yet, we use a function. |
| #[cfg(not(target_os = "android"))] |
| #[cfg(not(target_os = "redox"))] |
| #[cfg(target_pointer_width = "64")] |
| #[cfg(not(target_env = "musl"))] |
| fn tiocgwinsz() -> u64 { |
| TIOCGWINSZ as u64 |
| } |
| #[cfg(not(target_os = "android"))] |
| #[cfg(not(target_os = "redox"))] |
| #[cfg(target_pointer_width = "32")] |
| #[cfg(not(target_env = "musl"))] |
| fn tiocgwinsz() -> u32 { |
| TIOCGWINSZ as u32 |
| } |
| |
| #[cfg(any(target_env = "musl", target_os = "android"))] |
| fn tiocgwinsz() -> i32 { |
| TIOCGWINSZ as i32 |
| } |
| |
| /// Get the size of the terminal. |
| pub fn terminal_size() -> io::Result<(u16, u16)> { |
| unsafe { |
| let mut size: TermSize = mem::zeroed(); |
| cvt(ioctl(STDOUT_FILENO, tiocgwinsz(), &mut size as *mut _))?; |
| Ok((size.col as u16, size.row as u16)) |
| } |
| } |