curses-sys 6.0.0-2

FFI bindings for curses
Documentation
use libc::{c_void, c_char, c_short, c_ushort, c_int, c_uint, c_long, wchar_t};
use base::{WINDOW, chtype, KEY_MAX};

pub type Form_Options  = c_int;
pub type Field_Options = c_int;

pub type FIELD_CELL = c_void;

#[derive(Debug)]
#[repr(C)]
pub struct PAGE {
	pmin: c_short,
	pmax: c_short,
	smin: c_short,
	smax: c_short,
}

#[derive(Debug)]
#[repr(C)]
pub struct FIELD {
	pub status:  c_ushort,
	pub rows:    c_short,
	pub cols:    c_short,
	pub frow:    c_short,
	pub fcol:    c_short,
	pub drows:   c_int,
	pub dcols:   c_int,
	pub maxgrow: c_int,
	pub nrow:    c_int,
	pub nbuf:    c_short,
	pub just:    c_short,
	pub page:    c_short,
	pub index:   c_short,
	pub pad:     c_int,
	pub fore:    chtype,
	pub back:    chtype,
	pub opts:    Field_Options,
	pub snext:   *mut FIELD,
	pub sprev:   *mut FIELD,
	pub link:    *mut FIELD,
	pub form:    *mut FORM,
	pub type_:   *mut FIELDTYPE,
	pub arg:     *mut c_void,
	pub buf:     *mut FIELD_CELL,
	pub usrptr:  *mut c_void,
}

#[repr(C)]
pub struct FORM {
	pub status:   c_ushort,
	pub rows:     c_short,
	pub cols:     c_short,
	pub currow:   c_int,
	pub curcol:   c_int,
	pub toprow:   c_int,
	pub begincol: c_int,
	pub maxfield: c_short,
	pub maxpage:  c_short,
	pub curpage:  c_short,
	pub opts:     Form_Options,
	pub win:      *mut WINDOW,
	pub sub:      *mut WINDOW,
	pub w:        *mut WINDOW,
	pub field:    *mut *mut FIELD,
	pub current:  *mut FIELD,
	pub page:     *mut PAGE,
	pub usrptr:   *mut c_void,

	pub forminit:  Form_Hook,
	pub formterm:  Form_Hook,
	pub fieldinit: Form_Hook,
	pub fieldterm: Form_Hook,
}

#[repr(C)]
pub struct FIELDTYPE {
	pub status: c_ushort,
	pub ref_:   c_long,
	pub left:   *mut FIELDTYPE,
	pub right:  *mut FIELDTYPE,

	pub makearg: extern "C" fn(*mut c_void) -> *mut c_void,
	pub copyarg: extern "C" fn(*const c_void) -> *mut c_void,
	pub freearg: extern "C" fn(*mut c_void),

	pub fcheck: extern "C" fn(*mut FIELD, *const c_void) -> bool,
	pub ccheck: extern "C" fn(c_int, *const c_void) -> bool,

	pub next: extern "C" fn(*mut FIELD, *const c_void) -> bool,
	pub prev: extern "C" fn(*mut FIELD, *const c_void) -> bool,
}

pub type Form_Hook = extern "C" fn(*mut FORM);

pub const NO_JUSTIFICATION: c_int = 0;
pub const JUSTIFY_LEFT:     c_int = 1;
pub const JUSTIFY_CENTER:   c_int = 2;
pub const JUSTIFY_RIGHT:    c_int = 3;

pub const O_VISIBLE:         c_uint = 0x0001;
pub const O_ACTIVE:          c_uint = 0x0002;
pub const O_PUBLIC:          c_uint = 0x0004;
pub const O_EDIT:            c_uint = 0x0008;
pub const O_WRAP:            c_uint = 0x0010;
pub const O_BLANK:           c_uint = 0x0020;
pub const O_AUTOSKIP:        c_uint = 0x0040;
pub const O_NULLOK:          c_uint = 0x0080;
pub const O_PASSOK:          c_uint = 0x0100;
pub const O_STATIC:          c_uint = 0x0200;
pub const O_DYNAMIC_JUSTIFY: c_uint = 0x0400;
pub const O_NL_OVERLOAD:     c_uint = 0x0001;
pub const O_BS_OVERLOAD:     c_uint = 0x0002;

