From ea0444f2bb0ad94431a597e29f15d61cfa237508 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Wed, 27 Apr 2016 02:51:35 -0400 Subject: implement the rest of the cell attrs --- src/cell.rs | 26 ++++++++++++++++++++++++++ src/ffi.c | 25 +++++++++++++++++++++++++ src/ffi.rs | 5 +++++ tests/basic.rs | 9 +++++++++ 4 files changed, 65 insertions(+) diff --git a/src/cell.rs b/src/cell.rs index 4c0d6fb..ef12756 100644 --- a/src/cell.rs +++ b/src/cell.rs @@ -2,6 +2,7 @@ use libc; use std; use color; +use ffi; use types; pub struct Cell(*mut types::CellImpl); @@ -56,4 +57,29 @@ impl Cell { let attrs = unsafe { &(*prefix).attrs }; color::Color::new(&attrs.bgcolor) } + + pub fn is_wide(&self) -> bool { + let Cell(cell_impl) = *self; + unsafe { ffi::vt100_wrapper_cell_is_wide(cell_impl) != 0 } + } + + pub fn bold(&self) -> bool { + let Cell(cell_impl) = *self; + unsafe { ffi::vt100_wrapper_cell_bold(cell_impl) != 0 } + } + + pub fn italic(&self) -> bool { + let Cell(cell_impl) = *self; + unsafe { ffi::vt100_wrapper_cell_italic(cell_impl) != 0 } + } + + pub fn underline(&self) -> bool { + let Cell(cell_impl) = *self; + unsafe { ffi::vt100_wrapper_cell_underline(cell_impl) != 0 } + } + + pub fn inverse(&self) -> bool { + let Cell(cell_impl) = *self; + unsafe { ffi::vt100_wrapper_cell_inverse(cell_impl) != 0 } + } } diff --git a/src/ffi.c b/src/ffi.c index a4af5ba..fb2a3b3 100644 --- a/src/ffi.c +++ b/src/ffi.c @@ -10,3 +10,28 @@ int vt100_wrapper_cols(VT100Screen *vt) { return vt->grid->max.col; } + +int vt100_wrapper_cell_is_wide(struct vt100_cell *cell) +{ + return cell->is_wide; +} + +int vt100_wrapper_cell_bold(struct vt100_cell *cell) +{ + return cell->attrs.bold; +} + +int vt100_wrapper_cell_italic(struct vt100_cell *cell) +{ + return cell->attrs.italic; +} + +int vt100_wrapper_cell_underline(struct vt100_cell *cell) +{ + return cell->attrs.underline; +} + +int vt100_wrapper_cell_inverse(struct vt100_cell *cell) +{ + return cell->attrs.inverse; +} diff --git a/src/ffi.rs b/src/ffi.rs index e498361..550e3b0 100644 --- a/src/ffi.rs +++ b/src/ffi.rs @@ -40,6 +40,11 @@ extern "C" { pub fn vt100_wrapper_rows(screen: *mut types::ScreenImpl) -> libc::c_int; pub fn vt100_wrapper_cols(screen: *mut types::ScreenImpl) -> libc::c_int; + pub fn vt100_wrapper_cell_is_wide(cell: *mut types::CellImpl) -> libc::c_int; + pub fn vt100_wrapper_cell_bold(cell: *mut types::CellImpl) -> libc::c_int; + pub fn vt100_wrapper_cell_italic(cell: *mut types::CellImpl) -> libc::c_int; + pub fn vt100_wrapper_cell_underline(cell: *mut types::CellImpl) -> libc::c_int; + pub fn vt100_wrapper_cell_inverse(cell: *mut types::CellImpl) -> libc::c_int; } #[cfg(test)] diff --git a/tests/basic.rs b/tests/basic.rs index 7af33f0..f6cbad0 100644 --- a/tests/basic.rs +++ b/tests/basic.rs @@ -67,4 +67,13 @@ mod tests { vt100::Color::ColorIdx(2) ); } + + #[test] + fn cell_attrs() { + let mut screen = vt100::Screen::new(24, 80); + let input = b"foo\x1b[31m\x1b[32mb\x1b[3;7;42ma\x1b[23mr"; + screen.process(input); + + assert!(screen.cell(0, 4).unwrap().italic()); + } } -- cgit v1.2.3