diff --git a/Cargo.lock b/Cargo.lock index 1347f88..d6a8fbf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -15,6 +15,7 @@ dependencies = [ "number_prefix 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", "scoped_threadpool 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "term_grid 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "term_size 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "users 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", "zoneinfo_compiled 0.2.1 (git+https://github.com/rust-datetime/zoneinfo-compiled.git)", @@ -117,6 +118,15 @@ dependencies = [ "nom 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "kernel32-sys" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "lazy_static" version = "0.2.8" @@ -317,6 +327,16 @@ dependencies = [ "unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "term_size" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.29 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "unicode-bidi" version = "0.3.4" @@ -358,6 +378,16 @@ name = "vcpkg" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "winapi" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "winapi-build" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "zoneinfo_compiled" version = "0.2.1" @@ -382,6 +412,7 @@ dependencies = [ "checksum glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb" "checksum idna 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "014b298351066f1512874135335d62a789ffe78a9974f94b43ed5621951eaf7d" "checksum iso8601 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "11dc464f8c6f17595d191447c9c6559298b2d023d6f846a4a23ac7ea3c46c477" +"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" "checksum lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3b37545ab726dd833ec6420aaba8231c5b320814b9029ad585555d2a03e94fbf" "checksum libc 0.2.29 (registry+https://github.com/rust-lang/crates.io-index)" = "8a014d9226c2cc402676fbe9ea2e15dd5222cd1dd57f576b5b283178c944a264" "checksum libgit2-sys 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "0f1641ccb55181967a3e5ee4ae2911c0563492f016383ea67a27886181de088c" @@ -408,10 +439,13 @@ dependencies = [ "checksum rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)" = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda" "checksum scoped_threadpool 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "3ef399c8893e8cb7aa9696e895427fab3a6bf265977bb96e126f24ddd2cda85a" "checksum term_grid 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ccc202875496cf72a683a1ecd66f0742a830e73c202bdbd21867d73dfaac8343" +"checksum term_size 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2b6b55df3198cc93372e85dd2ed817f0e38ce8cc0f22eb32391bfad9c4bf209" "checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" "checksum unicode-normalization 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "51ccda9ef9efa3f7ef5d91e8f9b83bbe6955f9bf86aec89d5cce2c874625920f" "checksum unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "bf3a113775714a22dcb774d8ea3655c53a32debae63a063acc00a91cc586245f" "checksum url 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "eeb819346883532a271eb626deb43c4a1bb4c4dd47c519bd78137c3e72a4fe27" "checksum users 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e7d8fb16f17ce0e6a18a25ce39f08edb5fbe9a25f3f346c9dca5e6ffc0485cdf" "checksum vcpkg 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9e0a7d8bed3178a8fb112199d466eeca9ed09a14ba8ad67718179b4fd5487d0b" +"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" +"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" "checksum zoneinfo_compiled 0.2.1 (git+https://github.com/rust-datetime/zoneinfo-compiled.git)" = "" diff --git a/Cargo.toml b/Cargo.toml index 085ab4b..7cb63bd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -36,6 +36,7 @@ scoped_threadpool = "0.1.*" term_grid = "0.1.2" unicode-width = "0.1.4" users = "0.5.2" +term_size = "0.3.0" [features] default = [ "git" ] diff --git a/src/exa.rs b/src/exa.rs index 2434bc0..b75cfb4 100644 --- a/src/exa.rs +++ b/src/exa.rs @@ -15,6 +15,7 @@ extern crate term_grid; extern crate unicode_width; extern crate users; extern crate zoneinfo_compiled; +extern crate term_size; #[cfg(feature="git")] extern crate git2; @@ -37,7 +38,6 @@ mod fs; mod info; mod options; mod output; -mod term; /// The main program wrapper. diff --git a/src/options/view.rs b/src/options/view.rs index 03ae3f0..c634dca 100644 --- a/src/options/view.rs +++ b/src/options/view.rs @@ -11,7 +11,6 @@ use output::time::TimeFormat; use options::Misfire; use fs::feature::xattr; - /// The **view** contains all information about how to format output. #[derive(Debug)] pub struct View { @@ -393,7 +392,7 @@ impl Classify { // so it’s easier to just cache it the first time it runs. lazy_static! { static ref TERM_WIDTH: Option = { - use term::dimensions; + use term_size::dimensions; dimensions().map(|t| t.0) }; } diff --git a/src/term.rs b/src/term.rs deleted file mode 100644 index 4f0e000..0000000 --- a/src/term.rs +++ /dev/null @@ -1,64 +0,0 @@ -//! System calls for getting the terminal size. -//! -//! Getting the terminal size is performed using an ioctl command that takes -//! the file handle to the terminal -- which in this case, is stdout -- and -//! populates a structure containing the values. -//! -//! The size is needed when the user wants the output formatted into columns: -//! the default grid view, or the hybrid grid-details view. - -use std::mem::zeroed; -use libc::{c_int, c_ushort, c_ulong, STDOUT_FILENO}; - - -/// The number of rows and columns of a terminal. -struct Winsize { - ws_row: c_ushort, - ws_col: c_ushort, -} - -// Unfortunately the actual command is not standardised... - -#[cfg(any(target_os = "linux", target_os = "android"))] -static TIOCGWINSZ: c_ulong = 0x5413; - -#[cfg(any(target_os = "macos", - target_os = "ios", - target_os = "bitrig", - target_os = "dragonfly", - target_os = "freebsd", - target_os = "netbsd", - target_os = "openbsd"))] -static TIOCGWINSZ: c_ulong = 0x40087468; - -extern { - pub fn ioctl(fd: c_int, request: c_ulong, ...) -> c_int; -} - -/// Runs the ioctl command. Returns (0, 0) if output is not to a terminal, or -/// there is an error. (0, 0) is an invalid size to have anyway, which is why -/// it can be used as a nil value. -unsafe fn get_dimensions() -> Winsize { - let mut window: Winsize = zeroed(); - let result = ioctl(STDOUT_FILENO, TIOCGWINSZ, &mut window); - - if result == -1 { - zeroed() - } - else { - window - } -} - -/// Query the current processes's output, returning its width and height as a -/// number of characters. Returns `None` if the output isn't to a terminal. -pub fn dimensions() -> Option<(usize, usize)> { - let w = unsafe { get_dimensions() }; - - if w.ws_col == 0 || w.ws_row == 0 { - None - } - else { - Some((w.ws_col as usize, w.ws_row as usize)) - } -}