From 7832e96843cd655ff6a8c784d23de10e96b594f8 Mon Sep 17 00:00:00 2001 From: James Campos Date: Tue, 19 May 2020 19:33:06 -0700 Subject: [PATCH 1/2] alternate screen --- examples/alternate.rs | 21 +++++++++++++++++++++ src/common_term.rs | 10 ++++++++++ src/term.rs | 12 ++++++++++++ 3 files changed, 43 insertions(+) create mode 100644 examples/alternate.rs diff --git a/examples/alternate.rs b/examples/alternate.rs new file mode 100644 index 00000000..7fd48f81 --- /dev/null +++ b/examples/alternate.rs @@ -0,0 +1,21 @@ +use std::io; + +use console::Term; + +fn main() -> io::Result<()> { + let term = Term::stdout(); + let (height, width) = term.size(); + term.hide_cursor()?; + term.enter_alternate_screen()?; + + let s = "press any key to quit"; + let x = (width as usize / 2) - (s.len() / 2); + let y = height as usize / 2; + term.move_cursor_to(x, y)?; + term.write_str(&s)?; + term.read_key()?; + + term.exit_alternate_screen()?; + term.show_cursor()?; + Ok(()) +} diff --git a/src/common_term.rs b/src/common_term.rs index 020660a5..a78415a1 100644 --- a/src/common_term.rs +++ b/src/common_term.rs @@ -70,3 +70,13 @@ pub fn show_cursor(out: &Term) -> io::Result<()> { pub fn hide_cursor(out: &Term) -> io::Result<()> { out.write_str("\x1b[?25l") } + +#[inline] +pub fn enter_alternate_screen(out: &Term) -> io::Result<()> { + out.write_str("\x1b[?1049h") +} + +#[inline] +pub fn exit_alternate_screen(out: &Term) -> io::Result<()> { + out.write_str("\x1b[?1049l") +} diff --git a/src/term.rs b/src/term.rs index 6052fecd..963279e7 100644 --- a/src/term.rs +++ b/src/term.rs @@ -440,6 +440,18 @@ impl Term { hide_cursor(self) } + /// Enter alternate screen + #[inline] + pub fn enter_alternate_screen(&self) -> io::Result<()> { + enter_alternate_screen(self) + } + + /// Exit alternate screen + #[inline] + pub fn exit_alternate_screen(&self) -> io::Result<()> { + exit_alternate_screen(self) + } + // helpers #[cfg(all(windows, feature = "windows-console-colors"))] From b548b0cea17d7ae1a53a9f191f1928f2506b9561 Mon Sep 17 00:00:00 2001 From: James Campos Date: Tue, 19 May 2020 19:58:17 -0700 Subject: [PATCH 2/2] try to fix windows --- src/windows_term.rs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/windows_term.rs b/src/windows_term.rs index 8eb4fea9..169a9df4 100644 --- a/src/windows_term.rs +++ b/src/windows_term.rs @@ -300,6 +300,20 @@ pub fn hide_cursor(out: &Term) -> io::Result<()> { Ok(()) } +pub fn enter_alternate_screen(out: &Term) -> io::Result<()> { + if out.is_msys_tty { + return common_term::enter_alternate_screen(out); + } + Ok(()) +} + +pub fn exit_alternate_screen(out: &Term) -> io::Result<()> { + if out.is_msys_tty { + return common_term::exit_alternate_screen(out); + } + Ok(()) +} + fn get_console_screen_buffer_info(hand: HANDLE) -> Option<(HANDLE, CONSOLE_SCREEN_BUFFER_INFO)> { let mut csbi: CONSOLE_SCREEN_BUFFER_INFO = unsafe { mem::zeroed() }; match unsafe { GetConsoleScreenBufferInfo(hand, &mut csbi) } {