1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
use libc::{c_short, c_int, uint32_t};
use base::WINDOW;

pub type mmask_t = uint32_t;

macro_rules! MASK {
	($btn:expr, $ev:expr) => (
		$ev << (($btn - 1) * 5)
	)
}

pub const BUTTON_RELEASED: mmask_t = 0o01;
pub const BUTTON_PRESSED:  mmask_t = 0o02;
pub const BUTTON_CLICKED:  mmask_t = 0o04;
pub const DOUBLE_CLICKED:  mmask_t = 0o10;
pub const TRIPLE_CLICKED:  mmask_t = 0o20;
pub const RESERVED_EVENT:  mmask_t = 0o40;

pub const BUTTON1_RELEASED:       mmask_t = MASK!(1, BUTTON_RELEASED);
pub const BUTTON1_PRESSED:        mmask_t = MASK!(1, BUTTON_PRESSED);
pub const BUTTON1_CLICKED:        mmask_t = MASK!(1, BUTTON_CLICKED);
pub const BUTTON1_DOUBLE_CLICKED: mmask_t = MASK!(1, DOUBLE_CLICKED);
pub const BUTTON1_TRIPLE_CLICKED: mmask_t = MASK!(1, TRIPLE_CLICKED);

pub const BUTTON2_RELEASED:       mmask_t = MASK!(2, BUTTON_RELEASED);
pub const BUTTON2_PRESSED:        mmask_t = MASK!(2, BUTTON_PRESSED);
pub const BUTTON2_CLICKED:        mmask_t = MASK!(2, BUTTON_CLICKED);
pub const BUTTON2_DOUBLE_CLICKED: mmask_t = MASK!(2, DOUBLE_CLICKED);
pub const BUTTON2_TRIPLE_CLICKED: mmask_t = MASK!(2, TRIPLE_CLICKED);

pub const BUTTON3_RELEASED:       mmask_t = MASK!(3, BUTTON_RELEASED);
pub const BUTTON3_PRESSED:        mmask_t = MASK!(3, BUTTON_PRESSED);
pub const BUTTON3_CLICKED:        mmask_t = MASK!(3, BUTTON_CLICKED);
pub const BUTTON3_DOUBLE_CLICKED: mmask_t = MASK!(3, DOUBLE_CLICKED);
pub const BUTTON3_TRIPLE_CLICKED: mmask_t = MASK!(3, TRIPLE_CLICKED);

pub const BUTTON4_RELEASED:       mmask_t = MASK!(4, BUTTON_RELEASED);
pub const BUTTON4_PRESSED:        mmask_t = MASK!(4, BUTTON_PRESSED);
pub const BUTTON4_CLICKED:        mmask_t = MASK!(4, BUTTON_CLICKED);
pub const BUTTON4_DOUBLE_CLICKED: mmask_t = MASK!(4, DOUBLE_CLICKED);
pub const BUTTON4_TRIPLE_CLICKED: mmask_t = MASK!(4, TRIPLE_CLICKED);

pub const BUTTON5_RELEASED:       mmask_t = MASK!(5, BUTTON_RELEASED);
pub const BUTTON5_PRESSED:        mmask_t = MASK!(5, BUTTON_PRESSED);
pub const BUTTON5_CLICKED:        mmask_t = MASK!(5, BUTTON_CLICKED);
pub const BUTTON5_DOUBLE_CLICKED: mmask_t = MASK!(5, DOUBLE_CLICKED);
pub const BUTTON5_TRIPLE_CLICKED: mmask_t = MASK!(5, TRIPLE_CLICKED);

pub const BUTTON_CTRL:  mmask_t = MASK!(6, 0o01);
pub const BUTTON_SHIFT: mmask_t = MASK!(6, 0o02);
pub const BUTTON_ALT:   mmask_t = MASK!(6, 0o04);

pub const REPORT_MOUSE_POSITION: mmask_t = MASK!(6, 0o10);
pub const ALL_MOUSE_EVENTS:      mmask_t = REPORT_MOUSE_POSITION - 1;

#[derive(Copy, Clone, Eq, PartialEq, Debug)]
#[repr(C)]
pub struct MEVENT {
	pub id:     c_short,
	pub x:      c_int,
	pub y:      c_int,
	pub z:      c_int,
	pub bstate: mmask_t,
}

#[cfg_attr(feature = "wide", link(name = "ncursesw"))]
#[cfg_attr(not(feature = "wide"), link(name = "ncurses"))]
extern "C" {
	pub fn has_mouse() -> bool;
	pub fn getmouse(event: *mut MEVENT) -> c_int;
	pub fn ungetmouse(event: *const MEVENT) -> c_int;
	pub fn mousemask(newmask: mmask_t, oldmask: *mut mmask_t) -> mmask_t;
	pub fn wenclose(win: *const WINDOW, y: c_int, x: c_int) -> bool;
	pub fn mouse_trafo(pY: *mut c_int, pX: *mut c_int, to_screen: bool) -> bool;
	pub fn wmouse_trafo(win: *const WINDOW, pY: *mut c_int, pX: *mut c_int, to_screen: bool) -> bool;
	pub fn mouseinterval(erval: c_int) -> c_int;
}