sdl/
mouse.rs

1use libc::c_int;
2
3use get_error;
4
5pub mod ll {
6    #![allow(non_camel_case_types)]
7
8    use libc::{c_void, c_int, uint8_t, uint16_t, int16_t};
9
10    use Rect;
11
12    pub static SDL_DISABLE: c_int = 0;
13    pub static SDL_ENABLE: c_int = 1;
14    pub static SDL_QUERY: c_int = -1;
15
16    pub type WMcursor = c_void;
17
18    #[repr(C)]
19    #[derive(Copy, Clone)]
20    pub struct SDL_Cursor {
21         pub area: Rect,
22         pub hot_x: int16_t,
23         pub hot_y: int16_t,
24         pub data: *mut uint8_t,
25         pub mask: *mut uint8_t,
26         pub save: [*mut uint8_t; 2],
27         pub wm_cursor: *mut WMcursor,
28    }
29
30    extern "C" {
31        pub fn SDL_ShowCursor(toggle: c_int) -> c_int;
32        pub fn SDL_CreateCursor(data: *mut uint8_t,
33                                mask: *mut uint8_t,
34                                w: c_int,
35                                h: c_int,
36                                hot_x: c_int,
37                                hot_y: c_int)
38                    -> *mut SDL_Cursor;
39        pub fn SDL_SetCursor(cursor: *mut SDL_Cursor);
40        pub fn SDL_GetCursor() -> *mut SDL_Cursor;
41        pub fn SDL_FreeCursor(cursor: *mut SDL_Cursor);
42        pub fn SDL_WarpMouse(x: uint16_t, y: uint16_t);
43    }
44}
45
46pub fn warp_mouse(x: u16, y: u16) {
47    unsafe { ll::SDL_WarpMouse(x, y); }
48}
49
50#[derive(PartialEq)]
51pub struct Cursor {
52    pub raw: *mut ll::SDL_Cursor,
53    pub owned: bool
54}
55
56fn wrap_cursor(raw: *mut ll::SDL_Cursor, owned: bool) -> Cursor {
57    Cursor {
58        raw: raw,
59        owned: owned
60    }
61}
62
63impl Cursor {
64    pub fn new(data: &[u8], mask: &[u8], w: isize, h: isize, hot_x: isize, hot_y: isize)
65            -> Result<Cursor, String> {
66        let mut data = data.to_vec();
67        let mut mask = mask.to_vec();
68        unsafe {
69            let raw = ll::SDL_CreateCursor(data.as_mut_ptr(), mask.as_mut_ptr(),
70                                           w as c_int, h as c_int, hot_x as c_int,
71                                           hot_y as c_int);
72
73                if raw.is_null() { Err(get_error()) }
74                else { Ok(wrap_cursor(raw, true)) }
75        }
76    }
77}
78
79impl Drop for Cursor {
80    fn drop(&mut self) {
81        unsafe {
82            if self.owned {
83                ll::SDL_FreeCursor(self.raw);
84            }
85        }
86    }
87}
88
89pub fn set_cursor(cursor: &Cursor) {
90    unsafe { ll::SDL_SetCursor(cursor.raw); }
91}
92
93pub fn get_cursor() -> Cursor {
94    unsafe { wrap_cursor(ll::SDL_GetCursor(), false) }
95}
96
97pub fn set_cursor_visible(visible: bool) {
98    unsafe { ll::SDL_ShowCursor(visible as c_int); }
99}
100
101pub fn toggle_cursor_visible() {
102    unsafe {
103        if ll::SDL_ShowCursor(ll::SDL_QUERY) == ll::SDL_ENABLE {
104            ll::SDL_ShowCursor(ll::SDL_DISABLE);
105        } else {
106            ll::SDL_ShowCursor(ll::SDL_ENABLE);
107        }
108    }
109}
110
111pub fn is_cursor_visible() -> bool {
112    unsafe { ll::SDL_ShowCursor(ll::SDL_QUERY) == ll::SDL_ENABLE }
113}