pub const REQ_NEXT_PAGE:    c_int = KEY_MAX + 1;
pub const REQ_PREV_PAGE:    c_int = KEY_MAX + 2;
pub const REQ_FIRST_PAGE:   c_int = KEY_MAX + 3;
pub const REQ_LAST_PAGE:    c_int = KEY_MAX + 4;
pub const REQ_NEXT_FIELD:   c_int = KEY_MAX + 5;
pub const REQ_PREV_FIELD:   c_int = KEY_MAX + 6;
pub const REQ_FIRST_FIELD:  c_int = KEY_MAX + 7;
pub const REQ_LAST_FIELD:   c_int = KEY_MAX + 8;
pub const REQ_SNEXT_FIELD:  c_int = KEY_MAX + 9;
pub const REQ_SPREV_FIELD:  c_int = KEY_MAX + 10;
pub const REQ_SFIRST_FIELD: c_int = KEY_MAX + 11;
pub const REQ_SLAST_FIELD:  c_int = KEY_MAX + 12;
pub const REQ_LEFT_FIELD:   c_int = KEY_MAX + 13;
pub const REQ_RIGHT_FIELD:  c_int = KEY_MAX + 14;
pub const REQ_UP_FIELD:     c_int = KEY_MAX + 15;
pub const REQ_DOWN_FIELD:   c_int = KEY_MAX + 16;
pub const REQ_NEXT_CHAR:    c_int = KEY_MAX + 17;
pub const REQ_PREV_CHAR:    c_int = KEY_MAX + 18;
pub const REQ_NEXT_LINE:    c_int = KEY_MAX + 19;
pub const REQ_PREV_LINE:    c_int = KEY_MAX + 20;
pub const REQ_NEXT_WORD:    c_int = KEY_MAX + 21;
pub const REQ_PREV_WORD:    c_int = KEY_MAX + 22;
pub const REQ_BEG_FIELD:    c_int = KEY_MAX + 23;
pub const REQ_END_FIELD:    c_int = KEY_MAX + 24;
pub const REQ_BEG_LINE:     c_int = KEY_MAX + 25;
pub const REQ_END_LINE:     c_int = KEY_MAX + 26;
pub const REQ_LEFT_CHAR:    c_int = KEY_MAX + 27;
pub const REQ_RIGHT_CHAR:   c_int = KEY_MAX + 28;
pub const REQ_UP_CHAR:      c_int = KEY_MAX + 29;
pub const REQ_DOWN_CHAR:    c_int = KEY_MAX + 30;
pub const REQ_NEW_LINE:     c_int = KEY_MAX + 31;
pub const REQ_INS_CHAR:     c_int = KEY_MAX + 32;
pub const REQ_INS_LINE:     c_int = KEY_MAX + 33;
pub const REQ_DEL_CHAR:     c_int = KEY_MAX + 34;
pub const REQ_DEL_PREV:     c_int = KEY_MAX + 35;
pub const REQ_DEL_LINE:     c_int = KEY_MAX + 36;
pub const REQ_DEL_WORD:     c_int = KEY_MAX + 37;
pub const REQ_CLR_EOL:      c_int = KEY_MAX + 38;
pub const REQ_CLR_EOF:      c_int = KEY_MAX + 39;
pub const REQ_CLR_FIELD:    c_int = KEY_MAX + 40;
pub const REQ_OVL_MODE:     c_int = KEY_MAX + 41;
pub const REQ_INS_MODE:     c_int = KEY_MAX + 42;
pub const REQ_SCR_FLINE:    c_int = KEY_MAX + 43;
pub const REQ_SCR_BLINE:    c_int = KEY_MAX + 44;
pub const REQ_SCR_FPAGE:    c_int = KEY_MAX + 45;
pub const REQ_SCR_BPAGE:    c_int = KEY_MAX + 46;
pub const REQ_SCR_FHPAGE:   c_int = KEY_MAX + 47;
pub const REQ_SCR_BHPAGE:   c_int = KEY_MAX + 48;
pub const REQ_SCR_FCHAR:    c_int = KEY_MAX + 49;
pub const REQ_SCR_BCHAR:    c_int = KEY_MAX + 50;
pub const REQ_SCR_HFLINE:   c_int = KEY_MAX + 51;
pub const REQ_SCR_HBLINE:   c_int = KEY_MAX + 52;
pub const REQ_SCR_HFHALF:   c_int = KEY_MAX + 53;
pub const REQ_SCR_HBHALF:   c_int = KEY_MAX + 54;
pub const REQ_VALIDATION:   c_int = KEY_MAX + 55;
pub const REQ_NEXT_CHOICE:  c_int = KEY_MAX + 56;
pub const REQ_PREV_CHOICE:  c_int = KEY_MAX + 57;

