mirror of
https://github.com/dankamongmen/notcurses.git
synced 2024-11-18 03:25:55 +00:00
[rust] refactor Notcurses & NcDirect wrapping approach
- remove `Nc` & `NcD` wrappers, to move them to notcurses-rs library. - update the summary header format for Notcurses and NcDirect - update docs and examples
This commit is contained in:
parent
73fc4ea935
commit
129e208438
@ -15,38 +15,26 @@ and the [**C way**](#2-the-c-way). (Or a mix of both).
|
|||||||
|
|
||||||
## 1. The Rust way
|
## 1. The Rust way
|
||||||
|
|
||||||
Where you use the safely wrapped types, with its methods and constructors,
|
Where you use the more safely wrapped types, with its methods and constructors,
|
||||||
and painless error handling, like this:
|
and painless error handling, like this:
|
||||||
|
|
||||||
```rust
|
```rust
|
||||||
use libnotcurses_sys::*;
|
use libnotcurses_sys::*;
|
||||||
|
|
||||||
fn main() -> NcResult<()> {
|
fn main() -> NcResult<()> {
|
||||||
let mut nc = Nc::with_flags(NCOPTION_NO_ALTERNATE_SCREEN)?;
|
let mut nc = Notcurses::with_flags(NCOPTION_NO_ALTERNATE_SCREEN)?;
|
||||||
let plane = nc.stdplane();
|
let plane = nc.stdplane();
|
||||||
plane.putstr("hello world")?;
|
plane.putstr("hello world")?;
|
||||||
nc.render()?;
|
nc.render()?;
|
||||||
|
nc.stop()?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
Specifically `Nc` and `NcD` are safe wrappers over `Notcurses`
|
Although you still have to manually call the `stop()` method for `Notcurses`
|
||||||
and `NcDirect`, respectively.
|
and `NcDirect` objects, and the `destroy()` method for the rest of types that
|
||||||
|
allocate, (like `NcPlane`, `NcMenu`…) at the end of their scope, since the Drop
|
||||||
`Nc` and `NcD` both implement the Drop, AsRef, AsMut, Deref and DerefMut traits.
|
trait is not implemented for any wrapping type in libnotcurses-sys.
|
||||||
|
|
||||||
Their destructors are called automatically at the end of their scope.
|
|
||||||
|
|
||||||
Methods are directly implemented for `Notcurses` and `NcDirect`, and are
|
|
||||||
made automatically available to `Nc` & `NcD`, minus some function overrides,
|
|
||||||
like their destructors, plus the static methods that have to be recreated.
|
|
||||||
|
|
||||||
The rest of the types that allocate, like `NcPlane`, `NcMenu`,
|
|
||||||
`NcReader`… have no higher level wrapping struct, they don't
|
|
||||||
implement Drop, so they have to be `*.destroy()`ed manually.
|
|
||||||
|
|
||||||
But they do implement methods and use `NcResult` as the return type,
|
|
||||||
for handling errors in the way we are used to in Rust.
|
|
||||||
|
|
||||||
For the types that don't allocate, most are based on primitives like `i32`,
|
For the types that don't allocate, most are based on primitives like `i32`,
|
||||||
`u32`, `u64`… without a name in the C library. In Rust they are type aliased
|
`u32`, `u64`… without a name in the C library. In Rust they are type aliased
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
use libnotcurses_sys::*;
|
use libnotcurses_sys::*;
|
||||||
|
|
||||||
fn main() -> NcResult<()> {
|
fn main() -> NcResult<()> {
|
||||||
let mut dm = NcD::new()?;
|
let dm = NcDirect::new()?;
|
||||||
|
|
||||||
let (t_rows, t_cols) = dm.dim_yx();
|
let (t_rows, t_cols) = dm.dim_yx();
|
||||||
println!("Terminal rows={0}, cols={1}", t_rows, t_cols);
|
println!("Terminal rows={0}, cols={1}", t_rows, t_cols);
|
||||||
|
@ -10,7 +10,7 @@ use libnotcurses_sys::*;
|
|||||||
fn main() -> NcResult<()> {
|
fn main() -> NcResult<()> {
|
||||||
let mut rng = thread_rng();
|
let mut rng = thread_rng();
|
||||||
|
|
||||||
let mut dm = NcD::new()?;
|
let mut dm = NcDirect::new()?;
|
||||||
|
|
||||||
let cols = dm.dim_x();
|
let cols = dm.dim_x();
|
||||||
let rows = dm.dim_y();
|
let rows = dm.dim_y();
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
use libnotcurses_sys::*;
|
use libnotcurses_sys::*;
|
||||||
|
|
||||||
fn main() -> NcResult<()> {
|
fn main() -> NcResult<()> {
|
||||||
let mut dm = NcD::new()?;
|
let mut dm = NcDirect::new()?;
|
||||||
|
|
||||||
render_image(&mut dm, NCBLIT_1x1)?;
|
render_image(&mut dm, NCBLIT_1x1)?;
|
||||||
render_image(&mut dm, NCBLIT_2x1)?;
|
render_image(&mut dm, NCBLIT_2x1)?;
|
||||||
@ -16,7 +16,7 @@ fn main() -> NcResult<()> {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn render_image(dm: &mut NcD, blit: NcBlitter) -> NcResult<()> {
|
fn render_image(dm: &mut NcDirect, blit: NcBlitter) -> NcResult<()> {
|
||||||
if let Err(nc_error) = dm.render_image("image-16x16.png", NCALIGN_CENTER, blit, NCSCALE_NONE) {
|
if let Err(nc_error) = dm.render_image("image-16x16.png", NCALIGN_CENTER, blit, NCSCALE_NONE) {
|
||||||
return Err(NcError::with_msg(
|
return Err(NcError::with_msg(
|
||||||
nc_error.int,
|
nc_error.int,
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
use libnotcurses_sys::*;
|
use libnotcurses_sys::*;
|
||||||
|
|
||||||
fn main() -> NcResult<()> {
|
fn main() -> NcResult<()> {
|
||||||
let mut nc = Nc::without_altscreen()?;
|
let nc = Notcurses::without_altscreen()?;
|
||||||
|
|
||||||
let (t_rows, t_cols) = nc.term_dim_yx();
|
let (t_rows, t_cols) = nc.term_dim_yx();
|
||||||
println!("Terminal rows={0}, cols={1}", t_rows, t_cols);
|
println!("Terminal rows={0}, cols={1}", t_rows, t_cols);
|
||||||
@ -38,5 +38,6 @@ Palette size: {11:?}
|
|||||||
println!("{:#?}", pixelgeom);
|
println!("{:#?}", pixelgeom);
|
||||||
|
|
||||||
nc.render()?;
|
nc.render()?;
|
||||||
|
nc.stop()?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
use libnotcurses_sys::*;
|
use libnotcurses_sys::*;
|
||||||
|
|
||||||
fn main() -> NcResult<()> {
|
fn main() -> NcResult<()> {
|
||||||
let mut nc = Nc::with_flags(
|
let mut nc = Notcurses::with_flags(
|
||||||
NCOPTION_SUPPRESS_BANNERS | NCOPTION_NO_WINCH_SIGHANDLER | NCOPTION_NO_QUIT_SIGHANDLERS,
|
NCOPTION_SUPPRESS_BANNERS | NCOPTION_NO_WINCH_SIGHANDLER | NCOPTION_NO_QUIT_SIGHANDLERS,
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
@ -32,5 +32,6 @@ fn main() -> NcResult<()> {
|
|||||||
println!("\nExiting...");
|
println!("\nExiting...");
|
||||||
|
|
||||||
rsleep![&mut nc, 1];
|
rsleep![&mut nc, 1];
|
||||||
|
nc.stop()?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
use libnotcurses_sys::*;
|
use libnotcurses_sys::*;
|
||||||
|
|
||||||
fn main() -> NcResult<()> {
|
fn main() -> NcResult<()> {
|
||||||
let mut nc = Nc::new()?;
|
let mut nc = Notcurses::new()?;
|
||||||
|
|
||||||
// get the terminal size in character rows & columns
|
// get the terminal size in character rows & columns
|
||||||
let (t_rows, t_cols) = nc.term_dim_yx();
|
let (t_rows, t_cols) = nc.term_dim_yx();
|
||||||
@ -59,5 +59,6 @@ fn main() -> NcResult<()> {
|
|||||||
|
|
||||||
rsleep![&mut nc, 3];
|
rsleep![&mut nc, 3];
|
||||||
|
|
||||||
|
nc.stop()?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,7 @@ const WIDTH: u32 = 10;
|
|||||||
const HEIGHT: u32 = 10;
|
const HEIGHT: u32 = 10;
|
||||||
|
|
||||||
fn main() -> NcResult<()> {
|
fn main() -> NcResult<()> {
|
||||||
let mut nc = Nc::new()?;
|
let mut nc = Notcurses::new()?;
|
||||||
|
|
||||||
if !nc.check_pixel_support()? {
|
if !nc.check_pixel_support()? {
|
||||||
return Err(NcError::new_msg("Current terminal doesn't support pixels."));
|
return Err(NcError::new_msg("Current terminal doesn't support pixels."));
|
||||||
@ -33,5 +33,6 @@ fn main() -> NcResult<()> {
|
|||||||
|
|
||||||
rsleep![&mut nc, 2];
|
rsleep![&mut nc, 2];
|
||||||
vframe.destroy();
|
vframe.destroy();
|
||||||
|
nc.stop()?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
@ -12,7 +12,7 @@ use rand::{distributions::Uniform, Rng};
|
|||||||
use libnotcurses_sys::*;
|
use libnotcurses_sys::*;
|
||||||
|
|
||||||
fn main() -> NcResult<()> {
|
fn main() -> NcResult<()> {
|
||||||
let mut nc = Nc::new()?;
|
let mut nc = Notcurses::new()?;
|
||||||
|
|
||||||
if !nc.check_pixel_support()? {
|
if !nc.check_pixel_support()? {
|
||||||
return Err(NcError::new_msg("Current terminal doesn't support pixels."));
|
return Err(NcError::new_msg("Current terminal doesn't support pixels."));
|
||||||
@ -81,5 +81,6 @@ fn main() -> NcResult<()> {
|
|||||||
vframe1.destroy();
|
vframe1.destroy();
|
||||||
vframe4.destroy();
|
vframe4.destroy();
|
||||||
|
|
||||||
|
nc.stop()?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,8 @@
|
|||||||
use libnotcurses_sys::*;
|
use libnotcurses_sys::*;
|
||||||
|
|
||||||
fn main() -> NcResult<()> {
|
fn main() -> NcResult<()> {
|
||||||
let mut nc = Nc::new()?;
|
let mut nc = Notcurses::new()?;
|
||||||
|
|
||||||
let plane = nc.stdplane();
|
let plane = nc.stdplane();
|
||||||
plane.set_scrolling(true);
|
plane.set_scrolling(true);
|
||||||
|
|
||||||
@ -19,4 +20,6 @@ fn main() -> NcResult<()> {
|
|||||||
}
|
}
|
||||||
rsleep![&mut nc, 0, 0, 30];
|
rsleep![&mut nc, 0, 0, 30];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// nc.stop()?;
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
use libnotcurses_sys::*;
|
use libnotcurses_sys::*;
|
||||||
|
|
||||||
fn main() -> NcResult<()> {
|
fn main() -> NcResult<()> {
|
||||||
let mut dm = NcD::new()?;
|
let dm = NcDirect::new()?;
|
||||||
|
|
||||||
let dimy = dm.dim_y();
|
let dimy = dm.dim_y();
|
||||||
let dimx = dm.dim_x();
|
let dimx = dm.dim_x();
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
use libnotcurses_sys::*;
|
use libnotcurses_sys::*;
|
||||||
|
|
||||||
fn main() -> NcResult<()> {
|
fn main() -> NcResult<()> {
|
||||||
let mut dm = NcD::new()?;
|
let dm = NcDirect::new()?;
|
||||||
|
|
||||||
dm.set_fg_rgb8(100, 100, 100)?;
|
dm.set_fg_rgb8(100, 100, 100)?;
|
||||||
dm.set_bg_rgb8(0xff, 0xff, 0xff)?;
|
dm.set_bg_rgb8(0xff, 0xff, 0xff)?;
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
use libnotcurses_sys::*;
|
use libnotcurses_sys::*;
|
||||||
|
|
||||||
fn main() -> NcResult<()> {
|
fn main() -> NcResult<()> {
|
||||||
let mut nc = Nc::new()?;
|
let mut nc = Notcurses::new()?;
|
||||||
nc.mouse_enable()?;
|
nc.mouse_enable()?;
|
||||||
|
|
||||||
let mut demo_items = [
|
let mut demo_items = [
|
||||||
@ -72,7 +72,7 @@ fn main() -> NcResult<()> {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn run_menu(nc: &mut Nc, menu: &mut NcMenu) -> NcResult<()> {
|
fn run_menu(nc: &mut Notcurses, menu: &mut NcMenu) -> NcResult<()> {
|
||||||
// yellow rectangle
|
// yellow rectangle
|
||||||
let planeopts = NcPlaneOptions::new_aligned(10, NCALIGN_CENTER, 3, 40);
|
let planeopts = NcPlaneOptions::new_aligned(10, NCALIGN_CENTER, 3, 40);
|
||||||
let stdplane = nc.stdplane();
|
let stdplane = nc.stdplane();
|
||||||
@ -104,6 +104,7 @@ fn run_menu(nc: &mut Nc, menu: &mut NcMenu) -> NcResult<()> {
|
|||||||
'q' => {
|
'q' => {
|
||||||
menu.destroy()?;
|
menu.destroy()?;
|
||||||
selplane.destroy()?;
|
selplane.destroy()?;
|
||||||
|
nc.stop()?;
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
NCKEY_ENTER => {
|
NCKEY_ENTER => {
|
||||||
@ -112,6 +113,7 @@ fn run_menu(nc: &mut Nc, menu: &mut NcMenu) -> NcResult<()> {
|
|||||||
"Quit" => {
|
"Quit" => {
|
||||||
menu.destroy()?;
|
menu.destroy()?;
|
||||||
selplane.destroy()?;
|
selplane.destroy()?;
|
||||||
|
nc.stop()?;
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
_ => (),
|
_ => (),
|
||||||
|
@ -177,7 +177,7 @@ pub use ffi::{
|
|||||||
ncdirect_off_styles,
|
ncdirect_off_styles,
|
||||||
ncdirect_on_styles,
|
ncdirect_on_styles,
|
||||||
ncdirect_palette_size,
|
ncdirect_palette_size,
|
||||||
ncdirect_printf_aligned,
|
//W ncdirect_printf_aligned,
|
||||||
ncdirect_putstr,
|
ncdirect_putstr,
|
||||||
ncdirect_raster_frame,
|
ncdirect_raster_frame,
|
||||||
ncdirect_readline,
|
ncdirect_readline,
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
//! Test `NcCell` methods and associated functions.
|
//! Test `NcCell` methods and associated functions.
|
||||||
|
|
||||||
use crate::{Nc, NcCell, NcPlane};
|
use crate::{Notcurses, NcCell, NcPlane};
|
||||||
|
|
||||||
use serial_test::serial;
|
use serial_test::serial;
|
||||||
|
|
||||||
@ -10,8 +10,9 @@ fn constructors() -> crate::NcResult<()> {
|
|||||||
let _c1 = NcCell::new();
|
let _c1 = NcCell::new();
|
||||||
let _c2 = NcCell::with_char7b('C');
|
let _c2 = NcCell::with_char7b('C');
|
||||||
|
|
||||||
let mut nc = Nc::new()?;
|
let nc = Notcurses::new()?;
|
||||||
let plane = NcPlane::new(&mut nc, 0, 0, 10, 10)?;
|
let plane = NcPlane::new(nc, 0, 0, 10, 10)?;
|
||||||
let _c3 = NcCell::with_char('௵', plane);
|
let _c3 = NcCell::with_char('௵', plane);
|
||||||
|
nc.stop()?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
@ -1,29 +1,19 @@
|
|||||||
//! `NcDirect`
|
//! `NcDirect`
|
||||||
|
|
||||||
// --- ---------------------------------------------------------
|
// total: 47
|
||||||
// col 0:
|
// ---------------------------------------------------
|
||||||
// --------------
|
// (X) 1 : wont do
|
||||||
// 4 X: wont do
|
|
||||||
// ~: WIP
|
|
||||||
//
|
//
|
||||||
// col 1: 43
|
// (f) 42 : unsafe ffi function exported by bindgen
|
||||||
// --------------
|
// (w) 0 : safely wrapped ffi function
|
||||||
// 39 f: ffi function imported by bindgen
|
// (r) 4 : static function manually reimplemented
|
||||||
// F: ffi function wrapped safely
|
|
||||||
// 4 r: static function reimplemented in Rust
|
|
||||||
//
|
//
|
||||||
// col 2: 43
|
// (m) 45 : method implemented
|
||||||
// --------------
|
// (~) 1 : work in progress
|
||||||
// 41 m: impl as an `NcDirect` method
|
|
||||||
// 2 M: impl for the `NcD` wrapper struct too
|
|
||||||
//
|
|
||||||
// col 3:
|
|
||||||
// --------------
|
|
||||||
// t: tests done for the ffi or reimplemented funtion
|
|
||||||
// T: tests done also for the m method
|
|
||||||
// Ŧ: tests done also for the M method wrapper struct
|
|
||||||
// --- ---------------------------------------------------------
|
|
||||||
//
|
//
|
||||||
|
// (t) 0 : unit test done for the function
|
||||||
|
// (T) 0 : unit test done also for the method
|
||||||
|
// ---------------------------------------------------
|
||||||
// fm ncdirect_bg_default
|
// fm ncdirect_bg_default
|
||||||
// fm ncdirect_bg_palindex
|
// fm ncdirect_bg_palindex
|
||||||
// fm ncdirect_bg_rgb
|
// fm ncdirect_bg_rgb
|
||||||
@ -52,7 +42,7 @@
|
|||||||
// fm ncdirect_flush
|
// fm ncdirect_flush
|
||||||
// fm ncdirect_getc
|
// fm ncdirect_getc
|
||||||
// fm ncdirect_hline_interp
|
// fm ncdirect_hline_interp
|
||||||
// fM ncdirect_init
|
// fm ncdirect_init
|
||||||
// fm ncdirect_inputready_fd
|
// fm ncdirect_inputready_fd
|
||||||
// fm ncplane_on_styles
|
// fm ncplane_on_styles
|
||||||
// fm ncplane_off_styles
|
// fm ncplane_off_styles
|
||||||
@ -65,10 +55,7 @@
|
|||||||
// fm ncdirect_render_image
|
// fm ncdirect_render_image
|
||||||
// fm ncdirect_rounded_box
|
// fm ncdirect_rounded_box
|
||||||
// fm ncplane_set_styles
|
// fm ncplane_set_styles
|
||||||
// fM ncdirect_stop
|
// fm ncdirect_stop
|
||||||
//X ncdirect_styles_off // deprecated
|
|
||||||
//X ncdirect_styles_on // deprecated
|
|
||||||
//X ncdirect_styles_set // deprecated
|
|
||||||
// fm ncdirect_vline_interp
|
// fm ncdirect_vline_interp
|
||||||
// rm ncdirect_bg_rgb8
|
// rm ncdirect_bg_rgb8
|
||||||
// rm ncdirect_fg_rgb8
|
// rm ncdirect_fg_rgb8
|
||||||
@ -80,10 +67,8 @@ mod test;
|
|||||||
|
|
||||||
mod methods;
|
mod methods;
|
||||||
mod reimplemented;
|
mod reimplemented;
|
||||||
mod wrapper;
|
|
||||||
|
|
||||||
pub use reimplemented::*;
|
pub use reimplemented::*;
|
||||||
pub use wrapper::*;
|
|
||||||
|
|
||||||
/// Minimal notcurses instance for styling text.
|
/// Minimal notcurses instance for styling text.
|
||||||
///
|
///
|
||||||
|
@ -1,67 +0,0 @@
|
|||||||
//! `NcD` wrapper struct and traits implementations.
|
|
||||||
|
|
||||||
use std::ops::{Deref, DerefMut};
|
|
||||||
|
|
||||||
use crate::{raw_wrap, NcDirect, NcResult};
|
|
||||||
|
|
||||||
/// Safe wrapper around [NcDirect], minimal notcurses instance for styling text.
|
|
||||||
#[derive(Debug)]
|
|
||||||
pub struct NcD<'a> {
|
|
||||||
pub(crate) raw: &'a mut NcDirect,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a> AsRef<NcDirect> for NcD<'a> {
|
|
||||||
fn as_ref(&self) -> &NcDirect {
|
|
||||||
self.raw
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a> AsMut<NcDirect> for NcD<'a> {
|
|
||||||
fn as_mut(&mut self) -> &mut NcDirect {
|
|
||||||
self.raw
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a> Deref for NcD<'a> {
|
|
||||||
type Target = NcDirect;
|
|
||||||
|
|
||||||
fn deref(&self) -> &Self::Target {
|
|
||||||
self.as_ref()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a> DerefMut for NcD<'a> {
|
|
||||||
fn deref_mut(&mut self) -> &mut Self::Target {
|
|
||||||
self.as_mut()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a> Drop for NcD<'a> {
|
|
||||||
/// Destroys the NcD context.
|
|
||||||
fn drop(&mut self) {
|
|
||||||
let _ = self.raw.stop();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// # Constructors and methods overriden from NcDirect
|
|
||||||
impl<'a> NcD<'a> {
|
|
||||||
// wrap constructors
|
|
||||||
|
|
||||||
/// New NcD (without banners).
|
|
||||||
pub fn new() -> NcResult<Self> {
|
|
||||||
raw_wrap![NcDirect::new()]
|
|
||||||
}
|
|
||||||
|
|
||||||
/// New NcD, expects `NCOPTION_*` flags.
|
|
||||||
pub fn with_flags(flags: u64) -> NcResult<Self> {
|
|
||||||
raw_wrap![NcDirect::with_flags(flags)]
|
|
||||||
}
|
|
||||||
|
|
||||||
// disable destructor
|
|
||||||
|
|
||||||
/// Since NcD already implements [Drop](#impl-Drop),
|
|
||||||
/// this function is made no-op.
|
|
||||||
pub fn stop(&mut self) -> NcResult<()> {
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
}
|
|
@ -22,10 +22,11 @@
|
|||||||
//! use libnotcurses_sys::*;
|
//! use libnotcurses_sys::*;
|
||||||
//!
|
//!
|
||||||
//! fn main() -> NcResult<()> {
|
//! fn main() -> NcResult<()> {
|
||||||
//! let mut nc = Nc::with_flags(NCOPTION_NO_ALTERNATE_SCREEN)?;
|
//! let mut nc = Notcurses::with_flags(NCOPTION_NO_ALTERNATE_SCREEN)?;
|
||||||
//! let plane = nc.stdplane();
|
//! let plane = nc.stdplane();
|
||||||
//! plane.putstr("hello world")?;
|
//! plane.putstr("hello world")?;
|
||||||
//! nc.render()?;
|
//! nc.render()?;
|
||||||
|
//! nc.stop()?;
|
||||||
//! Ok(())
|
//! Ok(())
|
||||||
//! }
|
//! }
|
||||||
//! ```
|
//! ```
|
||||||
|
@ -1,29 +1,19 @@
|
|||||||
//! `Notcurses`
|
//! `Notcurses`
|
||||||
|
|
||||||
// --- -------------------------------------------------------------------------
|
// total: 51
|
||||||
// col 0: 3
|
// ---------------------------------------------------
|
||||||
// --------------
|
// (X) 1 : wont do
|
||||||
// 1 X: wont do
|
|
||||||
// 2 ~: WIP
|
|
||||||
//
|
//
|
||||||
// col 1: 50
|
// (f) 44 : unsafe ffi function exported by bindgen
|
||||||
// --------------
|
// (w) 0 : safely wrapped ffi function
|
||||||
// 44 f: ffi function imported by bindgen
|
// (r) 6 : static function manually reimplemented
|
||||||
// F: ffi function wrapped safely
|
|
||||||
// 6 r: static function reimplemented in Rust
|
|
||||||
//
|
//
|
||||||
// col 2: 48
|
// (m) 38 : method implemented
|
||||||
// --------------
|
// (~) 3 : work in progress
|
||||||
// 38 m: impl as a `Notcurses` method
|
|
||||||
// 10 M: impl for the `Nc` wrapper struct too
|
|
||||||
//
|
|
||||||
// col 3: 13
|
|
||||||
// --------------
|
|
||||||
// 13 t: tests done for the ffi or reimplemented funtion
|
|
||||||
// T: tests done also for the m method
|
|
||||||
// Ŧ: tests done also for the M method wrapper struct
|
|
||||||
// --- -------------------------------------------------------------------------
|
|
||||||
//
|
//
|
||||||
|
// (t) 13 : unit test done for the function
|
||||||
|
// (T) 0 : unit test done also for the method
|
||||||
|
// ---------------------------------------------------
|
||||||
// fm notcurses_at_yx
|
// fm notcurses_at_yx
|
||||||
// fm notcurses_bottom
|
// fm notcurses_bottom
|
||||||
// fm notcurses_canbraille
|
// fm notcurses_canbraille
|
||||||
@ -35,18 +25,18 @@
|
|||||||
// fmt notcurses_cantruecolor
|
// fmt notcurses_cantruecolor
|
||||||
// fmt notcurses_canutf8
|
// fmt notcurses_canutf8
|
||||||
// fm notcurses_check_pixel_support
|
// fm notcurses_check_pixel_support
|
||||||
// f~ notcurses_core_init
|
//~f notcurses_core_init
|
||||||
// fm notcurses_cursor_disable
|
// fm notcurses_cursor_disable
|
||||||
// fm notcurses_cursor_enable
|
// fm notcurses_cursor_enable
|
||||||
// fmt notcurses_debug
|
// fmt notcurses_debug
|
||||||
// fm notcurses_debug_caps
|
// fm notcurses_debug_caps
|
||||||
// fmt notcurses_drop_planes
|
// fmt notcurses_drop_planes
|
||||||
// fm notcurses_getc
|
// fm notcurses_getc
|
||||||
// fMt notcurses_init
|
// fmt notcurses_init
|
||||||
// fm notcurses_inputready_fd
|
// fm notcurses_inputready_fd
|
||||||
// fM notcurses_lex_blitter
|
// fm notcurses_lex_blitter
|
||||||
// fM notcurses_lex_margins
|
// fm notcurses_lex_margins
|
||||||
// fM notcurses_lex_scalemode
|
// fm notcurses_lex_scalemode
|
||||||
// fm notcurses_linesigs_disable
|
// fm notcurses_linesigs_disable
|
||||||
// fm notcurses_linesigs_enable
|
// fm notcurses_linesigs_enable
|
||||||
// fm notcurses_mouse_disable
|
// fm notcurses_mouse_disable
|
||||||
@ -61,16 +51,15 @@
|
|||||||
// fm notcurses_stats_reset
|
// fm notcurses_stats_reset
|
||||||
// fm notcurses_stdplane
|
// fm notcurses_stdplane
|
||||||
// fm notcurses_stdplane_const
|
// fm notcurses_stdplane_const
|
||||||
// fMt notcurses_stop
|
// fmt notcurses_stop
|
||||||
// fM notcurses_str_blitter
|
// fm notcurses_str_blitter
|
||||||
// fM notcurses_str_scalemode
|
// fm notcurses_str_scalemode
|
||||||
// fm notcurses_supported_styles
|
// fm notcurses_supported_styles
|
||||||
// fm notcurses_top
|
// fm notcurses_top
|
||||||
//X notcurses_ucs32_to_utf8 (not needed in rust)
|
//X notcurses_ucs32_to_utf8 (not needed in rust)
|
||||||
// fMt notcurses_version
|
// fmt notcurses_version
|
||||||
// fM notcurses_version_components
|
// fm notcurses_version_components
|
||||||
//
|
// rmt notcurses_align
|
||||||
// rMt notcurses_align
|
|
||||||
// rm notcurses_getc_blocking
|
// rm notcurses_getc_blocking
|
||||||
// rm notcurses_getc_nblock
|
// rm notcurses_getc_nblock
|
||||||
//~r notcurses_stddim_yx // multiple mutable references errors
|
//~r notcurses_stddim_yx // multiple mutable references errors
|
||||||
@ -83,12 +72,10 @@ mod test;
|
|||||||
mod helpers;
|
mod helpers;
|
||||||
mod methods;
|
mod methods;
|
||||||
mod reimplemented;
|
mod reimplemented;
|
||||||
mod wrapper;
|
|
||||||
|
|
||||||
#[allow(unused_imports)]
|
#[allow(unused_imports)]
|
||||||
pub(crate) use helpers::*;
|
pub(crate) use helpers::*;
|
||||||
pub use reimplemented::*;
|
pub use reimplemented::*;
|
||||||
pub use wrapper::*;
|
|
||||||
|
|
||||||
/// Notcurses builds atop the terminfo abstraction layer to
|
/// Notcurses builds atop the terminfo abstraction layer to
|
||||||
/// provide reasonably portable vivid character displays.
|
/// provide reasonably portable vivid character displays.
|
||||||
|
@ -1,137 +0,0 @@
|
|||||||
//! `Nc` wrapper struct and traits implementations.
|
|
||||||
|
|
||||||
use std::ops::{Deref, DerefMut};
|
|
||||||
|
|
||||||
use crate::{
|
|
||||||
raw_wrap, NcAlign, NcBlitter, NcDim, NcLogLevel, NcResult, NcScale, Notcurses, NotcursesOptions,
|
|
||||||
};
|
|
||||||
|
|
||||||
/// Safe wrapper around [Notcurses], the main struct of the TUI library.
|
|
||||||
#[derive(Debug)]
|
|
||||||
pub struct Nc<'a> {
|
|
||||||
pub(crate) raw: &'a mut Notcurses,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a> AsRef<Notcurses> for Nc<'a> {
|
|
||||||
fn as_ref(&self) -> &Notcurses {
|
|
||||||
self.raw
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a> AsMut<Notcurses> for Nc<'a> {
|
|
||||||
fn as_mut(&mut self) -> &mut Notcurses {
|
|
||||||
self.raw
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a> Deref for Nc<'a> {
|
|
||||||
type Target = Notcurses;
|
|
||||||
|
|
||||||
fn deref(&self) -> &Self::Target {
|
|
||||||
self.as_ref()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a> DerefMut for Nc<'a> {
|
|
||||||
fn deref_mut(&mut self) -> &mut Self::Target {
|
|
||||||
self.as_mut()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a> Drop for Nc<'a> {
|
|
||||||
/// Destroys the Nc context.
|
|
||||||
fn drop(&mut self) {
|
|
||||||
let _ = self.raw.stop();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// # Constructors and methods overriden from Notcurses
|
|
||||||
impl<'a> Nc<'a> {
|
|
||||||
// wrap constructors
|
|
||||||
|
|
||||||
/// New Nc (without banners).
|
|
||||||
pub fn new() -> NcResult<Self> {
|
|
||||||
raw_wrap![Notcurses::new()]
|
|
||||||
}
|
|
||||||
|
|
||||||
/// New Nc, with banners.
|
|
||||||
pub fn with_banners() -> NcResult<Self> {
|
|
||||||
raw_wrap![Notcurses::with_banners()]
|
|
||||||
}
|
|
||||||
|
|
||||||
/// New Nc, without an alternate screen (nor banners).
|
|
||||||
pub fn without_altscreen() -> NcResult<Self> {
|
|
||||||
raw_wrap![Notcurses::without_altscreen()]
|
|
||||||
}
|
|
||||||
|
|
||||||
/// New Nc, expects `NCOPTION_*` flags.
|
|
||||||
pub fn with_flags(flags: u64) -> NcResult<Self> {
|
|
||||||
raw_wrap![Notcurses::with_flags(flags)]
|
|
||||||
}
|
|
||||||
|
|
||||||
/// New Nc, expects [NotcursesOptions].
|
|
||||||
pub fn with_options(options: NotcursesOptions) -> NcResult<Self> {
|
|
||||||
raw_wrap![Notcurses::with_options(options)]
|
|
||||||
}
|
|
||||||
|
|
||||||
/// New Nc, expects [NcLogLevel] and flags.
|
|
||||||
pub fn with_debug(loglevel: NcLogLevel, flags: u64) -> NcResult<Self> {
|
|
||||||
raw_wrap![Notcurses::with_debug(loglevel, flags)]
|
|
||||||
}
|
|
||||||
|
|
||||||
// disable destructor
|
|
||||||
|
|
||||||
/// Since Nc already implements [Drop](#impl-Drop),
|
|
||||||
/// this function is made no-op.
|
|
||||||
pub fn stop(&mut self) -> NcResult<()> {
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
// wrap associated functions
|
|
||||||
|
|
||||||
/// Returns the offset into `availcols` at which `cols` ought be output given
|
|
||||||
/// the requirements of `align`.
|
|
||||||
pub fn align(availcols: NcDim, align: NcAlign, cols: NcDim) -> NcResult<()> {
|
|
||||||
Notcurses::align(availcols, align, cols)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Gets the name of an [NcBlitter] blitter.
|
|
||||||
pub fn str_blitter(blitter: NcBlitter) -> String {
|
|
||||||
Notcurses::str_blitter(blitter)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Gets the name of an [NcScale] scaling mode.
|
|
||||||
pub fn str_scalemode(scalemode: NcScale) -> String {
|
|
||||||
Notcurses::str_scalemode(scalemode)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns an [NcBlitter] from a string representation.
|
|
||||||
pub fn lex_blitter(op: &str) -> NcResult<NcBlitter> {
|
|
||||||
Notcurses::lex_blitter(op)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Lexes a margin argument according to the standard Notcurses definition.
|
|
||||||
///
|
|
||||||
/// There can be either a single number, which will define all margins equally,
|
|
||||||
/// or there can be four numbers separated by commas.
|
|
||||||
///
|
|
||||||
pub fn lex_margins(op: &str, options: &mut NotcursesOptions) -> NcResult<()> {
|
|
||||||
Notcurses::lex_margins(op, options)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns an [NcScale] from a string representation.
|
|
||||||
pub fn lex_scalemode(op: &str) -> NcResult<NcScale> {
|
|
||||||
Notcurses::lex_scalemode(op)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns a human-readable string describing the running Nc version.
|
|
||||||
pub fn version() -> String {
|
|
||||||
Notcurses::version()
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns the running Notcurses version components
|
|
||||||
/// (major, minor, patch, tweak).
|
|
||||||
pub fn version_components() -> (u32, u32, u32, u32) {
|
|
||||||
Notcurses::version_components()
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user