#![allow(non_camel_case_types)]
#![allow(clippy::upper_case_acronyms)]
use std::{time, convert::TryFrom};
use crate::{
Origin,
mouse::{NCurseswMouseError, OriginResult, constants::NCURSES_MOUSE_VERSION},
shims::{ncurses, nmouse, bindings, constants::OK}
};
type WINDOW = ncurses::WINDOW;
type SCREEN = ncurses::SCREEN;
pub type MEVENT = bindings::MEVENT;
pub type mmask_t = nmouse::mmask_t;
pub fn has_mouse() -> bool {
nmouse::has_mouse()
}
pub fn getmouse(event: nmouse::MEVENT) -> mouse_result!(()) {
match unsafe { nmouse::getmouse(event) } {
OK => Ok(()),
rc => Err(mouse_function_error_with_rc!("getmouse", rc))
}
}
pub fn ungetmouse(event: nmouse::MEVENT) -> mouse_result!(()) {
match unsafe { nmouse::ungetmouse(event) } {
OK => Ok(()),
rc => Err(mouse_function_error_with_rc!("ungetmouse", rc))
}
}
pub fn mousemask(newmask: mmask_t) -> mouse_result!(mmask_t) {
let mut oldmask: [mmask_t; 1] = [0];
if unsafe { nmouse::mousemask(newmask, Some(oldmask.as_mut_ptr())) } == 0 {
Err(mouse_function_error!("mousemask"))
} else {
Ok(oldmask[0])
}
}
pub fn mouseinterval(delay: Option<time::Duration>) -> mouse_result!(time::Duration) {
let rc = if let Some(ms) = delay {
nmouse::mouseinterval(i32::try_from(ms.as_millis())?)
} else {
nmouse::mouseinterval(-1)
};
if rc.is_negative() {
Err(mouse_function_error_with_rc!("mouseinterval", rc))
} else {
Ok(time::Duration::from_millis(u64::try_from(rc)?))
}
}
pub fn wenclose(window: WINDOW, origin: Origin) -> bool {
unsafe { nmouse::wenclose(window, origin.y, origin.x) }
}
pub fn wmouse_trafo(window: WINDOW, origin: Origin, to_screen: bool) -> OriginResult {
let mut y: [i32; 1] = [origin.y];
let mut x: [i32; 1] = [origin.x];
let result = unsafe { nmouse::wmouse_trafo(window, y.as_mut_ptr(), x.as_mut_ptr(), to_screen) };
OriginResult::new(y[0], x[0], to_screen, result)
}
pub fn mouse_trafo(origin: Origin, to_screen: bool) -> OriginResult {
let mut y: [i32; 1] = [origin.y];
let mut x: [i32; 1] = [origin.x];
let result = unsafe { nmouse::mouse_trafo(y.as_mut_ptr(), x.as_mut_ptr(), to_screen) };
OriginResult::new(y[0], x[0], to_screen, result)
}
pub fn mouse_version() -> i32 {
NCURSES_MOUSE_VERSION
}
pub fn has_mouse_interface() -> bool {
mouse_version() > 0
}
pub fn getmouse_sp(screen: SCREEN, event: nmouse::MEVENT) -> mouse_result!(()) {
match unsafe { nmouse::getmouse_sp(screen, event) } {
OK => Ok(()),
rc => Err(mouse_function_error_with_rc!("getmouse_sp", rc))
}
}
pub fn has_mouse_sp(screen: SCREEN) -> bool {
unsafe { bindings::has_mouse_sp(screen) }
}
pub fn mouseinterval_sp(screen: SCREEN, delay: Option<time::Duration>) -> mouse_result!(time::Duration) {
let rc = unsafe { if let Some(ms) = delay {
nmouse::mouseinterval_sp(screen, i32::try_from(ms.as_millis())?)
} else {
nmouse::mouseinterval_sp(screen, -1)
}};
if rc.is_negative() {
Err(mouse_function_error_with_rc!("mouseinterval_sp", rc))
} else {
Ok(time::Duration::from_millis(u64::try_from(rc)?))
}
}
pub fn mousemask_sp(screen: SCREEN, newmask: mmask_t) -> mouse_result!(mmask_t) {
let mut oldmask: [mmask_t; 1] = [0];
if unsafe { nmouse::mousemask_sp(screen, newmask, Some(oldmask.as_mut_ptr())) } == 0 {
Err(mouse_function_error!("mousemask_sp"))
} else {
Ok(oldmask[0])
}
}
pub fn ungetmouse_sp(screen: SCREEN, event: nmouse::MEVENT) -> mouse_result!(()) {
match unsafe { nmouse::ungetmouse_sp(screen, event) } {
OK => Ok(()),
rc => Err(mouse_function_error_with_rc!("ungetmouse_sp", rc))
}
}