#[cfg_attr(feature = "wide", link(name = "formw"))]
#[cfg_attr(not(feature = "wide"), link(name = "form"))]
extern "C" {
	pub static TYPE_ALPHA:   *mut FIELDTYPE;
	pub static TYPE_ALNUM:   *mut FIELDTYPE;
	pub static TYPE_ENUM:    *mut FIELDTYPE;
	pub static TYPE_INTEGER: *mut FIELDTYPE;
	pub static TYPE_NUMERIC: *mut FIELDTYPE;
	pub static TYPE_REGEXP:  *mut FIELDTYPE;

	#[cfg(feature = "extensions")]
	pub static TYPE_IPV4: *mut FIELDTYPE;

	pub fn new_fieldtype(field_check: extern "C" fn(*mut FIELD, *const c_void) -> bool,
	                     char_check: extern "C" fn(c_int, *const c_void) -> bool) -> *mut FIELDTYPE;
	pub fn free_fieldtype(fieldtype: *mut FIELDTYPE);
	pub fn set_fieldtype_arg(fieldtype: *mut FIELDTYPE,
	                         make_arg: extern "C" fn(*mut c_void) -> *mut c_void,
	                         copy_arg: extern "C" fn(*const c_void) -> *mut c_void,
	                         free_arg: extern "C" fn(*mut c_void)) -> c_int;
	pub fn set_fieldtype_choice(fieldtype: *mut FIELDTYPE,
	                            next_choice: extern "C" fn(*mut FIELD, *const c_void) -> bool,
	                            prev_choice: extern "C" fn(*mut FIELD, *const c_void) -> bool) -> c_int;
	pub fn link_fieldtype(type1: *mut FIELDTYPE, type2: *mut FIELDTYPE) -> *mut FIELDTYPE;

	pub fn new_field(height: c_int, width: c_int, toprow: c_int, leftcol: c_int, offscreen: c_int, nbuffers: c_int) -> *mut FIELD;
	pub fn dup_field(field: *mut FIELD, toprow: c_int, leftcol: c_int) -> *mut FIELD;
	pub fn link_field(field: *mut FIELD, toprow: c_int, leftcol: c_int) -> *mut FIELD;
	pub fn free_field(field: *mut FIELD) -> c_int;

	pub fn field_info(field: *const FIELD, rows: *mut c_int, cols: *mut c_int, frow: *mut c_int, fcol: *mut c_int, nrow: *mut c_int, nbuf: *mut c_int) -> c_int;
	pub fn dynamic_field_info(field: *const FIELD, rows: *mut c_int, cols: *mut c_int, max: *mut c_int) -> c_int;

	pub fn set_field_buffer(field: *mut FIELD, buf: c_int, value: *const c_char) -> c_int;
	pub fn field_buffer(field: *const FIELD, buffer: c_int) -> *mut c_char;
	pub fn set_field_status(field: *mut FIELD, status: bool) -> c_int;
	pub fn field_status(field: *const FIELD) -> bool;
	pub fn set_max_field(field: *mut FIELD, max: c_int) -> c_int;

	pub fn set_new_page(field: *mut FIELD, new_page_flag: bool) -> c_int;
	pub fn new_page(field: *const FIELD) -> bool;

	pub fn set_field_just(field: *mut FIELD, justification: c_int) -> c_int;
	pub fn field_just(field: *const FIELD) -> c_int;

	pub fn set_field_fore(field: *mut FIELD, attr: chtype) -> c_int;
	pub fn field_fore(field: *const FIELD) -> chtype;
	pub fn set_field_back(field: *mut FIELD, attr: chtype) -> c_int;
	pub fn field_back(field: *const FIELD) -> chtype;
	pub fn set_field_pad(field: *mut FIELD, pad: c_int) -> c_int;
	pub fn field_pad(field: *const FIELD) -> c_int;

	pub fn set_field_opts(field: *mut FIELD, opts: Field_Options) -> c_int;
	pub fn field_opts_on(field: *mut FIELD, opts: Field_Options) -> c_int;
	pub fn field_opts_off(field: *mut FIELD, opts: Field_Options) -> c_int;
	pub fn field_opts(field: *const FIELD) -> Field_Options;

	pub fn set_field_type(field: *mut FIELD, type_: *mut FIELDTYPE, ...) -> c_int;
	pub fn field_type(field: *const FIELD) -> *mut FIELDTYPE;
	pub fn field_arg(field: *const FIELD) -> *mut c_void;

	pub fn set_field_userptr(field: *mut FIELD, userptr: *mut c_void) -> c_int;
	pub fn field_userptr(field: *const FIELD) -> *mut c_void;

	pub fn new_form(fields: *mut *mut FIELD) -> *mut FORM;
	pub fn free_form(form: *mut FORM) -> c_int;

	pub fn set_form_fields(form: *mut FORM, fields: *mut *mut FIELD) -> c_int;
	pub fn form_fields(form: *const FORM) -> *mut *mut FIELD;
	pub fn field_count(form: *const FORM) -> c_int;
	pub fn move_field(field: *mut FIELD, frow: c_int, fcol: c_int) -> c_int;

	pub fn set_form_win(form: *mut FORM, win: *mut WINDOW) -> c_int;
	pub fn form_win(form: *const FORM) -> *mut WINDOW;
	pub fn set_form_sub(form: *mut FORM, win: *mut WINDOW) -> c_int;
	pub fn form_sub(form: *const FORM) -> *mut WINDOW;
	pub fn scale_form(form: *const FORM, rows: *mut c_int, columns: *mut c_int) -> c_int;

	pub fn set_field_init(form: *mut FORM, func: Form_Hook) -> c_int;
	pub fn field_init(form: *const FORM) -> Form_Hook;
	pub fn set_field_term(form: *mut FORM, func: Form_Hook) -> c_int;
	pub fn field_term(form: *const FORM) -> Form_Hook;
	pub fn set_form_init(form: *mut FORM, func: Form_Hook) -> c_int;
	pub fn form_init(form: *const FORM) -> Form_Hook;
	pub fn set_form_term(form: *mut FORM, func: Form_Hook) -> c_int;
	pub fn form_term(form: *const FORM) -> Form_Hook;

	pub fn set_current_field(form: *mut FORM, field: *mut FIELD) -> c_int;
	pub fn current_field(form: *const FORM) -> *mut FIELD;
	pub fn set_form_page(form: *mut FORM, n: c_int) -> c_int;
	pub fn form_page(form: *const FORM) -> c_int;
	pub fn form_index(field: *const FIELD) -> c_int;

	pub fn post_form(form: *mut FORM) -> c_int;
	pub fn unpost_form(form: *mut FORM) -> c_int;

	pub fn pos_form_cursor(form: *mut FORM) -> c_int;

	pub fn set_form_userptr(form: *mut FORM, userptr: *mut c_void) -> c_int;
	pub fn form_userptr(form: *const FORM) -> *mut c_void;

	pub fn set_form_opts(form: *mut FORM, opts: Field_Options) -> c_int;
	pub fn form_opts_on(form: *mut FORM, opts: Field_Options) -> c_int;
	pub fn form_opts_off(form: *mut FORM, opts: Field_Options) -> c_int;
	pub fn form_opts(form: *const FORM) -> Field_Options;

	pub fn form_driver(form: *mut FORM, c: c_int) -> c_int;
	#[cfg(feature = "wide")]
	pub fn form_driver_w(form: *mut FORM, c: c_int, wch: wchar_t) -> c_int;

	pub fn form_request_name(request: c_int) -> *const c_char;
	pub fn form_request_by_name(name: *const c_char) -> c_int;

	pub fn data_ahead(form: *const FORM) -> bool;
	pub fn data_behind(form: *const FORM) -> bool;
}