rust: add new wrapper type over notcurses struct.

Create new wrapping types that can safely encapsulate the mutable references,
and implement Drop and automatic (de)referencing.

- Notcurses
  - rename Notcurses* to NcNotcurses*.
  - rename NotcursesOptions to NcNotcursesOptions.
  - new Notcurses struct.
    - implement Drop, AsRef, AsMut, Deref & DerefMut.
    - override stop method to be no-op.
    - reimplement constructors and associated methods.
  - remove without_altscreen_with_banners constructor.
- update examples and tests.
- rustfmt.
pull/1279/head
joseLuís 4 years ago
parent af07822d35
commit 6b2805937d

@ -16,10 +16,8 @@ fn main() -> NcResult<()> {
let rows = ncd.dim_y();
println!("terminal size (rows, cols): {}, {}", rows, cols);
let mut channels = NcChannelPair::combine(
NcChannel::with_rgb(0xAA2244),
NcChannel::with_rgb(0x112233),
);
let mut channels =
NcChannelPair::combine(NcChannel::with_rgb(0xAA2244), NcChannel::with_rgb(0x112233));
ncd.putstr(channels, "The current coordinates are")?;
for _n in 0..40 {
@ -41,7 +39,9 @@ fn main() -> NcResult<()> {
ncd.putstr(channels, &format!(" ({},{})\n", cy, cx))?;
sleep![1];
let sentence = vec!["And", "now", "I", "will", "clear", "the", "screen", ".", ".", "."];
let sentence = vec![
"And", "now", "I", "will", "clear", "the", "screen", ".", ".", ".",
];
for word in sentence {
channels.set_fg_rgb(channels.fg_rgb().wrapping_sub(0x050505));
channels.set_bg_rgb(channels.bg_rgb().wrapping_add(0x090909));

@ -4,8 +4,8 @@
//!
//! NOTE: This example uses the C style with functions.
use libnotcurses_sys::*;
use core::ptr::{null, null_mut};
use libnotcurses_sys::*;
fn main() {
unsafe {
@ -29,8 +29,10 @@ fn render_image(ncd: &mut NcDirect, blit: NcBlitter) {
NCSCALE_NONE,
) != 0
{
panic!("ERROR: ncdirect_render_image(). Make sure you \
are running this example from the examples folder");
panic!(
"ERROR: ncdirect_render_image(). Make sure you \
are running this example from the examples folder"
);
}
}
}

@ -7,26 +7,23 @@
use libnotcurses_sys::*;
fn main() -> NcResult<()> {
let ncd = NcDirect::new()?;
let ncd = NcDirect::new()?;
render_image(ncd, NCBLIT_1x1)?;
render_image(ncd, NCBLIT_2x1)?;
render_image(ncd, NCBLIT_BRAILLE)?;
render_image(ncd, NCBLIT_1x1)?;
render_image(ncd, NCBLIT_2x1)?;
render_image(ncd, NCBLIT_BRAILLE)?;
ncd.stop()?;
Ok(())
ncd.stop()?;
Ok(())
}
fn render_image(ncd: &mut NcDirect, blit: NcBlitter) -> NcResult<()>{
if let Err(nc_error) = ncd.render_image(
"image-16x16.png",
NCALIGN_CENTER,
blit,
NCSCALE_NONE,
) {
return Err(NcError::with_msg(nc_error.int,
fn render_image(ncd: &mut NcDirect, blit: NcBlitter) -> NcResult<()> {
if let Err(nc_error) = ncd.render_image("image-16x16.png", NCALIGN_CENTER, blit, NCSCALE_NONE) {
return Err(NcError::with_msg(
nc_error.int,
"ERROR: ncdirect_render_image(). Make sure you \
are running this example from the examples folder"));
are running this example from the examples folder",
));
}
Ok(())
}

@ -1,17 +1,15 @@
use libnotcurses_sys::*;
fn main() -> NcResult<()> {
let nc = Notcurses::new()?;
let mut nc = Notcurses::new()?;
let stdplane = nc.stdplane()?;
for ch in "Initializing cells...".chars() {
let cell = NcCell::with_char7b(ch);
stdplane.putc(&cell)?;
sleep![0, 40];
nc.render()?;
rsleep![&mut nc, 0, 40];
}
sleep![0, 900];
nc.stop()?;
Ok(())
}

@ -6,11 +6,9 @@
use libnotcurses_sys::*;
fn main() -> NcResult<()> {
let nc = Notcurses::with_flags(
NCOPTION_SUPPRESS_BANNERS
| NCOPTION_NO_WINCH_SIGHANDLER
| NCOPTION_NO_QUIT_SIGHANDLERS
)?;
let mut nc = Notcurses::with_flags(
NCOPTION_SUPPRESS_BANNERS | NCOPTION_NO_WINCH_SIGHANDLER | NCOPTION_NO_QUIT_SIGHANDLERS,
)?;
// doesn't seem to be necessary:
// let ready = unsafe { notcurses_inputready_fd(nc) };
@ -21,13 +19,13 @@ fn main() -> NcResult<()> {
let mut input = NcInput::new_empty();
loop {
let key = notcurses_getc_nblock(nc, &mut input);
let key = notcurses_getc_nblock(&mut nc, &mut input);
if key as i32 != -1 {
println!("'{0}' ({1:x})\n{2:?}", key, key as u32, input);
}
rsleep![nc, 0, 10];
rsleep![&mut nc, 0, 10];
match key {
NCKEY_F01 => break,
@ -37,7 +35,7 @@ fn main() -> NcResult<()> {
println!("\nExiting...");
rsleep![nc, 1, 500];
rsleep![&mut nc, 1, 500];
nc.stop()?;
Ok(())
}

@ -3,8 +3,7 @@
use libnotcurses_sys::*;
fn main() -> NcResult<()> {
let nc = Notcurses::new()?;
let mut nc = Notcurses::new()?;
let plane = nc.stdplane()?;
plane.set_scrolling(true);
@ -14,9 +13,10 @@ fn main() -> NcResult<()> {
plane.putchar(wc)?;
wc = core::char::from_u32(wc as u32 + 1).expect("invalid char");
if wc == '\u{9fa5}' { // 龣
// 龣
if wc == '\u{9fa5}' {
wc = '\u{4e00}';
}
rsleep![nc, 0, 0, 50];
rsleep![&mut nc, 0, 0, 30];
}
}

@ -3,7 +3,7 @@
use libnotcurses_sys::*;
fn main() -> NcResult<()> {
let nc = Notcurses::new()?;
let mut nc = Notcurses::new()?;
nc.mouse_enable()?;
let mut demo_items = [
@ -55,7 +55,7 @@ fn main() -> NcResult<()> {
" -=+ menu poc. press q to exit +=-",
)?;
run_menu(nc, menu_top)?;
run_menu(&mut nc, menu_top)?;
stdplane.erase(); // is this needed?
@ -67,9 +67,8 @@ fn main() -> NcResult<()> {
mopts.flags |= NCMENU_OPTION_BOTTOM;
let menu_bottom = NcMenu::new(stdplane, mopts)?;
run_menu(nc, menu_bottom)?;
run_menu(&mut nc, menu_bottom)?;
nc.stop()?;
Ok(())
}
@ -106,7 +105,7 @@ fn run_menu(nc: &mut Notcurses, menu: &mut NcMenu) -> NcResult<()> {
menu.destroy()?;
selplane.destroy()?;
return Ok(());
},
}
NCKEY_ENTER => {
if let Some(selection) = menu.selected(Some(&mut ni)) {
match selection.as_ref() {
@ -115,11 +114,11 @@ fn run_menu(nc: &mut Notcurses, menu: &mut NcMenu) -> NcResult<()> {
selplane.destroy()?;
return Ok(());
}
_ => ()
_ => (),
}
}
}
_ => ()
_ => (),
}
}

@ -3,10 +3,10 @@
use libc::strcmp;
use crate::{
cstring, cell_release, NcAlphaBits, NcCell, NcChannel, NcChannelPair, NcColor, NcEgc, NcIntResult,
NcPaletteIndex, NcPlane, NcRgb, NcStyleMask, NCCELL_ALPHA_OPAQUE, NCCELL_BGDEFAULT_MASK,
NCCELL_BG_PALETTE, NCCELL_FGDEFAULT_MASK, NCCELL_FG_PALETTE, NCCELL_NOBACKGROUND_MASK,
NCCELL_WIDEASIAN_MASK, NCRESULT_ERR, NCRESULT_OK, NCSTYLE_MASK,
cell_release, cstring, NcAlphaBits, NcCell, NcChannel, NcChannelPair, NcColor, NcEgc,
NcIntResult, NcPaletteIndex, NcPlane, NcRgb, NcStyleMask, NCCELL_ALPHA_OPAQUE,
NCCELL_BGDEFAULT_MASK, NCCELL_BG_PALETTE, NCCELL_FGDEFAULT_MASK, NCCELL_FG_PALETTE,
NCCELL_NOBACKGROUND_MASK, NCCELL_WIDEASIAN_MASK, NCRESULT_ERR, NCRESULT_OK, NCSTYLE_MASK,
};
// Alpha -----------------------------------------------------------------------

@ -10,9 +10,8 @@ fn constructors() -> crate::NcResult<()> {
let _c1 = NcCell::new();
let _c2 = NcCell::with_char7b('C');
let nc = Notcurses::new()?;
let plane = NcPlane::new(nc, 0, 0, 10, 10)?;
let mut nc = Notcurses::new()?;
let plane = NcPlane::new(&mut nc, 0, 0, 10, 10)?;
let _c3 = NcCell::with_char('௵', plane);
nc.stop()?;
Ok(())
}

@ -164,7 +164,10 @@ impl NcDirect {
pub fn palette_size(&self) -> NcResult<u32> {
let res = unsafe { crate::ncdirect_palette_size(self) };
if res == 1 {
return Err(NcError::with_msg(1, "No color support ← NcDirect.palette_size()"));
return Err(NcError::with_msg(
1,
"No color support ← NcDirect.palette_size()",
));
}
Ok(res)
}
@ -550,8 +553,10 @@ impl NcDirect {
ctlword,
)
},
&format!("NcDirect.box({:0X}, {:0X}, {:0X}, {:0X}, {:?}, {}, {}, {})",
ul, ur, ll, lr, wchars, y_len, x_len, ctlword)
&format!(
"NcDirect.box({:0X}, {:0X}, {:0X}, {:0X}, {:?}, {}, {}, {})",
ul, ur, ll, lr, wchars, y_len, x_len, ctlword
)
]
}

@ -11,7 +11,7 @@
use std::ffi::c_void;
use crate::{NcIntResult, NcPlane, NcTime, Notcurses};
use crate::{NcIntResult, NcNotcurses, NcPlane, NcTime};
/// Called for each fade iteration on the NcPlane.
///
@ -20,7 +20,7 @@ use crate::{NcIntResult, NcPlane, NcTime, Notcurses};
///
/// The recommended absolute display time target is passed in 'tspec'.
pub type NcFadeCb = Option<
unsafe extern "C" fn(*mut Notcurses, *mut NcPlane, *const NcTime, *mut c_void) -> NcIntResult,
unsafe extern "C" fn(*mut NcNotcurses, *mut NcPlane, *const NcTime, *mut c_void) -> NcIntResult,
>;
/// Context for a palette fade operation

@ -1,50 +1,52 @@
//! `libnotcurses-sys` is a *close to the metal* Rust wrapper for the [notcurses
//! `libnotcurses-sys` is a Rust wrapper for the [notcurses
//! C library](https://www.github.com/dankamongmen/notcurses/)
//!
//! The bindings are still incomplete, and a work in progress.
//! *This is a work in progress.*
//!
//! # Ways of using this library
//! # How to use this library
//!
//! Since this library is built with several layers of zero-overhead
//! abstractions over the FFI functions, there are multiple ways to use it.
//!
//! But basically there are two ways:
//!
//! ## 1. The Rust way
//!
//! Use the safely wrapped types, their methods and constructors:
//!
//! The *rusty* way is to use the provided methods and constructors:
//! ```rust
//! use libnotcurses_sys::*;
//!
//! fn main() -> NcResult<()> {
//! let nc = Notcurses::without_altscreen()?;
//! let mut nc = Notcurses::with_flags(NCOPTION_NO_ALTERNATE_SCREEN)?;
//! let plane = nc.stdplane()?;
//! plane.putstr("hello world")?;
//! nc.render()?;
//! nc.stop()?;
//! Ok(())
//! }
//! ```
//! Specifically, and for example:
//!
//! You can also use the C API functions directly over the constructed types.
//! [`Notcurses`] is the safe wrapper over [`NcNotcurses`], which is the
//! `&mut` reference over the raw `*mut` pointer received from FFI.
//!
//! Note that some of the functions will be unsafe. And you may also need
//! to (de)reference mutable pointers.
//! This is mainly due to the interaction between the manually reimplemented
//! static inline functions that uses (mutable) references, and the C API
//! functions automatically wrapped by bindgen that uses (mutable) raw pointers.
//! Notcurses implements the [Drop], [AsRef], [AsMut], [Deref][std::ops::Deref]
//! & [DerefMut][std::ops::DerefMut] traits.
//!
//! There are plans to manually wrap all the C API functions, in order to
//! achieve better ergonomics and consistent syntax.
//! ```rust
//! use libnotcurses_sys::*;
//! Most methods are directly implemented for NcNotcurses,
//! and automatically available also from Notcurses.
//!
//! fn main() {
//! let options = NotcursesOptions::with_flags(NCOPTION_NO_ALTERNATE_SCREEN);
//! unsafe {
//! let nc = notcurses_init(&options, core::ptr::null_mut());
//! let plane = notcurses_stdplane(nc);
//! ncplane_putstr(&mut *plane, "hello world");
//! notcurses_render(nc);
//! notcurses_stop(nc);
//! }
//! }
//! ```
//! The destructor ([notcurses_stop()]) is called automatically at the end
//! of its scope, so you don't ever have to call it by hand.
//!
//! The Rust style methods manage errors by means of returning an
//! [`NcResult`]`<T, `[`NcError`]`>`, for painless handling.
//!
//! ## 2. The C way
//!
//! You can also use the C API functions directly in a very similar way
//! as the underlying C library is used.
//!
//! You can also use it even more closely to the C API if you wish:
//! ```rust
//! use core::ptr::{null, null_mut};
//! use libnotcurses_sys::*;
@ -60,6 +62,7 @@
//! margin_l: 0,
//! flags: NCOPTION_NO_ALTERNATE_SCREEN,
//! };
//! // NOTE: there's missing manual checking of return values for errors.
//! unsafe {
//! let nc = notcurses_init(&options, null_mut());
//! let plane = notcurses_stdplane(nc);
@ -69,18 +72,10 @@
//! }
//!
//! ```
//! ## About this library
//!
//! 1. There are no Drop trait implementations, therefore you must manually stop
//! each context before it goes out of scope ([Notcurses], [NcDirect]), and
//! should manually destroy [NcPlane]s, [NcMenu]s… when no longer needed.
//!
//! 2. The C style functions handle errors by the means of returning an i32 value
//! aliased to [NcIntResult]. But the Rust style methods handle errors more
//! idiomatically using [NcResult] and [NcError].
//!
//! It requires the use of unsafe.
//!
//! [Macros][#macros] are
//! The C style functions handle errors by the means of returning an i32 value
//! aliased to [NcIntResult].
//!
//! ## The `notcurses` C API docs
//!

@ -5,7 +5,7 @@
#[allow(unused_imports)]
// enjoy briefer doc comments
use crate::{NcDirect, NcError, NcResult, Notcurses, NCRESULT_ERR, NCRESULT_OK};
use crate::{NcDirect, NcError, NcNotcurses, NcResult, NCRESULT_ERR, NCRESULT_OK};
// Sleep, Render & Flush Macros ------------------------------------------------
@ -32,9 +32,9 @@ macro_rules! sleep {
};
}
/// Notcurses.[render][Notcurses#method.render]\(`nc`\)? plus [sleep]!(`sleep_args`).
/// NcNotcurses.[render][NcNotcurses#method.render]\(`nc`\)? plus [sleep]!(`sleep_args`).
///
/// Renders the `$nc` [Notcurses] object and, if there's no error,
/// Renders the `$nc` [NcNotcurses] object and, if there's no error,
/// calls the sleep macro with the rest of the arguments.
///
/// Returns [NcResult].
@ -42,7 +42,7 @@ macro_rules! sleep {
macro_rules! rsleep {
($nc:expr, $( $sleep_args:expr),+ ) => {
// Rust style, with methods & NcResult
Notcurses::render($nc)?;
NcNotcurses::render($nc)?;
sleep![$( $sleep_args ),+];
};
($nc:expr, $( $sleep_args:expr),+ ,) => {
@ -91,7 +91,7 @@ macro_rules! cstring_mut {
macro_rules! rstring {
($s:expr) => {
unsafe { std::ffi::CStr::from_ptr($s).to_str().unwrap() }
// possible alternative
// possible alternative:
// unsafe { std::ffi::CStr::from_ptr($s).to_string_lossy() }
};
}
@ -203,3 +203,14 @@ macro_rules! error_str {
error_str![$str, ""];
};
}
/// Returns an NcResult<Self { raw: T }> from an NcResult<T>.
#[macro_export]
macro_rules! raw_wrap {
($res:expr) => {
match $res {
Ok(raw) => return Ok(Self { raw }),
Err(e) => return Err(e),
}
};
}

@ -1,10 +1,10 @@
use crate::{notcurses_init, Notcurses, NotcursesOptions, NCOPTION_SUPPRESS_BANNERS};
use crate::{notcurses_init, NcNotcurses, NcNotcursesOptions, NCOPTION_SUPPRESS_BANNERS};
/// Helper function for initializing Notcurses on C style tests.
/// Helper function for initializing NcNotcurses on C style tests.
#[allow(dead_code)]
pub(crate) unsafe fn notcurses_init_test<'a>() -> &'a mut Notcurses {
pub(crate) unsafe fn notcurses_init_test<'a>() -> &'a mut NcNotcurses {
&mut *notcurses_init(
&NotcursesOptions::with_flags(NCOPTION_SUPPRESS_BANNERS),
&NcNotcursesOptions::with_flags(NCOPTION_SUPPRESS_BANNERS),
core::ptr::null_mut(),
)
}

@ -1,22 +1,22 @@
//! `Notcurses*` methods and associated functions.
//! `NcNotcurses*` methods and associated functions.
use core::ptr::{null, null_mut};
use crate::{
cstring, error, error_ref_mut, notcurses_init, rstring, NcAlign, NcBlitter, NcChannelPair,
NcDimension, NcEgc, NcError, NcFile, NcInput, NcLogLevel, NcPlane, NcResult, NcScale,
NcSignalSet, NcStats, NcStyleMask, NcTime, Notcurses, NotcursesOptions,
NcDimension, NcEgc, NcError, NcFile, NcInput, NcLogLevel, NcNotcurses, NcNotcursesOptions,
NcPlane, NcResult, NcScale, NcSignalSet, NcStats, NcStyleMask, NcTime,
NCOPTION_NO_ALTERNATE_SCREEN, NCOPTION_SUPPRESS_BANNERS, NCRESULT_ERR,
};
/// # `NotcursesOptions` Constructors
impl NotcursesOptions {
/// New NotcursesOptions.
/// # `NcNotcursesOptions` Constructors
impl NcNotcursesOptions {
/// New NcNotcursesOptions.
pub const fn new() -> Self {
Self::with_all_options(0, 0, 0, 0, 0, 0)
}
/// New NotcursesOptions, with margins.
/// New NcNotcursesOptions, with margins.
pub const fn with_margins(
top: NcDimension,
right: NcDimension,
@ -26,12 +26,12 @@ impl NotcursesOptions {
Self::with_all_options(0, top, right, bottom, left, 0)
}
/// New NotcursesOptions, with flags.
/// New NcNotcursesOptions, with flags.
pub const fn with_flags(flags: u64) -> Self {
Self::with_all_options(0, 0, 0, 0, 0, flags)
}
/// New NotcursesOptions, with all the options.
/// New NcNotcursesOptions, with all the options.
///
/// ## Arguments
///
@ -83,51 +83,46 @@ impl NotcursesOptions {
}
}
/// # `Notcurses` Constructors
impl Notcurses {
/// New Notcurses (without banners).
pub fn new<'a>() -> NcResult<&'a mut Notcurses> {
/// # `NcNotcurses` Constructors
impl NcNotcurses {
/// New NcNotcurses (without banners).
pub fn new<'a>() -> NcResult<&'a mut NcNotcurses> {
Self::with_flags(NCOPTION_SUPPRESS_BANNERS)
}
/// New Notcurses, with banners.
/// New NcNotcurses, with banners.
///
/// This is the default in the C library.
pub fn with_banners<'a>() -> NcResult<&'a mut Notcurses> {
pub fn with_banners<'a>() -> NcResult<&'a mut NcNotcurses> {
Self::with_flags(0)
}
/// New Notcurses, without an alternate screen (nor banners).
pub fn without_altscreen<'a>() -> NcResult<&'a mut Notcurses> {
Self::with_flags(NCOPTION_NO_ALTERNATE_SCREEN)
}
/// New Notcurses, without an alternate screen, with banners.
pub fn without_altscreen_nor_banners<'a>() -> NcResult<&'a mut Notcurses> {
/// New NcNotcurses, without an alternate screen (nor banners).
pub fn without_altscreen<'a>() -> NcResult<&'a mut NcNotcurses> {
Self::with_flags(NCOPTION_NO_ALTERNATE_SCREEN | NCOPTION_SUPPRESS_BANNERS)
}
/// New Notcurses, expects `NCOPTION_*` flags.
pub fn with_flags<'a>(flags: u64) -> NcResult<&'a mut Notcurses> {
Self::with_options(NotcursesOptions::with_flags(flags))
/// New NcNotcurses, expects `NCOPTION_*` flags.
pub fn with_flags<'a>(flags: u64) -> NcResult<&'a mut NcNotcurses> {
Self::with_options(NcNotcursesOptions::with_flags(flags))
}
/// New Notcurses, expects [NotcursesOptions].
pub fn with_options<'a>(options: NotcursesOptions) -> NcResult<&'a mut Notcurses> {
/// New NcNotcurses, expects [NcNotcursesOptions].
pub fn with_options<'a>(options: NcNotcursesOptions) -> NcResult<&'a mut NcNotcurses> {
let res = unsafe { notcurses_init(&options, null_mut()) };
error_ref_mut![res, "Notcurses.with_options()"]
error_ref_mut![res, "NcNotcurses.with_options()"]
}
/// New Notcurses, expects [NcLogLevel] and flags.
pub fn with_debug<'a>(loglevel: NcLogLevel, flags: u64) -> NcResult<&'a mut Notcurses> {
Self::with_options(NotcursesOptions::with_all_options(
/// New NcNotcurses, expects [NcLogLevel] and flags.
pub fn with_debug<'a>(loglevel: NcLogLevel, flags: u64) -> NcResult<&'a mut NcNotcurses> {
Self::with_options(NcNotcursesOptions::with_all_options(
loglevel, 0, 0, 0, 0, flags,
))
}
}
/// # `Notcurses` methods
impl Notcurses {
/// # `NcNotcurses` methods
impl NcNotcurses {
/// Returns the offset into `availcols` at which `cols` ought be output given
/// the requirements of `align`.
///
@ -135,6 +130,8 @@ impl Notcurses {
/// [NCALIGN_UNALIGNED][crate::NCALIGN_UNALIGNED] or invalid [NcAlign].
///
/// *C style function: [notcurses_align()][crate::notcurses_align].*
//
// TODO: handle error rightfully.
pub fn align(availcols: NcDimension, align: NcAlign, cols: NcDimension) -> NcResult<()> {
error![crate::notcurses_align(availcols, align, cols)]
}
@ -256,7 +253,7 @@ impl Notcurses {
error![unsafe { crate::notcurses_cursor_enable(self, y as i32, x as i32) }]
}
/// Dumps Notcurses state to the supplied `debugfp`.
/// Dumps NcNotcurses state to the supplied `debugfp`.
///
/// Output is freeform, and subject to change. It includes geometry of all
/// planes, from all piles.
@ -356,7 +353,7 @@ impl Notcurses {
} else {
error![
-1,
&format!("Notcurses.getc_blocking({:?})", input_txt),
&format!("NcNotcurses.getc_blocking({:?})", input_txt),
res
]
}
@ -365,7 +362,7 @@ impl Notcurses {
/// Gets a file descriptor suitable for input event poll()ing.
///
/// When this descriptor becomes available, you can call
/// [getc_nblock()][Notcurses#method.getc_nblock], and input ought be ready.
/// [getc_nblock()][NcNotcurses#method.getc_nblock], and input ought be ready.
///
/// This file descriptor is not necessarily the file descriptor associated
/// with stdin (but it might be!).
@ -386,13 +383,13 @@ impl Notcurses {
]
}
/// Lexes a margin argument according to the standard Notcurses definition.
/// Lexes a margin argument according to the standard NcNotcurses definition.
///
/// There can be either a single number, which will define all margins equally,
/// or there can be four numbers separated by commas.
///
/// *C style function: [notcurses_lex_margins()][crate::notcurses_lex_margins].*
pub fn lex_margins(op: &str, options: &mut NotcursesOptions) -> NcResult<()> {
pub fn lex_margins(op: &str, options: &mut NcNotcursesOptions) -> NcResult<()> {
error![unsafe { crate::notcurses_lex_margins(cstring![op], options) }]
}
@ -435,13 +432,13 @@ impl Notcurses {
/// Enable the mouse in "button-event tracking" mode with focus detection
/// and UTF8-style extended coordinates.
///
/// On success, mouse events will be published to [getc()][Notcurses#method.getc].
/// On success, mouse events will be published to [getc()][NcNotcurses#method.getc].
///
/// *C style function: [notcurses_mouse_enable()][crate::notcurses_mouse_enable].*
pub fn mouse_enable(&mut self) -> NcResult<()> {
error![
unsafe { crate::notcurses_mouse_enable(self) },
"Notcurses.mouse_enable()"
"NcNotcurses.mouse_enable()"
]
}
@ -458,7 +455,7 @@ impl Notcurses {
/// Refreshes the physical screen to match what was last rendered (i.e.,
/// without reflecting any changes since the last call to
/// [render][crate::Notcurses#method.render]).
/// [render][crate::NcNotcurses#method.render]).
///
/// This is primarily useful if the screen is externally corrupted, or if an
/// [NCKEY_RESIZE][crate::NCKEY_RESIZE] event has been read and you're not
@ -481,12 +478,12 @@ impl Notcurses {
pub fn render(&mut self) -> NcResult<()> {
error![
unsafe { crate::notcurses_render(self) },
"Notcurses.render()"
"NcNotcurses.render()"
]
}
/// Performs the rendering and rasterization portion of
/// [render][Notcurses#method.render] but do not write the resulting buffer
/// [render][NcNotcurses#method.render] but do not write the resulting buffer
/// out to the terminal.
///
/// Using this function, the user can control the writeout process,
@ -505,7 +502,7 @@ impl Notcurses {
/// Writes the last rendered frame, in its entirety, to 'fp'.
///
/// If [render()][Notcurses#method.render] has not yet been called,
/// If [render()][NcNotcurses#method.render] has not yet been called,
/// nothing will be written.
///
/// *C style function: [notcurses_render_to_file()][crate::notcurses_render_to_file].*
@ -513,7 +510,7 @@ impl Notcurses {
error![unsafe { crate::notcurses_render_to_file(self, fp.as_nc_ptr()) }]
}
/// Acquires an atomic snapshot of the Notcurses object's stats.
/// Acquires an atomic snapshot of the NcNotcurses object's stats.
///
/// *C style function: [notcurses_stats()][crate::notcurses_stats].*
pub fn stats(&mut self, stats: &mut NcStats) {
@ -525,7 +522,7 @@ impl Notcurses {
/// Allocates an ncstats object.
///
/// Use this rather than allocating your own, since future versions of
/// Notcurses might enlarge this structure.
/// NcNotcurses might enlarge this structure.
///
/// *C style function: [notcurses_stats_alloc()][crate::notcurses_stats_alloc].*
pub fn stats_alloc<'a>(&'a mut self) -> &'a mut NcStats {
@ -554,7 +551,7 @@ impl Notcurses {
// crate::notcurses_stddim_yx(self, y, x)
// }
// /// [stdplane_const()][Notcurses#method.stdplane_const], plus free
// /// [stdplane_const()][NcNotcurses#method.stdplane_const], plus free
// /// bonus dimensions written to non-NULL y/x!
// ///
// /// *C style function: [notcurses_stddim_yx()][crate::notcurses_stddim_yx].*
@ -576,7 +573,7 @@ impl Notcurses {
pub fn stdplane<'a>(&mut self) -> NcResult<&'a mut NcPlane> {
error_ref_mut![
unsafe { crate::notcurses_stdplane(self) },
"Notcurses.stdplane()"
"NcNotcurses.stdplane()"
]
}
@ -590,7 +587,7 @@ impl Notcurses {
unsafe { &*crate::notcurses_stdplane_const(self) }
}
/// Destroys the Notcurses context.
/// Destroys the NcNotcurses context.
///
/// *C style function: [notcurses_stop()][crate::notcurses_stop].*
pub fn stop(&mut self) -> NcResult<()> {
@ -637,14 +634,14 @@ impl Notcurses {
unsafe { &mut *crate::notcurses_top(self) }
}
/// Returns a human-readable string describing the running Notcurses version.
/// Returns a human-readable string describing the running notcurses version.
///
/// *C style function: [notcurses_version()][crate::notcurses_version].*
pub fn version() -> String {
rstring![crate::notcurses_version()].to_string()
}
/// Returns the running Notcurses version components
/// Returns the running NcNotcurses version components
/// (major, minor, patch, tweak).
///
/// *C style function: [notcurses_version_components()][crate::notcurses_version_components].*

@ -1,4 +1,4 @@
//! `Notcurses`
//! `NcNotcurses`
// functions already exported by bindgen : 42
// ------------------------------------------
@ -67,20 +67,22 @@ mod test;
mod helpers;
mod methods;
mod reimplemented;
mod wrapper;
#[allow(unused_imports)]
pub(crate) use helpers::*;
pub use reimplemented::*;
pub use wrapper::*;
/// The main struct of the TUI library (full mode)
///
/// Notcurses builds atop the terminfo abstraction layer to
/// NcNotcurses builds atop the terminfo abstraction layer to
/// provide reasonably portable vivid character displays.
///
pub type Notcurses = crate::bindings::ffi::notcurses;
/// This is the internal type safely wrapped by [Notcurses].
///
pub type NcNotcurses = crate::bindings::ffi::notcurses;
/// Options struct for [`Notcurses`]
pub type NotcursesOptions = crate::bindings::ffi::notcurses_options;
/// Options struct for [`NcNotcurses`]
pub type NcNotcursesOptions = crate::bindings::ffi::notcurses_options;
/// Do not call setlocale()
///
@ -96,17 +98,17 @@ pub const NCOPTION_INHIBIT_SETLOCALE: u64 = crate::bindings::ffi::NCOPTION_INHIB
/// Do not enter alternate mode.
///
/// If smcup/rmcup capabilities are indicated, Notcurses defaults to making use
/// If smcup/rmcup capabilities are indicated, NcNotcurses defaults to making use
/// of the "alternate screen". This flag inhibits use of smcup/rmcup.
pub const NCOPTION_NO_ALTERNATE_SCREEN: u64 =
crate::bindings::ffi::NCOPTION_NO_ALTERNATE_SCREEN as u64;
/// Do not modify the font.
///
/// Notcurses might attempt to change the font slightly, to support certain
/// NcNotcurses might attempt to change the font slightly, to support certain
/// glyphs (especially on the Linux console). If this is set, no such
/// modifications will be made. Note that font changes will not affect anything
/// but the virtual console/terminal in which Notcurses is running.
/// but the virtual console/terminal in which NcNotcurses is running.
pub const NCOPTION_NO_FONT_CHANGES: u64 = crate::bindings::ffi::NCOPTION_NO_FONT_CHANGES as u64;
/// Do not handle SIG{ING, SEGV, ABRT, QUIT}
@ -127,7 +129,7 @@ pub const NCOPTION_NO_WINCH_SIGHANDLER: u64 =
/// Do not print banners
///
/// Notcurses typically prints version info in notcurses_init() and performance
/// NcNotcurses typically prints version info in notcurses_init() and performance
/// info in notcurses_stop(). This inhibits that output.
pub const NCOPTION_SUPPRESS_BANNERS: u64 = crate::bindings::ffi::NCOPTION_SUPPRESS_BANNERS as u64;
@ -141,11 +143,11 @@ pub const NCOPTION_VERIFY_SIXEL: u64 = crate::bindings::ffi::NCOPTION_VERIFY_SIX
// NcLogLevel ------------------------------------------------------------------
/// Log level for [`NotcursesOptions`]
/// Log level for [`NcNotcursesOptions`]
///
/// These log levels consciously map cleanly to those of libav; Notcurses itself
/// These log levels consciously map cleanly to those of libav; NcNotcurses itself
/// does not use this full granularity. The log level does not affect the opening
/// and closing banners, which can be disabled via the `NotcursesOptions`
/// and closing banners, which can be disabled via the `NcNotcursesOptions`
/// `NCOPTION_SUPPRESS_BANNERS`.
/// Note that if stderr is connected to the same terminal on which we're
/// rendering, any kind of logging will disrupt the output.

@ -3,8 +3,8 @@
use core::ptr::{null, null_mut};
use crate::{
NcAlign, NcDimension, NcError, NcInput, NcOffset, NcPlane, NcResult, NcSignalSet, NcTime,
Notcurses, NCALIGN_CENTER, NCALIGN_LEFT, NCALIGN_RIGHT, NCRESULT_ERR, NCRESULT_MAX,
NcAlign, NcDimension, NcError, NcInput, NcNotcurses, NcOffset, NcPlane, NcResult, NcSignalSet,
NcTime, NCALIGN_CENTER, NCALIGN_LEFT, NCALIGN_RIGHT, NCRESULT_ERR, NCRESULT_MAX,
};
/// Returns the offset into `availcols` at which `cols` ought be output given
@ -13,7 +13,7 @@ use crate::{
/// Returns `-`[`NCRESULT_MAX`] if [NCALIGN_UNALIGNED][crate::NCALIGN_UNALIGNED]
/// or invalid [NcAlign].
///
/// *Method: Notcurses.[align()][Notcurses#method.align].*
/// *Method: NcNotcurses.[align()][NcNotcurses#method.align].*
#[inline]
pub fn notcurses_align(availcols: NcDimension, align: NcAlign, cols: NcDimension) -> NcOffset {
if align == NCALIGN_LEFT {
@ -34,11 +34,11 @@ pub fn notcurses_align(availcols: NcDimension, align: NcAlign, cols: NcDimension
///
/// If no event is ready, returns 0.
///
/// *Method: Notcurses.[getc_nblock()][Notcurses#method.getc_nblock].*
/// *Method: NcNotcurses.[getc_nblock()][NcNotcurses#method.getc_nblock].*
//
// TODO: use from_u32 & return Option.
#[inline]
pub fn notcurses_getc_nblock(nc: &mut Notcurses, input: &mut NcInput) -> char {
pub fn notcurses_getc_nblock(nc: &mut NcNotcurses, input: &mut NcInput) -> char {
unsafe {
let mut sigmask = NcSignalSet::new();
sigmask.fillset();
@ -56,9 +56,9 @@ pub fn notcurses_getc_nblock(nc: &mut Notcurses, input: &mut NcInput) -> char {
///
/// In case of an invalid read (including on EOF) *-1 as char* is returned.
///
/// *Method: Notcurses.[getc_blocking()][Notcurses#method.getc_blocking].*
/// *Method: NcNotcurses.[getc_blocking()][NcNotcurses#method.getc_blocking].*
#[inline]
pub fn notcurses_getc_blocking(nc: &mut Notcurses, input: Option<&mut NcInput>) -> char {
pub fn notcurses_getc_blocking(nc: &mut NcNotcurses, input: Option<&mut NcInput>) -> char {
let input_ptr;
if let Some(i) = input {
input_ptr = i as *mut _;
@ -75,10 +75,10 @@ pub fn notcurses_getc_blocking(nc: &mut Notcurses, input: Option<&mut NcInput>)
/// [notcurses_stdplane()][crate::notcurses_stdplane], plus free bonus
/// dimensions written to non-NULL y/x!
///
/// *Method: Notcurses.[getc_stddim_yx()][Notcurses#method.stddim_yx].*
/// *Method: NcNotcurses.[getc_stddim_yx()][NcNotcurses#method.stddim_yx].*
#[inline]
pub fn notcurses_stddim_yx<'a>(
nc: &'a mut Notcurses,
nc: &'a mut NcNotcurses,
y: &mut NcDimension,
x: &mut NcDimension,
) -> NcResult<&'a mut NcPlane> {
@ -95,10 +95,10 @@ pub fn notcurses_stddim_yx<'a>(
/// [notcurses_stdplane_const()][crate::notcurses_stdplane_const], plus free
/// bonus dimensions written to non-NULL y/x!
///
/// *Method: Notcurses.[getc_stddim_yx_const()][Notcurses#method.stddim_yx_const].*
/// *Method: NcNotcurses.[getc_stddim_yx_const()][NcNotcurses#method.stddim_yx_const].*
#[inline]
pub fn notcurses_stddim_yx_const<'a>(
nc: &'a Notcurses,
nc: &'a NcNotcurses,
y: &mut NcDimension,
x: &mut NcDimension,
) -> NcResult<&'a NcPlane> {
@ -114,9 +114,9 @@ pub fn notcurses_stddim_yx_const<'a>(
/// Returns our current idea of the terminal dimensions in rows and cols.
///
/// *Method: Notcurses.[getc_term_yx()][Notcurses#method.term_yx].*
/// *Method: NcNotcurses.[getc_term_yx()][NcNotcurses#method.term_yx].*
#[inline]
pub fn notcurses_term_dim_yx(nc: &Notcurses) -> (NcDimension, NcDimension) {
pub fn notcurses_term_dim_yx(nc: &NcNotcurses) -> (NcDimension, NcDimension) {
let (mut y, mut x) = (0, 0);
unsafe {
crate::ncplane_dim_yx(crate::notcurses_stdplane_const(nc), &mut y, &mut x);

@ -0,0 +1,140 @@
//! `Notcurses` wrapper struct and traits implementations.
use std::ops::{Deref, DerefMut};
use crate::{
raw_wrap, NcAlign, NcBlitter, NcDimension, NcLogLevel, NcNotcurses, NcNotcursesOptions,
NcResult, NcScale,
};
/// The main struct of the TUI library (full mode).
///
/// Safely wraps an [NcNotcurses],
/// and implements Drop, AsRef, AsMut, Deref & DerefMut around it.
pub struct Notcurses<'a> {
raw: &'a mut NcNotcurses,
}
impl<'a> AsRef<NcNotcurses> for Notcurses<'a> {
fn as_ref(&self) -> &NcNotcurses {
self.raw
}
}
impl<'a> AsMut<NcNotcurses> for Notcurses<'a> {
fn as_mut(&mut self) -> &mut NcNotcurses {
self.raw
}
}
impl<'a> Deref for Notcurses<'a> {
type Target = NcNotcurses;
fn deref(&self) -> &Self::Target {
self.as_ref()
}
}
impl<'a> DerefMut for Notcurses<'a> {
fn deref_mut(&mut self) -> &mut Self::Target {
self.as_mut()
}
}
impl<'a> Drop for Notcurses<'a> {
/// Destroys the Notcurses context.
fn drop(&mut self) {
let _ = self.raw.stop();
}
}
/// # Constructors and methods overriden from NcNotcurses
impl<'a> Notcurses<'a> {
// wrap constructors
/// New Notcurses (without banners).
pub fn new() -> NcResult<Self> {
raw_wrap![NcNotcurses::new()]
}
/// New Notcurses, without banners.
pub fn with_banners() -> NcResult<Self> {
raw_wrap![NcNotcurses::with_banners()]
}
/// New Notcurses, without an alternate screen (nor banners).
pub fn without_altscreen() -> NcResult<Self> {
raw_wrap![NcNotcurses::without_altscreen()]
}
/// New Notcurses, expects `NCOPTION_*` flags.
pub fn with_flags(flags: u64) -> NcResult<Self> {
raw_wrap![NcNotcurses::with_flags(flags)]
}
/// New Notcurses, expects [NcNotcursesOptions].
pub fn with_options(options: NcNotcursesOptions) -> NcResult<Self> {
raw_wrap![NcNotcurses::with_options(options)]
}
/// New Notcurses, expects [NcLogLevel] and flags.
pub fn with_debug(loglevel: NcLogLevel, flags: u64) -> NcResult<Self> {
raw_wrap![NcNotcurses::with_debug(loglevel, flags)]
}
// disable destructor
/// Since Notcurses 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: NcDimension, align: NcAlign, cols: NcDimension) -> NcResult<()> {
NcNotcurses::align(availcols, align, cols)
}
/// Gets the name of an [NcBlitter] blitter.
pub fn str_blitter(blitter: NcBlitter) -> String {
NcNotcurses::str_blitter(blitter)
}
/// Gets the name of an [NcScale] scaling mode.
pub fn str_scalemode(scalemode: NcScale) -> String {
NcNotcurses::str_scalemode(scalemode)
}
/// Returns an [NcBlitter] from a string representation.
pub fn lex_blitter(op: &str) -> NcResult<NcBlitter> {
NcNotcurses::lex_blitter(op)
}
/// Lexes a margin argument according to the standard NcNotcurses 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 NcNotcursesOptions) -> NcResult<()> {
NcNotcurses::lex_margins(op, options)
}
/// Returns an [NcScale] from a string representation.
pub fn lex_scalemode(op: &str) -> NcResult<NcScale> {
NcNotcurses::lex_scalemode(op)
}
/// Returns a human-readable string describing the running Notcurses version.
pub fn version() -> String {
NcNotcurses::version()
}
/// Returns the running NcNotcurses version components
/// (major, minor, patch, tweak).
pub fn version_components() -> (u32, u32, u32, u32) {
NcNotcurses::version_components()
}
}

@ -1,12 +1,12 @@
//! `NcPalette` methods and associated functions.
use crate::{error, NcChannel, NcColor, NcPalette, NcPaletteIndex, NcResult, NcRgb, Notcurses};
use crate::{error, NcChannel, NcColor, NcNotcurses, NcPalette, NcPaletteIndex, NcResult, NcRgb};
impl NcPalette {
/// New NcPalette.
///
/// *C style function: [palette256_new()][crate::palette256_new].*
pub fn new<'a>(nc: &mut Notcurses) -> &'a mut Self {
pub fn new<'a>(nc: &mut NcNotcurses) -> &'a mut Self {
unsafe { &mut *crate::palette256_new(nc) }
}
@ -22,7 +22,7 @@ impl NcPalette {
/// Attempts to configure the terminal with this NcPalette.
///
/// *C style function: [palette256_use()][crate::palette256_use].*
pub fn r#use(&self, nc: &mut Notcurses) -> NcResult<()> {
pub fn r#use(&self, nc: &mut NcNotcurses) -> NcResult<()> {
error![unsafe { crate::palette256_use(nc, self) }]
}

@ -1,9 +1,9 @@
use crate::{NcDimension, NcOffset, NcPlane, NcPlaneOptions, Notcurses};
use crate::{NcDimension, NcNotcurses, NcOffset, NcPlane, NcPlaneOptions};
/// Helper function for a new NcPlane on C style tests.
#[allow(dead_code)]
pub(crate) unsafe fn ncplane_new_test<'a>(
nc: &mut Notcurses,
nc: &mut NcNotcurses,
y: NcOffset,
x: NcOffset,
rows: NcDimension,

@ -4,9 +4,9 @@ use core::ptr::{null, null_mut};
use crate::{
cstring, error, error_ref, error_ref_mut, rstring, NcAlign, NcAlphaBits, NcBoxMask, NcCell,
NcChannel, NcChannelPair, NcColor, NcDimension, NcEgc, NcError, NcFadeCb, NcOffset,
NcPaletteIndex, NcPlane, NcPlaneOptions, NcResizeCb, NcResult, NcRgb, NcStyleMask, NcTime,
Notcurses, NCRESULT_ERR,
NcChannel, NcChannelPair, NcColor, NcDimension, NcEgc, NcError, NcFadeCb, NcNotcurses,
NcOffset, NcPaletteIndex, NcPlane, NcPlaneOptions, NcResizeCb, NcResult, NcRgb, NcStyleMask,
NcTime, NCRESULT_ERR,
};
/// # NcPlaneOptions Constructors
@ -76,7 +76,7 @@ impl NcPlane {
///
/// *C style function: [ncpile_create()][crate::ncpile_create].*
pub fn new<'a>(
nc: &mut Notcurses,
nc: &mut NcNotcurses,
y: NcOffset,
x: NcOffset,
rows: NcDimension,
@ -91,12 +91,12 @@ impl NcPlane {
///
/// *C style function: [ncpile_create()][crate::ncpile_create].*
pub fn with_options<'a>(
nc: &mut Notcurses,
nc: &mut NcNotcurses,
options: NcPlaneOptions,
) -> NcResult<&'a mut NcPlane> {
error_ref_mut![
unsafe { crate::ncpile_create(nc, &options) },
&format!["NcPlane::with_options(Notcurses, {:?})", options]
&format!["NcPlane::with_options(NcNotcurses, {:?})", options]
]
}
@ -133,7 +133,7 @@ impl NcPlane {
/// The returned plane will be the top, bottom, and root of this new pile.
///
/// *(No equivalent C style function)*
pub fn new_termsize<'a>(nc: &mut Notcurses) -> NcResult<&'a mut NcPlane> {
pub fn new_termsize<'a>(nc: &mut NcNotcurses) -> NcResult<&'a mut NcPlane> {
let (trows, tcols) = crate::notcurses_term_dim_yx(nc);
assert![(trows > 0) & (tcols > 0)];
Self::with_options(
@ -310,7 +310,7 @@ impl NcPlane {
/// the provided values will be interpreted in some lossy fashion.
///
/// "HP-like" terminals require setting foreground and background at the same
/// time using "color pairs"; Notcurses will manage color pairs transparently.
/// time using "color pairs"; NcNotcurses will manage color pairs transparently.
///
/// *C style function: [ncplane_set_fg_rgb8()][crate::ncplane_set_fg_rgb8].*
pub fn set_fg_rgb8(&mut self, red: NcColor, green: NcColor, blue: NcColor) {
@ -327,7 +327,7 @@ impl NcPlane {
/// the provided values will be interpreted in some lossy fashion.
///
/// "HP-like" terminals require setting foreground and background at the same
/// time using "color pairs"; Notcurses will manage color pairs transparently.
/// time using "color pairs"; NcNotcurses will manage color pairs transparently.
///
/// *C style function: [ncplane_set_bg_rgb8()][crate::ncplane_set_bg_rgb8].*
pub fn set_bg_rgb8(&mut self, red: NcColor, green: NcColor, blue: NcColor) {
@ -551,8 +551,10 @@ impl NcPlane {
if egc.is_null() {
return Err(NcError::with_msg(
NCRESULT_ERR,
&format!("NcPlane.at_yx({}, {}, {:0X}, {:0X})",
y, x, stylemask, channels),
&format!(
"NcPlane.at_yx({}, {}, {:0X}, {:0X})",
y, x, stylemask, channels
),
));
}
let egc = core::char::from_u32(unsafe { *egc } as u32).expect("wrong char");
@ -869,7 +871,7 @@ impl NcPlane {
}
// -----------------------------------------------------------------------------
/// ## NcPlane methods: `NcPlane` & `Notcurses`
/// ## NcPlane methods: `NcPlane` & `NcNotcurses`
impl NcPlane {
/// Duplicates this NcPlane.
///
@ -938,20 +940,14 @@ impl NcPlane {
///
/// *C style function: [ncplane_above()][crate::ncplane_above].*
pub fn above<'a>(&'a mut self) -> NcResult<&'a mut NcPlane> {
error_ref_mut![
unsafe { crate::ncplane_above(self) },
"NcPlane.above()"
]
error_ref_mut![unsafe { crate::ncplane_above(self) }, "NcPlane.above()"]
}
/// Returns the NcPlane below this one, or None if already at the bottom.
///
/// *C style function: [ncplane_below()][crate::ncplane_below].*
pub fn below<'a>(&'a mut self) -> NcResult<&'a mut NcPlane> {
error_ref_mut![
unsafe { crate::ncplane_below(self) },
"NcPlane.below()"
]
error_ref_mut![unsafe { crate::ncplane_below(self) }, "NcPlane.below()"]
}
/// Relocates this NcPlane above the `above` NcPlane, in the z-buffer.
@ -1004,18 +1000,22 @@ impl NcPlane {
target_x: NcDimension,
) -> NcResult<()> {
error![
unsafe { crate::ncplane_mergedown(
source,
self,
source_y as i32,
source_x as i32,
len_y as i32,
len_x as i32,
target_y as i32,
target_x as i32,
)},
&format!("NcPlane.mergedown(NcPlane, {}, {}, {}, {}, {}, {})",
source_y, source_x, len_y, len_x, target_y, target_x)
unsafe {
crate::ncplane_mergedown(
source,
self,
source_y as i32,
source_x as i32,
len_y as i32,
len_x as i32,
target_y as i32,
target_x as i32,
)
},
&format!(
"NcPlane.mergedown(NcPlane, {}, {}, {}, {}, {}, {})",
source_y, source_x, len_y, len_x, target_y, target_x
)
]
}
@ -1044,10 +1044,7 @@ impl NcPlane {
//
// TODO: CHECK: what happens when it's bound to itself.
pub fn parent<'a>(&'a mut self) -> NcResult<&'a mut NcPlane> {
error_ref_mut![
unsafe { crate::ncplane_parent(self) },
"NcPlane.parent()"
]
error_ref_mut![unsafe { crate::ncplane_parent(self) }, "NcPlane.parent()"]
}
/// Gets the parent to which this NcPlane is bound, if any.
@ -1104,7 +1101,10 @@ impl NcPlane {
///
/// *C style function: [ncpile_rasterize()][crate::ncpile_rasterize].*
pub fn rasterize<'a>(&mut self) -> NcResult<()> {
error![unsafe { crate::ncpile_rasterize(self) }, "NcPlane.rasterize()"]
error![
unsafe { crate::ncpile_rasterize(self) },
"NcPlane.rasterize()"
]
}
/// Renders the pile of which this NcPlane is a part.
@ -1116,20 +1116,20 @@ impl NcPlane {
error![unsafe { crate::ncpile_render(self) }, "NcPlane.render()"]
}
/// Gets a mutable reference to the [Notcurses] context of this NcPlane.
/// Gets a mutable reference to the [NcNotcurses] context of this NcPlane.
///
/// *C style function: [ncplane_notcurses()][crate::ncplane_notcurses].*
pub fn notcurses<'a>(&mut self) -> NcResult<&'a mut Notcurses> {
pub fn notcurses<'a>(&mut self) -> NcResult<&'a mut NcNotcurses> {
error_ref_mut![
unsafe { crate::ncplane_notcurses(self) },
"NcPlane.notcurses()"
]
}
/// Gets an immutable reference to the [Notcurses] context of this NcPlane.
/// Gets an immutable reference to the [NcNotcurses] context of this NcPlane.
///
/// *C style function: [ncplane_notcurses_const()][crate::ncplane_notcurses_const].*
pub fn notcurses_const<'a>(&self) -> NcResult<&'a Notcurses> {
pub fn notcurses_const<'a>(&self) -> NcResult<&'a NcNotcurses> {
error_ref![
unsafe { crate::ncplane_notcurses_const(self) },
"NcPlane.notcurses()"
@ -1339,19 +1339,23 @@ impl NcPlane {
x_len: NcDimension,
) -> NcResult<()> {
error![
unsafe { crate::ncplane_resize(
self,
keep_y as i32,
keep_x as i32,
keep_len_y as i32,
keep_len_x as i32,
y_off as i32,
x_off as i32,
y_len as i32,
x_len as i32,
)},
&format!("NcPlane.resize({}, {}, {}, {}, {}, {}, {}, {})",
keep_y, keep_x, keep_len_y, keep_len_x, y_off, x_off, y_len, x_len)
unsafe {
crate::ncplane_resize(
self,
keep_y as i32,
keep_x as i32,
keep_len_y as i32,
keep_len_x as i32,
y_off as i32,
x_off as i32,
y_len as i32,
x_len as i32,
)
},
&format!(
"NcPlane.resize({}, {}, {}, {}, {}, {}, {}, {})",
keep_y, keep_x, keep_len_y, keep_len_x, y_off, x_off, y_len, x_len
)
]
}

@ -1,6 +1,6 @@
//! `NcStats`
use crate::Notcurses;
use crate::NcNotcurses;
/// notcurses runtime statistics
pub type NcStats = crate::bindings::ffi::ncstats;
@ -8,17 +8,17 @@ pub type NcStats = crate::bindings::ffi::ncstats;
/// # `NcStats` Methods.
impl NcStats {
/// Allocates an NcStats object.
pub fn new<'a>(nc: &'a Notcurses) -> &'a mut Self {
pub fn new<'a>(nc: &'a NcNotcurses) -> &'a mut Self {
unsafe { &mut *crate::notcurses_stats_alloc(nc) }
}
/// Acquires an atomic snapshot of the Notcurses object's stats.
pub fn stats(&mut self, nc: &Notcurses) {
/// Acquires an atomic snapshot of the NcNotcurses object's stats.
pub fn stats(&mut self, nc: &NcNotcurses) {
unsafe { crate::notcurses_stats(nc, self) }
}
/// Resets all cumulative stats (immediate ones are not reset).
pub fn reset(&mut self, nc: &mut Notcurses) {
pub fn reset(&mut self, nc: &mut NcNotcurses) {
unsafe { crate::notcurses_stats_reset(nc, self) }
}
}

Loading…
Cancel
Save