get/set cursor position

This commit is contained in:
scauligi 2019-02-12 19:06:30 -08:00 committed by Florian Dehau
parent 32de7a3fdc
commit bca920bea0
6 changed files with 44 additions and 0 deletions

View file

@ -69,6 +69,16 @@ impl Backend for CrosstermBackend {
Ok(())
}
fn get_cursor(&mut self) -> io::Result<(u16, u16)> {
let cursor = crossterm::cursor();
Ok(cursor.pos())
}
fn set_cursor(&mut self, x: u16, y: u16) -> io::Result<()> {
let cursor = crossterm::cursor();
cursor.goto(x, y).map_err(convert_error)
}
fn size(&self) -> io::Result<Rect> {
let terminal = crossterm::terminal();
let (width, height) = terminal.terminal_size();

View file

@ -27,6 +27,8 @@ pub trait Backend {
I: Iterator<Item = (u16, u16, &'a Cell)>;
fn hide_cursor(&mut self) -> Result<(), io::Error>;
fn show_cursor(&mut self) -> Result<(), io::Error>;
fn get_cursor(&mut self) -> Result<(u16, u16), io::Error>;
fn set_cursor(&mut self, x: u16, y: u16) -> Result<(), io::Error>;
fn clear(&mut self) -> Result<(), io::Error>;
fn size(&self) -> Result<Rect, io::Error>;
fn flush(&mut self) -> Result<(), io::Error>;

View file

@ -51,6 +51,13 @@ impl Backend for RustboxBackend {
fn show_cursor(&mut self) -> Result<(), io::Error> {
Ok(())
}
fn get_cursor(&mut self) -> io::Result<(u16, u16)> {
Err(io::Error::from(io::ErrorKind::Other))
}
fn set_cursor(&mut self, x: u16, y: u16) -> io::Result<()> {
self.rustbox.set_cursor(x as isize, y as isize);
Ok(())
}
fn clear(&mut self) -> Result<(), io::Error> {
self.rustbox.clear();
Ok(())

View file

@ -59,6 +59,16 @@ where
self.stdout.flush()
}
/// Gets cursor position (0-based index)
fn get_cursor(&mut self) -> io::Result<(u16, u16)> {
termion::cursor::DetectCursorPos::cursor_pos(&mut self.stdout).map(|(x, y)| (x - 1, y - 1))
}
/// Sets cursor position (0-based index)
fn set_cursor(&mut self, x: u16, y: u16) -> io::Result<()> {
write!(self.stdout, "{}", termion::cursor::Goto(x + 1, y + 1))
}
fn draw<'a, I>(&mut self, content: I) -> io::Result<()>
where
I: Iterator<Item = (u16, u16, &'a Cell)>,

View file

@ -9,6 +9,7 @@ pub struct TestBackend {
buffer: Buffer,
height: u16,
cursor: bool,
pos: (u16, u16),
}
impl TestBackend {
@ -18,6 +19,7 @@ impl TestBackend {
height,
buffer: Buffer::empty(Rect::new(0, 0, width, height)),
cursor: false,
pos: (0, 0),
}
}
@ -46,6 +48,13 @@ impl Backend for TestBackend {
self.cursor = true;
Ok(())
}
fn get_cursor(&mut self) -> Result<(u16, u16), io::Error> {
Ok(self.pos)
}
fn set_cursor(&mut self, x: u16, y: u16) -> Result<(), io::Error> {
self.pos = (x, y);
Ok(())
}
fn clear(&mut self) -> Result<(), io::Error> {
Ok(())
}

View file

@ -161,6 +161,12 @@ where
self.hidden_cursor = false;
Ok(())
}
pub fn get_cursor(&mut self) -> io::Result<(u16, u16)> {
self.backend.get_cursor()
}
pub fn set_cursor(&mut self, x: u16, y: u16) -> io::Result<()> {
self.backend.set_cursor(x, y)
}
pub fn clear(&mut self) -> io::Result<()> {
self.backend.clear()
}