use core::ptr::{null, null_mut};
use crate::{
c_api::{self, NcAlign_u32, NcResult_i32, NCRESULT_ERR},
Nc, NcError, NcInput, NcPlane, NcResult, NcTime,
};
#[inline]
pub fn notcurses_align(avail_u: u32, align: impl Into<NcAlign_u32> + Copy, u: u32) -> NcResult_i32 {
if align.into() == c_api::NCALIGN_LEFT || align.into() == c_api::NCALIGN_TOP {
return 0;
}
if align.into() == c_api::NCALIGN_CENTER {
return ((avail_u - u) / 2) as NcResult_i32;
}
if align.into() == c_api::NCALIGN_RIGHT || align.into() == c_api::NCALIGN_BOTTOM {
return (avail_u - u) as NcResult_i32;
}
-NcResult_i32::MAX
}
#[inline]
pub fn notcurses_canpixel(nc: &Nc) -> bool {
unsafe { c_api::notcurses_check_pixel_support(nc) != c_api::NCPIXEL_NONE }
}
#[inline]
pub fn notcurses_canbraille(nc: &Nc) -> bool {
notcurses_canutf8(nc) && nc.capabilities().braille
}
#[inline]
pub fn notcurses_canchangecolor(nc: &Nc) -> bool {
c_api::nccapability_canchangecolor(&nc.capabilities())
}
#[inline]
pub fn notcurses_canfade(nc: &Nc) -> bool {
notcurses_canchangecolor(nc) || notcurses_cantruecolor(nc)
}
pub fn notcurses_cantruecolor(nc: &Nc) -> bool {
nc.capabilities().rgb
}
#[inline]
pub fn notcurses_canutf8(nc: &Nc) -> bool {
nc.capabilities().utf8
}
#[inline]
pub fn notcurses_canhalfblock(nc: &Nc) -> bool {
notcurses_canutf8(nc)
}
#[inline]
pub fn notcurses_canquadrant(nc: &Nc) -> bool {
notcurses_canutf8(nc) && nc.capabilities().quadrants
}
#[inline]
pub fn notcurses_cansextant(nc: &Nc) -> bool {
notcurses_canutf8(nc) && nc.capabilities().sextants
}
#[inline]
pub fn notcurses_get_blocking(nc: &mut Nc, input: Option<&mut NcInput>) -> NcResult_i32 {
let input_ptr = if let Some(i) = input { i as *mut _ } else { null_mut() };
unsafe { c_api::notcurses_get(nc, null(), input_ptr) as NcResult_i32 }
}
#[inline]
pub fn notcurses_get_nblock(nc: &mut Nc, input: Option<&mut NcInput>) -> NcResult_i32 {
let input_ptr = if let Some(i) = input { i as *mut _ } else { null_mut() };
unsafe {
let ts = NcTime::new(0, 0);
c_api::notcurses_get(nc, &ts, input_ptr) as NcResult_i32
}
}
#[inline]
pub fn notcurses_render(nc: &mut Nc) -> NcResult_i32 {
let stdplane = unsafe { c_api::notcurses_stdplane(nc) };
if unsafe { c_api::ncpile_render(stdplane) } == NCRESULT_ERR {
return NCRESULT_ERR;
}
unsafe { c_api::ncpile_rasterize(stdplane) }
}
#[inline]
pub fn notcurses_stddim_yx<'a>(
nc: &'a mut Nc,
y: &mut u32,
x: &mut u32,
) -> NcResult<&'a mut NcPlane> {
unsafe {
let sp = c_api::notcurses_stdplane(nc);
if !sp.is_null() {
c_api::ncplane_dim_yx(sp, y, x);
return Ok(&mut *sp);
}
}
Err(NcError::new())
}
#[inline]
pub fn notcurses_stddim_yx_const<'a>(
nc: &'a Nc,
y: &mut u32,
x: &mut u32,
) -> NcResult<&'a NcPlane> {
unsafe {
let sp = c_api::notcurses_stdplane_const(nc);
if !sp.is_null() {
c_api::ncplane_dim_yx(sp, y, x);
return Ok(&*sp);
}
}
Err(NcError::new())
}
#[inline]
pub fn notcurses_term_dim_yx(nc: &Nc) -> (u32, u32) {
let (mut y, mut x) = (0, 0);
unsafe {
c_api::ncplane_dim_yx(c_api::notcurses_stdplane_const(nc), &mut y, &mut x);
}
(y as u32, x as u32)
}
#[inline]
pub fn notcurses_mice_disable(nc: &mut Nc) -> NcResult_i32 {
unsafe { c_api::notcurses_mice_enable(nc, c_api::NCMICE_NO_EVENTS) }
}
#[inline]
pub fn notcurses_bottom(nc: &mut Nc) -> &mut NcPlane {
unsafe { &mut *c_api::ncpile_bottom(c_api::notcurses_stdplane(nc)) }
}
#[inline]
pub fn notcurses_top(nc: &mut Nc) -> &mut NcPlane {
unsafe { &mut *c_api::ncpile_top(c_api::notcurses_stdplane(nc)) }
}