blob: 417445c197df6a8ce87c19e80fde8aaf3683e58b [file] [log] [blame]
use std::error;
use tui::{
layout::{Alignment},
widgets::{Block, BorderType, Borders},
Terminal,
};
use core::result::Result;
use std::io::Error;
use tui::backend::Backend;
use tui::buffer::Cell;
use tui::layout::Rect;
extern "C" {
fn cursorHide();
fn cursorShow();
fn cursorSet(x: u16, y: u16);
fn clearScreen();
fn getSize() -> (i32, i32, i32, i32);
fn flush();
fn draw(x: u16, y: u16);
}
struct HostBackend {}
impl Backend for HostBackend {
fn draw<'a, I>(&mut self, content: I) -> Result<(), Error>
where
I: Iterator<Item = (u16, u16, &'a Cell)>,
{
for i in content {
let x: u16 = i.0;
let y: u16 = i.1;
unsafe { draw(x, y) }
}
Ok(())
}
fn hide_cursor(&mut self) -> Result<(), Error> {
unsafe { cursorHide() }
Ok(())
}
fn show_cursor(&mut self) -> Result<(), Error> {
unsafe { cursorShow() }
Ok(())
}
fn get_cursor(&mut self) -> Result<(u16, u16), Error> {
Ok((100, 100))
}
fn set_cursor(&mut self, x: u16, y: u16) -> Result<(), Error> {
unsafe { cursorSet(x, y) }
Ok(())
}
fn clear(&mut self) -> Result<(), Error> {
unsafe { clearScreen() }
Ok(())
}
fn size(&self) -> Result<Rect, Error> {
let ws: (i32, i32, i32, i32);
unsafe { ws = getSize(); }
Ok(Rect {
x: ws.0 as u16,
y: ws.1 as u16,
width: ws.2 as u16,
height: ws.3 as u16,
})
// Ok(Rect {
// x: 0,
// y: 0,
// width: 50,
// height: 50,
// })
}
fn flush(&mut self) -> Result<(), Error> {
unsafe { flush() }
Ok(())
}
}
fn main() -> Result<(), Box<dyn error::Error>> {
let backend = HostBackend{};
let mut terminal = Terminal::new(backend)?;
let mut i: i32 = 0;
loop {
terminal.draw(|f| {
let size = f.size();
let block = Block::default()
.borders(Borders::ALL)
.title("Main block with round corners")
.title_alignment(Alignment::Center)
.border_type(BorderType::Rounded);
f.render_widget(block, size);
})?;
i = i + 1;
if i > 1000 {
break;
}
}
terminal.show_cursor()?;
Ok(())
}
struct Unused<T>(T);
#[no_mangle]
pub extern "C" fn run() {
// unsafe { cursorSet(10, 10) }
Unused(main());
}