diff options
Diffstat (limited to 'vendor/terminal_size/src')
-rw-r--r-- | vendor/terminal_size/src/lib.rs | 37 | ||||
-rw-r--r-- | vendor/terminal_size/src/unix.rs | 117 | ||||
-rw-r--r-- | vendor/terminal_size/src/windows.rs | 53 |
3 files changed, 0 insertions, 207 deletions
diff --git a/vendor/terminal_size/src/lib.rs b/vendor/terminal_size/src/lib.rs deleted file mode 100644 index 6ef79be..0000000 --- a/vendor/terminal_size/src/lib.rs +++ /dev/null @@ -1,37 +0,0 @@ -//! A simple utility for getting the size of a terminal. -//! -//! Supports both Linux, MacOS, and Windows. -//! -//! This crate requires a minimum rust version of 1.31.0 (2018-12-06) -//! -//! # Example -//! -//! ``` -//! use terminal_size::{Width, Height, terminal_size}; -//! -//! let size = terminal_size(); -//! if let Some((Width(w), Height(h))) = size { -//! println!("Your terminal is {} cols wide and {} lines tall", w, h); -//! } else { -//! println!("Unable to get terminal size"); -//! } -//! ``` -//! - -#[derive(Debug)] -pub struct Width(pub u16); -#[derive(Debug)] -pub struct Height(pub u16); - -#[cfg(unix)] -mod unix; -#[cfg(unix)] -pub use crate::unix::{terminal_size, terminal_size_using_fd}; - -#[cfg(windows)] -mod windows; -#[cfg(windows)] -pub use crate::windows::{terminal_size, terminal_size_using_handle}; - -#[cfg(not(any(unix, windows)))] -pub fn terminal_size() -> Option<(Width, Height)> { None } diff --git a/vendor/terminal_size/src/unix.rs b/vendor/terminal_size/src/unix.rs deleted file mode 100644 index 59ac276..0000000 --- a/vendor/terminal_size/src/unix.rs +++ /dev/null @@ -1,117 +0,0 @@ -use super::{Height, Width}; -use std::os::unix::io::RawFd; - -/// Returns the size of the terminal defaulting to STDOUT, if available. -/// -/// If STDOUT is not a tty, returns `None` -pub fn terminal_size() -> Option<(Width, Height)> { - terminal_size_using_fd(libc::STDOUT_FILENO) -} - -/// Returns the size of the terminal using the given file descriptor, if available. -/// -/// If the given file descriptor is not a tty, returns `None` -pub fn terminal_size_using_fd(fd: RawFd) -> Option<(Width, Height)> { - use libc::ioctl; - use libc::isatty; - use libc::{winsize as WinSize, TIOCGWINSZ}; - let is_tty: bool = unsafe { isatty(fd) == 1 }; - - if !is_tty { - return None; - } - - let mut winsize = WinSize { - ws_row: 0, - ws_col: 0, - ws_xpixel: 0, - ws_ypixel: 0, - }; - - if unsafe { ioctl(fd, TIOCGWINSZ.into(), &mut winsize) } == -1 { - return None; - } - - let rows = winsize.ws_row; - let cols = winsize.ws_col; - - if rows > 0 && cols > 0 { - Some((Width(cols), Height(rows))) - } else { - None - } -} - -#[test] -/// Compare with the output of `stty size` -fn compare_with_stty() { - use std::process::Command; - use std::process::Stdio; - - let (rows, cols) = if cfg!(target_os = "illumos") { - // illumos stty(1) does not accept a device argument, instead using - // stdin unconditionally: - let output = Command::new("stty") - .stdin(Stdio::inherit()) - .output() - .unwrap(); - assert!(output.status.success()); - - // stdout includes the row and columns thus: "rows = 80; columns = 24;" - let vals = String::from_utf8(output.stdout) - .unwrap() - .lines() - .map(|line| { - // Split each line on semicolons to get "k = v" strings: - line.split(';') - .map(str::trim) - .map(str::to_string) - .collect::<Vec<_>>() - }) - .flatten() - .filter_map(|term| { - // split each "k = v" string and look for rows/columns: - match term.splitn(2, " = ").collect::<Vec<_>>().as_slice() { - ["rows", n] | ["columns", n] => Some(n.parse().unwrap()), - _ => None, - } - }) - .collect::<Vec<_>>(); - (vals[0], vals[1]) - } else { - let output = if cfg!(target_os = "linux") { - Command::new("stty") - .arg("size") - .arg("-F") - .arg("/dev/stderr") - .stderr(Stdio::inherit()) - .output() - .unwrap() - } else { - Command::new("stty") - .arg("-f") - .arg("/dev/stderr") - .arg("size") - .stderr(Stdio::inherit()) - .output() - .unwrap() - }; - - assert!(output.status.success()); - let stdout = String::from_utf8(output.stdout).unwrap(); - // stdout is "rows cols" - let mut data = stdout.split_whitespace(); - println!("{}", stdout); - let rows = u16::from_str_radix(data.next().unwrap(), 10).unwrap(); - let cols = u16::from_str_radix(data.next().unwrap(), 10).unwrap(); - (rows, cols) - }; - println!("{} {}", rows, cols); - - if let Some((Width(w), Height(h))) = terminal_size() { - assert_eq!(rows, h); - assert_eq!(cols, w); - } else { - panic!("terminal_size() return None"); - } -} diff --git a/vendor/terminal_size/src/windows.rs b/vendor/terminal_size/src/windows.rs deleted file mode 100644 index 14f487f..0000000 --- a/vendor/terminal_size/src/windows.rs +++ /dev/null @@ -1,53 +0,0 @@ -use super::{Height, Width}; -use std::os::windows::io::RawHandle; - -/// Returns the size of the terminal defaulting to STDOUT, if available. -/// -/// Note that this returns the size of the actual command window, and -/// not the overall size of the command window buffer -pub fn terminal_size() -> Option<(Width, Height)> { - use winapi::um::processenv::GetStdHandle; - use winapi::um::winbase::STD_OUTPUT_HANDLE; - - let handle = unsafe { GetStdHandle(STD_OUTPUT_HANDLE) as RawHandle }; - - terminal_size_using_handle(handle) -} - -/// Returns the size of the terminal using the given handle, if available. -/// -/// If the given handle is not a tty, returns `None` -pub fn terminal_size_using_handle(handle: RawHandle) -> Option<(Width, Height)> { - use winapi::um::handleapi::INVALID_HANDLE_VALUE; - use winapi::um::wincon::{ - GetConsoleScreenBufferInfo, CONSOLE_SCREEN_BUFFER_INFO, COORD, SMALL_RECT, - }; - - // convert between winapi::um::winnt::HANDLE and std::os::windows::raw::HANDLE - let hand = handle as winapi::um::winnt::HANDLE; - - if hand == INVALID_HANDLE_VALUE { - return None; - } - - let zc = COORD { X: 0, Y: 0 }; - let mut csbi = CONSOLE_SCREEN_BUFFER_INFO { - dwSize: zc, - dwCursorPosition: zc, - wAttributes: 0, - srWindow: SMALL_RECT { - Left: 0, - Top: 0, - Right: 0, - Bottom: 0, - }, - dwMaximumWindowSize: zc, - }; - if unsafe { GetConsoleScreenBufferInfo(hand, &mut csbi) } == 0 { - return None; - } - - let w: Width = Width((csbi.srWindow.Right - csbi.srWindow.Left + 1) as u16); - let h: Height = Height((csbi.srWindow.Bottom - csbi.srWindow.Top + 1) as u16); - Some((w, h)) -} |