aboutsummaryrefslogtreecommitdiff
path: root/src/term.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/term.rs')
-rw-r--r--src/term.rs30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/term.rs b/src/term.rs
new file mode 100644
index 0000000..275ab60
--- /dev/null
+++ b/src/term.rs
@@ -0,0 +1,30 @@
+use std::fs::File;
+use std::io::Error;
+use std::mem;
+use std::os::raw::{c_int, c_ushort};
+use std::os::unix::io::AsRawFd;
+
+#[repr(C)]
+struct Winsize {
+ ws_row: c_ushort,
+ ws_col: c_ushort,
+ ws_xpixel: c_ushort,
+ ws_ypixel: c_ushort,
+}
+
+const TIOCGWINSZ: c_int = 0x5413;
+
+extern "C" {
+ fn ioctl(fd: c_int, request: c_int, ...) -> c_int;
+}
+
+pub fn get_terminal_size() -> Result<(u16, u16), Error> {
+ let stdout = File::open("/dev/tty")?;
+ let fd = stdout.as_raw_fd();
+ let mut ws: Winsize = unsafe { mem::zeroed() };
+ let result = unsafe { ioctl(fd, TIOCGWINSZ, &mut ws) };
+ if result == -1 {
+ return Err(Error::last_os_error());
+ }
+ Ok((ws.ws_col, ws.ws_row))
+}