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}