diff --git a/src/tty/windows.rs b/src/tty/windows.rs index c340c325..ac11137e 100644 --- a/src/tty/windows.rs +++ b/src/tty/windows.rs @@ -8,6 +8,30 @@ use super::{Width, Height}; /// 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)> { + if let Some((_, csbi)) = get_csbi() { + let w: Width = Width((csbi.srWindow.Right - csbi.srWindow.Left) as u16); + let h: Height = Height((csbi.srWindow.Bottom - csbi.srWindow.Top) as u16); + Some((w, h)) + } else { + None + } +} + +fn move_cursor_up(n: usize) -> String { + use self::kernel32::SetConsoleCursorPosition; + use self::winapi::COORD; + if let Some((hand, csbi)) = get_csbi() { + unsafe { + SetConsoleCursorPosition(hand, COORD { + X: 0 as i16, + Y: csbi.dwCursorPosition.Y as i16 - n, + }); + } + } + "".to_string() +} + +fn get_csbi() -> Option<(self::winapi::HANDLE, self::winapi::CONSOLE_SCREEN_BUFFER_INFO)> { use self::winapi::HANDLE; use self::kernel32::{GetStdHandle, GetConsoleScreenBufferInfo}; use self::winapi::STD_OUTPUT_HANDLE; @@ -28,12 +52,8 @@ pub fn terminal_size() -> Option<(Width, Height)> { }, dwMaximumWindowSize: zc, }; - let success: bool = unsafe { GetConsoleScreenBufferInfo(hand, &mut csbi) != 0 }; - if success { - let w: Width = Width((csbi.srWindow.Right - csbi.srWindow.Left) as u16); - let h: Height = Height((csbi.srWindow.Bottom - csbi.srWindow.Top) as u16); - Some((w, h)) - } else { - None + match unsafe { GetConsoleScreenBufferInfo(hand, &mut csbi) } { + 0 => None, + _ => Some((hand, csbi)), } }