1#![allow(non_snake_case, non_camel_case_types, non_upper_case_globals)]
2
3pub mod fs;
4pub mod gl;
5mod rand;
6
7pub use gl::*;
8pub use rand::*;
9
10struct SappContext {
11 desc: sapp_desc,
12 clipboard: Option<String>,
13}
14
15impl SappContext {
16 unsafe fn init(desc: sapp_desc) {
17 let user_data = desc.user_data;
18 SAPP_CONTEXT = Some(SappContext {
19 desc,
20 clipboard: None,
21 });
22 SAPP_CONTEXT
23 .as_mut()
24 .unwrap()
25 .desc
26 .init_userdata_cb
27 .unwrap_or_else(|| panic!())(user_data);
28 }
29
30 unsafe fn frame(&mut self) {
31 let user_data = self.desc.user_data;
32 self.desc.frame_userdata_cb.unwrap_or_else(|| panic!())(user_data);
33 }
34
35 unsafe fn event(&mut self, event: sapp_event) {
36 let user_data = self.desc.user_data;
37 self.desc.event_userdata_cb.unwrap_or_else(|| panic!())(&event as *const _, user_data);
38 }
39}
40
41static mut SAPP_CONTEXT: Option<SappContext> = None;
42static mut sapp_cursor_icon: u32 = SAPP_CURSOR_DEFAULT;
43static mut sapp_cursor_shown: bool = true;
44
45unsafe fn sapp_context() -> &'static mut SappContext {
46 SAPP_CONTEXT.as_mut().unwrap()
47}
48
49pub type sapp_event_type = u32;
50pub type sapp_mousebutton = i32;
51pub type sapp_keycode = u32;
52
53pub const sapp_event_type_SAPP_EVENTTYPE_INVALID: sapp_event_type = 0;
54pub const sapp_event_type_SAPP_EVENTTYPE_KEY_DOWN: sapp_event_type = 1;
55pub const sapp_event_type_SAPP_EVENTTYPE_KEY_UP: sapp_event_type = 2;
56pub const sapp_event_type_SAPP_EVENTTYPE_CHAR: sapp_event_type = 3;
57pub const sapp_event_type_SAPP_EVENTTYPE_MOUSE_DOWN: sapp_event_type = 4;
58pub const sapp_event_type_SAPP_EVENTTYPE_MOUSE_UP: sapp_event_type = 5;
59pub const sapp_event_type_SAPP_EVENTTYPE_MOUSE_SCROLL: sapp_event_type = 6;
60pub const sapp_event_type_SAPP_EVENTTYPE_MOUSE_MOVE: sapp_event_type = 7;
61pub const sapp_event_type_SAPP_EVENTTYPE_MOUSE_ENTER: sapp_event_type = 8;
62pub const sapp_event_type_SAPP_EVENTTYPE_MOUSE_LEAVE: sapp_event_type = 9;
63pub const sapp_event_type_SAPP_EVENTTYPE_TOUCHES_BEGAN: sapp_event_type = 10;
64pub const sapp_event_type_SAPP_EVENTTYPE_TOUCHES_MOVED: sapp_event_type = 11;
65pub const sapp_event_type_SAPP_EVENTTYPE_TOUCHES_ENDED: sapp_event_type = 12;
66pub const sapp_event_type_SAPP_EVENTTYPE_TOUCHES_CANCELLED: sapp_event_type = 13;
67pub const sapp_event_type_SAPP_EVENTTYPE_RESIZED: sapp_event_type = 14;
68pub const sapp_event_type_SAPP_EVENTTYPE_ICONIFIED: sapp_event_type = 15;
69pub const sapp_event_type_SAPP_EVENTTYPE_RESTORED: sapp_event_type = 16;
70pub const sapp_event_type_SAPP_EVENTTYPE_SUSPENDED: sapp_event_type = 17;
71pub const sapp_event_type_SAPP_EVENTTYPE_RESUMED: sapp_event_type = 18;
72pub const sapp_event_type_SAPP_EVENTTYPE_UPDATE_CURSOR: sapp_event_type = 19;
73pub const sapp_event_type_SAPP_EVENTTYPE_QUIT_REQUESTED: sapp_event_type = 20;
74pub const sapp_event_type_SAPP_EVENTTYPE_RAW_DEVICE: sapp_event_type = 21;
75pub const sapp_event_type__SAPP_EVENTTYPE_NUM: sapp_event_type = 22;
76pub const sapp_event_type__SAPP_EVENTTYPE_FORCE_U32: sapp_event_type = 2147483647;
77
78pub const sapp_keycode_SAPP_KEYCODE_INVALID: sapp_keycode = 0;
79pub const sapp_keycode_SAPP_KEYCODE_SPACE: sapp_keycode = 32;
80pub const sapp_keycode_SAPP_KEYCODE_APOSTROPHE: sapp_keycode = 39;
81pub const sapp_keycode_SAPP_KEYCODE_COMMA: sapp_keycode = 44;
82pub const sapp_keycode_SAPP_KEYCODE_MINUS: sapp_keycode = 45;
83pub const sapp_keycode_SAPP_KEYCODE_PERIOD: sapp_keycode = 46;
84pub const sapp_keycode_SAPP_KEYCODE_SLASH: sapp_keycode = 47;
85pub const sapp_keycode_SAPP_KEYCODE_0: sapp_keycode = 48;
86pub const sapp_keycode_SAPP_KEYCODE_1: sapp_keycode = 49;
87pub const sapp_keycode_SAPP_KEYCODE_2: sapp_keycode = 50;
88pub const sapp_keycode_SAPP_KEYCODE_3: sapp_keycode = 51;
89pub const sapp_keycode_SAPP_KEYCODE_4: sapp_keycode = 52;
90pub const sapp_keycode_SAPP_KEYCODE_5: sapp_keycode = 53;
91pub const sapp_keycode_SAPP_KEYCODE_6: sapp_keycode = 54;
92pub const sapp_keycode_SAPP_KEYCODE_7: sapp_keycode = 55;
93pub const sapp_keycode_SAPP_KEYCODE_8: sapp_keycode = 56;
94pub const sapp_keycode_SAPP_KEYCODE_9: sapp_keycode = 57;
95pub const sapp_keycode_SAPP_KEYCODE_SEMICOLON: sapp_keycode = 59;
96pub const sapp_keycode_SAPP_KEYCODE_EQUAL: sapp_keycode = 61;
97pub const sapp_keycode_SAPP_KEYCODE_A: sapp_keycode = 65;
98pub const sapp_keycode_SAPP_KEYCODE_B: sapp_keycode = 66;
99pub const sapp_keycode_SAPP_KEYCODE_C: sapp_keycode = 67;
100pub const sapp_keycode_SAPP_KEYCODE_D: sapp_keycode = 68;
101pub const sapp_keycode_SAPP_KEYCODE_E: sapp_keycode = 69;
102pub const sapp_keycode_SAPP_KEYCODE_F: sapp_keycode = 70;
103pub const sapp_keycode_SAPP_KEYCODE_G: sapp_keycode = 71;
104pub const sapp_keycode_SAPP_KEYCODE_H: sapp_keycode = 72;
105pub const sapp_keycode_SAPP_KEYCODE_I: sapp_keycode = 73;
106pub const sapp_keycode_SAPP_KEYCODE_J: sapp_keycode = 74;
107pub const sapp_keycode_SAPP_KEYCODE_K: sapp_keycode = 75;
108pub const sapp_keycode_SAPP_KEYCODE_L: sapp_keycode = 76;
109pub const sapp_keycode_SAPP_KEYCODE_M: sapp_keycode = 77;
110pub const sapp_keycode_SAPP_KEYCODE_N: sapp_keycode = 78;
111pub const sapp_keycode_SAPP_KEYCODE_O: sapp_keycode = 79;
112pub const sapp_keycode_SAPP_KEYCODE_P: sapp_keycode = 80;
113pub const sapp_keycode_SAPP_KEYCODE_Q: sapp_keycode = 81;
114pub const sapp_keycode_SAPP_KEYCODE_R: sapp_keycode = 82;
115pub const sapp_keycode_SAPP_KEYCODE_S: sapp_keycode = 83;
116pub const sapp_keycode_SAPP_KEYCODE_T: sapp_keycode = 84;
117pub const sapp_keycode_SAPP_KEYCODE_U: sapp_keycode = 85;
118pub const sapp_keycode_SAPP_KEYCODE_V: sapp_keycode = 86;
119pub const sapp_keycode_SAPP_KEYCODE_W: sapp_keycode = 87;
120pub const sapp_keycode_SAPP_KEYCODE_X: sapp_keycode = 88;
121pub const sapp_keycode_SAPP_KEYCODE_Y: sapp_keycode = 89;
122pub const sapp_keycode_SAPP_KEYCODE_Z: sapp_keycode = 90;
123pub const sapp_keycode_SAPP_KEYCODE_LEFT_BRACKET: sapp_keycode = 91;
124pub const sapp_keycode_SAPP_KEYCODE_BACKSLASH: sapp_keycode = 92;
125pub const sapp_keycode_SAPP_KEYCODE_RIGHT_BRACKET: sapp_keycode = 93;
126pub const sapp_keycode_SAPP_KEYCODE_GRAVE_ACCENT: sapp_keycode = 96;
127pub const sapp_keycode_SAPP_KEYCODE_WORLD_1: sapp_keycode = 161;
128pub const sapp_keycode_SAPP_KEYCODE_WORLD_2: sapp_keycode = 162;
129pub const sapp_keycode_SAPP_KEYCODE_ESCAPE: sapp_keycode = 256;
130pub const sapp_keycode_SAPP_KEYCODE_ENTER: sapp_keycode = 257;
131pub const sapp_keycode_SAPP_KEYCODE_TAB: sapp_keycode = 258;
132pub const sapp_keycode_SAPP_KEYCODE_BACKSPACE: sapp_keycode = 259;
133pub const sapp_keycode_SAPP_KEYCODE_INSERT: sapp_keycode = 260;
134pub const sapp_keycode_SAPP_KEYCODE_DELETE: sapp_keycode = 261;
135pub const sapp_keycode_SAPP_KEYCODE_RIGHT: sapp_keycode = 262;
136pub const sapp_keycode_SAPP_KEYCODE_LEFT: sapp_keycode = 263;
137pub const sapp_keycode_SAPP_KEYCODE_DOWN: sapp_keycode = 264;
138pub const sapp_keycode_SAPP_KEYCODE_UP: sapp_keycode = 265;
139pub const sapp_keycode_SAPP_KEYCODE_PAGE_UP: sapp_keycode = 266;
140pub const sapp_keycode_SAPP_KEYCODE_PAGE_DOWN: sapp_keycode = 267;
141pub const sapp_keycode_SAPP_KEYCODE_HOME: sapp_keycode = 268;
142pub const sapp_keycode_SAPP_KEYCODE_END: sapp_keycode = 269;
143pub const sapp_keycode_SAPP_KEYCODE_CAPS_LOCK: sapp_keycode = 280;
144pub const sapp_keycode_SAPP_KEYCODE_SCROLL_LOCK: sapp_keycode = 281;
145pub const sapp_keycode_SAPP_KEYCODE_NUM_LOCK: sapp_keycode = 282;
146pub const sapp_keycode_SAPP_KEYCODE_PRINT_SCREEN: sapp_keycode = 283;
147pub const sapp_keycode_SAPP_KEYCODE_PAUSE: sapp_keycode = 284;
148pub const sapp_keycode_SAPP_KEYCODE_F1: sapp_keycode = 290;
149pub const sapp_keycode_SAPP_KEYCODE_F2: sapp_keycode = 291;
150pub const sapp_keycode_SAPP_KEYCODE_F3: sapp_keycode = 292;
151pub const sapp_keycode_SAPP_KEYCODE_F4: sapp_keycode = 293;
152pub const sapp_keycode_SAPP_KEYCODE_F5: sapp_keycode = 294;
153pub const sapp_keycode_SAPP_KEYCODE_F6: sapp_keycode = 295;
154pub const sapp_keycode_SAPP_KEYCODE_F7: sapp_keycode = 296;
155pub const sapp_keycode_SAPP_KEYCODE_F8: sapp_keycode = 297;
156pub const sapp_keycode_SAPP_KEYCODE_F9: sapp_keycode = 298;
157pub const sapp_keycode_SAPP_KEYCODE_F10: sapp_keycode = 299;
158pub const sapp_keycode_SAPP_KEYCODE_F11: sapp_keycode = 300;
159pub const sapp_keycode_SAPP_KEYCODE_F12: sapp_keycode = 301;
160pub const sapp_keycode_SAPP_KEYCODE_F13: sapp_keycode = 302;
161pub const sapp_keycode_SAPP_KEYCODE_F14: sapp_keycode = 303;
162pub const sapp_keycode_SAPP_KEYCODE_F15: sapp_keycode = 304;
163pub const sapp_keycode_SAPP_KEYCODE_F16: sapp_keycode = 305;
164pub const sapp_keycode_SAPP_KEYCODE_F17: sapp_keycode = 306;
165pub const sapp_keycode_SAPP_KEYCODE_F18: sapp_keycode = 307;
166pub const sapp_keycode_SAPP_KEYCODE_F19: sapp_keycode = 308;
167pub const sapp_keycode_SAPP_KEYCODE_F20: sapp_keycode = 309;
168pub const sapp_keycode_SAPP_KEYCODE_F21: sapp_keycode = 310;
169pub const sapp_keycode_SAPP_KEYCODE_F22: sapp_keycode = 311;
170pub const sapp_keycode_SAPP_KEYCODE_F23: sapp_keycode = 312;
171pub const sapp_keycode_SAPP_KEYCODE_F24: sapp_keycode = 313;
172pub const sapp_keycode_SAPP_KEYCODE_F25: sapp_keycode = 314;
173pub const sapp_keycode_SAPP_KEYCODE_KP_0: sapp_keycode = 320;
174pub const sapp_keycode_SAPP_KEYCODE_KP_1: sapp_keycode = 321;
175pub const sapp_keycode_SAPP_KEYCODE_KP_2: sapp_keycode = 322;
176pub const sapp_keycode_SAPP_KEYCODE_KP_3: sapp_keycode = 323;
177pub const sapp_keycode_SAPP_KEYCODE_KP_4: sapp_keycode = 324;
178pub const sapp_keycode_SAPP_KEYCODE_KP_5: sapp_keycode = 325;
179pub const sapp_keycode_SAPP_KEYCODE_KP_6: sapp_keycode = 326;
180pub const sapp_keycode_SAPP_KEYCODE_KP_7: sapp_keycode = 327;
181pub const sapp_keycode_SAPP_KEYCODE_KP_8: sapp_keycode = 328;
182pub const sapp_keycode_SAPP_KEYCODE_KP_9: sapp_keycode = 329;
183pub const sapp_keycode_SAPP_KEYCODE_KP_DECIMAL: sapp_keycode = 330;
184pub const sapp_keycode_SAPP_KEYCODE_KP_DIVIDE: sapp_keycode = 331;
185pub const sapp_keycode_SAPP_KEYCODE_KP_MULTIPLY: sapp_keycode = 332;
186pub const sapp_keycode_SAPP_KEYCODE_KP_SUBTRACT: sapp_keycode = 333;
187pub const sapp_keycode_SAPP_KEYCODE_KP_ADD: sapp_keycode = 334;
188pub const sapp_keycode_SAPP_KEYCODE_KP_ENTER: sapp_keycode = 335;
189pub const sapp_keycode_SAPP_KEYCODE_KP_EQUAL: sapp_keycode = 336;
190pub const sapp_keycode_SAPP_KEYCODE_LEFT_SHIFT: sapp_keycode = 340;
191pub const sapp_keycode_SAPP_KEYCODE_LEFT_CONTROL: sapp_keycode = 341;
192pub const sapp_keycode_SAPP_KEYCODE_LEFT_ALT: sapp_keycode = 342;
193pub const sapp_keycode_SAPP_KEYCODE_LEFT_SUPER: sapp_keycode = 343;
194pub const sapp_keycode_SAPP_KEYCODE_RIGHT_SHIFT: sapp_keycode = 344;
195pub const sapp_keycode_SAPP_KEYCODE_RIGHT_CONTROL: sapp_keycode = 345;
196pub const sapp_keycode_SAPP_KEYCODE_RIGHT_ALT: sapp_keycode = 346;
197pub const sapp_keycode_SAPP_KEYCODE_RIGHT_SUPER: sapp_keycode = 347;
198pub const sapp_keycode_SAPP_KEYCODE_MENU: sapp_keycode = 348;
199
200pub const sapp_mousebutton_SAPP_MOUSEBUTTON_INVALID: sapp_mousebutton = -1;
201pub const sapp_mousebutton_SAPP_MOUSEBUTTON_LEFT: sapp_mousebutton = 0;
202pub const sapp_mousebutton_SAPP_MOUSEBUTTON_RIGHT: sapp_mousebutton = 1;
203pub const sapp_mousebutton_SAPP_MOUSEBUTTON_MIDDLE: sapp_mousebutton = 2;
204
205pub const SAPP_MODIFIER_SHIFT: u32 = 1 << 0;
206pub const SAPP_MODIFIER_CTRL: u32 = 1 << 1;
207pub const SAPP_MODIFIER_ALT: u32 = 1 << 2;
208pub const SAPP_MODIFIER_SUPER: u32 = 1 << 3;
209
210pub const SAPP_CURSOR_DEFAULT: u32 = 0;
211pub const SAPP_CURSOR_HELP: u32 = 1;
212pub const SAPP_CURSOR_POINTER: u32 = 2;
213pub const SAPP_CURSOR_WAIT: u32 = 3;
214pub const SAPP_CURSOR_CROSSHAIR: u32 = 4;
215pub const SAPP_CURSOR_TEXT: u32 = 5;
216pub const SAPP_CURSOR_MOVE: u32 = 6;
217pub const SAPP_CURSOR_NOTALLOWED: u32 = 7;
218pub const SAPP_CURSOR_EWRESIZE: u32 = 8;
219pub const SAPP_CURSOR_NSRESIZE: u32 = 9;
220pub const SAPP_CURSOR_NESWRESIZE: u32 = 10;
221pub const SAPP_CURSOR_NWSERESIZE: u32 = 11;
222
223#[repr(C)]
224#[derive(Debug, Copy, Clone)]
225pub struct sapp_event {
226 pub frame_count: u64,
227 pub type_: sapp_event_type,
228 pub key_code: sapp_keycode,
229 pub char_code: u32,
230 pub key_repeat: bool,
231 pub modifiers: u32,
232 pub mouse_button: sapp_mousebutton,
233 pub mouse_x: f32,
234 pub mouse_y: f32,
235 pub mouse_dx: f32,
236 pub mouse_dy: f32,
237 pub scroll_x: f32,
238 pub scroll_y: f32,
239 pub num_touches: ::std::os::raw::c_int,
240 pub touches: [sapp_touchpoint; 8usize],
241 pub window_width: ::std::os::raw::c_int,
242 pub window_height: ::std::os::raw::c_int,
243 pub framebuffer_width: ::std::os::raw::c_int,
244 pub framebuffer_height: ::std::os::raw::c_int,
245}
246
247#[repr(C)]
248#[derive(Debug, Copy, Clone)]
249pub struct sapp_touchpoint {
250 pub identifier: usize,
251 pub pos_x: f32,
252 pub pos_y: f32,
253 pub changed: bool,
254}
255
256#[repr(C)]
257#[derive(Debug, Copy, Clone)]
258pub struct sapp_desc {
259 pub init_cb: ::std::option::Option<unsafe extern "C" fn()>,
260 pub frame_cb: ::std::option::Option<unsafe extern "C" fn()>,
261 pub cleanup_cb: ::std::option::Option<unsafe extern "C" fn()>,
262 pub event_cb: ::std::option::Option<unsafe extern "C" fn(arg1: *const sapp_event)>,
263 pub fail_cb: ::std::option::Option<unsafe extern "C" fn(arg1: *const ::std::os::raw::c_char)>,
264 pub user_data: *mut ::std::os::raw::c_void,
265 pub init_userdata_cb:
266 ::std::option::Option<unsafe extern "C" fn(arg1: *mut ::std::os::raw::c_void)>,
267 pub frame_userdata_cb:
268 ::std::option::Option<unsafe extern "C" fn(arg1: *mut ::std::os::raw::c_void)>,
269 pub cleanup_userdata_cb:
270 ::std::option::Option<unsafe extern "C" fn(arg1: *mut ::std::os::raw::c_void)>,
271 pub event_userdata_cb: ::std::option::Option<
272 unsafe extern "C" fn(arg1: *const sapp_event, arg2: *mut ::std::os::raw::c_void),
273 >,
274 pub fail_userdata_cb: ::std::option::Option<
275 unsafe extern "C" fn(
276 arg1: *const ::std::os::raw::c_char,
277 arg2: *mut ::std::os::raw::c_void,
278 ),
279 >,
280 pub width: ::std::os::raw::c_int,
281 pub height: ::std::os::raw::c_int,
282 pub window_resizable: bool,
283 pub sample_count: ::std::os::raw::c_int,
284 pub swap_interval: ::std::os::raw::c_int,
285 pub high_dpi: bool,
286 pub fullscreen: bool,
287 pub alpha: bool,
288 pub window_title: *const ::std::os::raw::c_char,
289 pub user_cursor: bool,
290 pub html5_canvas_name: *const ::std::os::raw::c_char,
291 pub html5_canvas_resize: bool,
292 pub html5_preserve_drawing_buffer: bool,
293 pub html5_premultiplied_alpha: bool,
294 pub html5_ask_leave_site: bool,
295 pub ios_keyboard_resizes_canvas: bool,
296 pub gl_force_gles2: bool,
297}
298
299pub unsafe fn sapp_run(desc: *const sapp_desc) -> ::std::os::raw::c_int {
300 {
301 use std::ffi::CString;
302 use std::panic;
303
304 panic::set_hook(Box::new(|info| {
305 let msg = CString::new(format!("{:?}", info)).unwrap_or_else(|_| {
306 CString::new(format!("MALFORMED ERROR MESSAGE {:?}", info.location())).unwrap()
307 });
308 console_log(msg.as_ptr());
309 }));
310 }
311
312 setup_canvas_size((*desc).high_dpi);
314
315 SappContext::init(*desc);
317
318 run_animation_loop();
320
321 0
322}
323
324pub unsafe fn sapp_width() -> ::std::os::raw::c_int {
325 canvas_width()
326}
327
328pub unsafe fn sapp_height() -> ::std::os::raw::c_int {
329 canvas_height()
330}
331
332extern "C" {
333 pub fn setup_canvas_size(high_dpi: bool);
334 pub fn run_animation_loop();
335 pub fn canvas_width() -> i32;
336 pub fn canvas_height() -> i32;
337 pub fn dpi_scale() -> f32;
338 pub fn console_debug(msg: *const ::std::os::raw::c_char);
339 pub fn console_log(msg: *const ::std::os::raw::c_char);
340 pub fn console_info(msg: *const ::std::os::raw::c_char);
341 pub fn console_warn(msg: *const ::std::os::raw::c_char);
342 pub fn console_error(msg: *const ::std::os::raw::c_char);
343
344 pub fn sapp_set_clipboard(clipboard: *const i8, len: usize);
345
346 pub fn sapp_set_cursor_grab(grab: bool);
352
353 pub fn sapp_set_cursor(cursor: *const u8, len: usize);
354
355 pub fn sapp_is_elapsed_timer_supported() -> bool;
356
357 pub fn sapp_set_fullscreen(fullscreen: bool);
358 pub fn sapp_is_fullscreen() -> bool;
359 pub fn sapp_set_window_size(new_width: u32, new_height: u32);
360}
361
362
363pub unsafe fn sapp_show_mouse(shown: bool) {
364 if shown != sapp_cursor_shown {
365 sapp_cursor_shown = shown;
366 update_cursor();
367 }
368}
369
370pub unsafe fn sapp_set_mouse_cursor(cursor_icon: u32) {
371 if cursor_icon != sapp_cursor_icon {
372 sapp_cursor_icon = cursor_icon;
373 if sapp_cursor_shown {
374 update_cursor();
375 }
376 }
377}
378
379pub unsafe fn update_cursor() {
380 let css_name = if !sapp_cursor_shown {
381 "none"
382 } else {
383 match sapp_cursor_icon {
384 SAPP_CURSOR_DEFAULT => "default",
385 SAPP_CURSOR_HELP => "help",
386 SAPP_CURSOR_POINTER => "pointer",
387 SAPP_CURSOR_WAIT => "wait",
388 SAPP_CURSOR_CROSSHAIR => "crosshair",
389 SAPP_CURSOR_TEXT => "text",
390 SAPP_CURSOR_MOVE => "move",
391 SAPP_CURSOR_NOTALLOWED => "not-allowed",
392 SAPP_CURSOR_EWRESIZE => "ew-resize",
393 SAPP_CURSOR_NSRESIZE => "ns-resize",
394 SAPP_CURSOR_NESWRESIZE => "nesw-resize",
395 SAPP_CURSOR_NWSERESIZE => "nwse-resize",
396 _ => return,
397 }
398 };
399 sapp_set_cursor(css_name.as_ptr(), css_name.len());
400}
401
402pub unsafe fn sapp_high_dpi() -> bool {
403 sapp_context().desc.high_dpi
404}
405
406pub unsafe fn sapp_dpi_scale() -> f32 {
407 dpi_scale()
408}
409
410#[no_mangle]
411pub extern "C" fn crate_version() -> u32 {
412 let major = env!("CARGO_PKG_VERSION_MAJOR").parse::<u32>().unwrap();
413 let minor = env!("CARGO_PKG_VERSION_MINOR").parse::<u32>().unwrap();
414 let patch = env!("CARGO_PKG_VERSION_PATCH").parse::<u32>().unwrap();
415
416 (major << 24) + (minor << 16) + patch
417}
418
419#[no_mangle]
420pub extern "C" fn allocate_vec_u8(len: usize) -> *mut u8 {
421 let mut string = vec![0u8; len];
422 let ptr = string.as_mut_ptr();
423 std::mem::forget(string);
424 ptr
425}
426
427#[no_mangle]
428pub extern "C" fn on_clipboard_paste(msg: *mut u8, len: usize) {
429 let msg = unsafe { String::from_raw_parts(msg, len, len) };
430
431 unsafe { sapp_context().clipboard = Some(msg) };
432}
433
434pub fn clipboard_get() -> Option<String> {
435 unsafe { sapp_context().clipboard.clone() }
436}
437
438pub fn clipboard_set(data: &str) {
439 let len = data.len();
440 let data = std::ffi::CString::new(data).unwrap();
441 unsafe { sapp_set_clipboard(data.as_ptr(), len) };
442}
443
444#[no_mangle]
445pub extern "C" fn frame() {
446 unsafe {
447 sapp_context().frame();
448 }
449}
450
451#[no_mangle]
452pub extern "C" fn mouse_move(x: i32, y: i32) {
453 let mut event: sapp_event = unsafe { std::mem::zeroed() };
454
455 event.type_ = sapp_event_type_SAPP_EVENTTYPE_MOUSE_MOVE;
456 event.mouse_x = x as f32;
457 event.mouse_y = y as f32;
458 unsafe {
459 sapp_context().event(event);
460 }
461}
462
463#[no_mangle]
464pub extern "C" fn raw_mouse_move(dx: i32, dy: i32) {
465 let mut event: sapp_event = unsafe { std::mem::zeroed() };
466
467 event.type_ = sapp_event_type_SAPP_EVENTTYPE_RAW_DEVICE;
468 event.mouse_dx = dx as f32;
469 event.mouse_dy = dy as f32;
470 unsafe {
471 sapp_context().event(event);
472 }
473}
474
475#[no_mangle]
476pub extern "C" fn mouse_down(x: i32, y: i32, btn: i32) {
477 let mut event: sapp_event = unsafe { std::mem::zeroed() };
478
479 event.type_ = sapp_event_type_SAPP_EVENTTYPE_MOUSE_DOWN;
480 event.mouse_button = btn;
481 event.mouse_x = x as f32;
482 event.mouse_y = y as f32;
483 unsafe {
484 sapp_context().event(event);
485 }
486}
487
488#[no_mangle]
489pub extern "C" fn mouse_up(x: i32, y: i32, btn: i32) {
490 let mut event: sapp_event = unsafe { std::mem::zeroed() };
491
492 event.type_ = sapp_event_type_SAPP_EVENTTYPE_MOUSE_UP;
493 event.mouse_button = btn;
494 event.mouse_x = x as f32;
495 event.mouse_y = y as f32;
496 unsafe {
497 sapp_context().event(event);
498 }
499}
500
501#[no_mangle]
502pub extern "C" fn mouse_wheel(delta_x: i32, delta_y: i32) {
503 let mut event: sapp_event = unsafe { std::mem::zeroed() };
504
505 event.type_ = sapp_event_type_SAPP_EVENTTYPE_MOUSE_SCROLL;
506 event.scroll_x = delta_x as f32;
507 event.scroll_y = delta_y as f32;
508 unsafe {
509 sapp_context().event(event);
510 }
511}
512
513#[no_mangle]
514pub extern "C" fn key_down(key: u32, modifiers: u32, repeat: bool) {
515 let mut event: sapp_event = unsafe { std::mem::zeroed() };
516
517 event.type_ = sapp_event_type_SAPP_EVENTTYPE_KEY_DOWN;
518 event.key_code = key;
519 event.modifiers = modifiers;
520 event.key_repeat = repeat;
521 unsafe {
522 sapp_context().event(event);
523 }
524}
525
526#[no_mangle]
527pub extern "C" fn key_press(key: u32) {
528 let mut event: sapp_event = unsafe { std::mem::zeroed() };
529
530 event.type_ = sapp_event_type_SAPP_EVENTTYPE_CHAR;
531 event.char_code = key;
532 unsafe {
533 sapp_context().event(event);
534 }
535}
536
537#[no_mangle]
538pub extern "C" fn key_up(key: u32) {
539 let mut event: sapp_event = unsafe { std::mem::zeroed() };
540
541 event.type_ = sapp_event_type_SAPP_EVENTTYPE_KEY_UP;
542 event.key_code = key;
543 unsafe {
544 sapp_context().event(event);
545 }
546}
547
548#[no_mangle]
549pub extern "C" fn resize(width: i32, height: i32) {
550 let mut event: sapp_event = unsafe { std::mem::zeroed() };
551
552 event.type_ = sapp_event_type_SAPP_EVENTTYPE_RESIZED;
553 event.window_width = width;
554 event.window_height = height;
555 event.framebuffer_width = width;
556 event.framebuffer_height = height;
557
558 unsafe {
559 sapp_context().event(event);
560 }
561}
562
563#[no_mangle]
564pub extern "C" fn touch(event_type: u32, id: u32, x: f32, y: f32) {
565 let mut event: sapp_event = unsafe { std::mem::zeroed() };
566
567 event.type_ = event_type as u32;
568 event.num_touches = 1;
569 event.touches[0].identifier = id as usize;
570 event.touches[0].pos_x = x;
571 event.touches[0].pos_y = y;
572 event.touches[0].changed = true;
573 unsafe {
574 sapp_context().event(event);
575 }
576}