1use libc::{c_short, c_int, uint32_t};
2use base::WINDOW;
3
4pub type mmask_t = uint32_t;
5
6macro_rules! MASK {
7 ($btn:expr, $ev:expr) => (
8 $ev << (($btn - 1) * 5)
9 )
10}
11
12pub const BUTTON_RELEASED: mmask_t = 0o01;
13pub const BUTTON_PRESSED: mmask_t = 0o02;
14pub const BUTTON_CLICKED: mmask_t = 0o04;
15pub const DOUBLE_CLICKED: mmask_t = 0o10;
16pub const TRIPLE_CLICKED: mmask_t = 0o20;
17pub const RESERVED_EVENT: mmask_t = 0o40;
18
19pub const BUTTON1_RELEASED: mmask_t = MASK!(1, BUTTON_RELEASED);
20pub const BUTTON1_PRESSED: mmask_t = MASK!(1, BUTTON_PRESSED);
21pub const BUTTON1_CLICKED: mmask_t = MASK!(1, BUTTON_CLICKED);
22pub const BUTTON1_DOUBLE_CLICKED: mmask_t = MASK!(1, DOUBLE_CLICKED);
23pub const BUTTON1_TRIPLE_CLICKED: mmask_t = MASK!(1, TRIPLE_CLICKED);
24
25pub const BUTTON2_RELEASED: mmask_t = MASK!(2, BUTTON_RELEASED);
26pub const BUTTON2_PRESSED: mmask_t = MASK!(2, BUTTON_PRESSED);
27pub const BUTTON2_CLICKED: mmask_t = MASK!(2, BUTTON_CLICKED);
28pub const BUTTON2_DOUBLE_CLICKED: mmask_t = MASK!(2, DOUBLE_CLICKED);
29pub const BUTTON2_TRIPLE_CLICKED: mmask_t = MASK!(2, TRIPLE_CLICKED);
30
31pub const BUTTON3_RELEASED: mmask_t = MASK!(3, BUTTON_RELEASED);
32pub const BUTTON3_PRESSED: mmask_t = MASK!(3, BUTTON_PRESSED);
33pub const BUTTON3_CLICKED: mmask_t = MASK!(3, BUTTON_CLICKED);
34pub const BUTTON3_DOUBLE_CLICKED: mmask_t = MASK!(3, DOUBLE_CLICKED);
35pub const BUTTON3_TRIPLE_CLICKED: mmask_t = MASK!(3, TRIPLE_CLICKED);
36
37pub const BUTTON4_RELEASED: mmask_t = MASK!(4, BUTTON_RELEASED);
38pub const BUTTON4_PRESSED: mmask_t = MASK!(4, BUTTON_PRESSED);
39pub const BUTTON4_CLICKED: mmask_t = MASK!(4, BUTTON_CLICKED);
40pub const BUTTON4_DOUBLE_CLICKED: mmask_t = MASK!(4, DOUBLE_CLICKED);
41pub const BUTTON4_TRIPLE_CLICKED: mmask_t = MASK!(4, TRIPLE_CLICKED);
42
43pub const BUTTON5_RELEASED: mmask_t = MASK!(5, BUTTON_RELEASED);
44pub const BUTTON5_PRESSED: mmask_t = MASK!(5, BUTTON_PRESSED);
45pub const BUTTON5_CLICKED: mmask_t = MASK!(5, BUTTON_CLICKED);
46pub const BUTTON5_DOUBLE_CLICKED: mmask_t = MASK!(5, DOUBLE_CLICKED);
47pub const BUTTON5_TRIPLE_CLICKED: mmask_t = MASK!(5, TRIPLE_CLICKED);
48
49pub const BUTTON_CTRL: mmask_t = MASK!(6, 0o01);
50pub const BUTTON_SHIFT: mmask_t = MASK!(6, 0o02);
51pub const BUTTON_ALT: mmask_t = MASK!(6, 0o04);
52
53pub const REPORT_MOUSE_POSITION: mmask_t = MASK!(6, 0o10);
54pub const ALL_MOUSE_EVENTS: mmask_t = REPORT_MOUSE_POSITION - 1;
55
56#[derive(Copy, Clone, Eq, PartialEq, Debug)]
57#[repr(C)]
58pub struct MEVENT {
59 pub id: c_short,
60 pub x: c_int,
61 pub y: c_int,
62 pub z: c_int,
63 pub bstate: mmask_t,
64}
65
66#[cfg_attr(feature = "wide", link(name = "ncursesw"))]
67#[cfg_attr(not(feature = "wide"), link(name = "ncurses"))]
68extern "C" {
69 pub fn has_mouse() -> bool;
70 pub fn getmouse(event: *mut MEVENT) -> c_int;
71 pub fn ungetmouse(event: *const MEVENT) -> c_int;
72 pub fn mousemask(newmask: mmask_t, oldmask: *mut mmask_t) -> mmask_t;
73 pub fn wenclose(win: *const WINDOW, y: c_int, x: c_int) -> bool;
74 pub fn mouse_trafo(pY: *mut c_int, pX: *mut c_int, to_screen: bool) -> bool;
75 pub fn wmouse_trafo(win: *const WINDOW, pY: *mut c_int, pX: *mut c_int, to_screen: bool) -> bool;
76 pub fn mouseinterval(erval: c_int) -> c_int;
77}