|
|
|
@ -20,11 +20,13 @@ where
|
|
|
|
|
pub type RawBackend = TermionBackend<termion::raw::RawTerminal<io::Stdout>>;
|
|
|
|
|
pub type MouseBackend =
|
|
|
|
|
TermionBackend<termion::input::MouseTerminal<termion::raw::RawTerminal<io::Stdout>>>;
|
|
|
|
|
pub type AlternateScreenBackend =
|
|
|
|
|
TermionBackend<termion::screen::AlternateScreen<termion::raw::RawTerminal<io::Stdout>>>;
|
|
|
|
|
|
|
|
|
|
impl RawBackend {
|
|
|
|
|
pub fn new() -> Result<RawBackend, io::Error> {
|
|
|
|
|
let raw = io::stdout().into_raw_mode()?;
|
|
|
|
|
Ok(TermionBackend { stdout: raw })
|
|
|
|
|
Ok(TermionBackend::with_stdout(raw))
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -32,7 +34,37 @@ impl MouseBackend {
|
|
|
|
|
pub fn new() -> Result<MouseBackend, io::Error> {
|
|
|
|
|
let raw = io::stdout().into_raw_mode()?;
|
|
|
|
|
let mouse = termion::input::MouseTerminal::from(raw);
|
|
|
|
|
Ok(TermionBackend { stdout: mouse })
|
|
|
|
|
Ok(TermionBackend::with_stdout(mouse))
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl AlternateScreenBackend {
|
|
|
|
|
pub fn new() -> Result<AlternateScreenBackend, io::Error> {
|
|
|
|
|
let raw = io::stdout().into_raw_mode()?;
|
|
|
|
|
let screen = termion::screen::AlternateScreen::from(raw);
|
|
|
|
|
Ok(TermionBackend::with_stdout(screen))
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl<W> TermionBackend<W>
|
|
|
|
|
where
|
|
|
|
|
W: Write,
|
|
|
|
|
{
|
|
|
|
|
pub fn with_stdout(stdout: W) -> TermionBackend<W> {
|
|
|
|
|
TermionBackend { stdout }
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl<W> Write for TermionBackend<W>
|
|
|
|
|
where
|
|
|
|
|
W: Write,
|
|
|
|
|
{
|
|
|
|
|
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
|
|
|
|
|
self.stdout.write(buf)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn flush(&mut self) -> io::Result<()> {
|
|
|
|
|
self.stdout.flush()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -41,28 +73,25 @@ where
|
|
|
|
|
W: Write,
|
|
|
|
|
{
|
|
|
|
|
/// Clears the entire screen and move the cursor to the top left of the screen
|
|
|
|
|
fn clear(&mut self) -> Result<(), io::Error> {
|
|
|
|
|
fn clear(&mut self) -> io::Result<()> {
|
|
|
|
|
write!(self.stdout, "{}", termion::clear::All)?;
|
|
|
|
|
write!(self.stdout, "{}", termion::cursor::Goto(1, 1))?;
|
|
|
|
|
self.stdout.flush()?;
|
|
|
|
|
Ok(())
|
|
|
|
|
self.stdout.flush()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Hides cursor
|
|
|
|
|
fn hide_cursor(&mut self) -> Result<(), io::Error> {
|
|
|
|
|
fn hide_cursor(&mut self) -> io::Result<()> {
|
|
|
|
|
write!(self.stdout, "{}", termion::cursor::Hide)?;
|
|
|
|
|
self.stdout.flush()?;
|
|
|
|
|
Ok(())
|
|
|
|
|
self.stdout.flush()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Shows cursor
|
|
|
|
|
fn show_cursor(&mut self) -> Result<(), io::Error> {
|
|
|
|
|
fn show_cursor(&mut self) -> io::Result<()> {
|
|
|
|
|
write!(self.stdout, "{}", termion::cursor::Show)?;
|
|
|
|
|
self.stdout.flush()?;
|
|
|
|
|
Ok(())
|
|
|
|
|
self.stdout.flush()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn draw<'a, I>(&mut self, content: I) -> Result<(), io::Error>
|
|
|
|
|
fn draw<'a, I>(&mut self, content: I) -> io::Result<()>
|
|
|
|
|
where
|
|
|
|
|
I: Iterator<Item = (u16, u16, &'a Cell)>,
|
|
|
|
|
{
|
|
|
|
@ -108,8 +137,7 @@ where
|
|
|
|
|
Color::Reset.termion_fg(),
|
|
|
|
|
Color::Reset.termion_bg(),
|
|
|
|
|
Modifier::Reset.termion_modifier()
|
|
|
|
|
)?;
|
|
|
|
|
Ok(())
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Return the size of the terminal
|
|
|
|
@ -123,9 +151,8 @@ where
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn flush(&mut self) -> Result<(), io::Error> {
|
|
|
|
|
try!(self.stdout.flush());
|
|
|
|
|
Ok(())
|
|
|
|
|
fn flush(&mut self) -> io::Result<()> {
|
|
|
|
|
self.stdout.flush()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|