android_support/
lib.rs

1#![cfg(target_os = "android")]
2extern crate android_ffi;
3// extern {
4    // fn cargo_apk_injected_glue_get_native_window() -> *const c_void;
5    // fn cargo_apk_injected_glue_add_sender(sender: *mut ());
6    // fn cargo_apk_injected_glue_add_sender_missing(sender: *mut ());
7    // fn cargo_apk_injected_glue_add_sync_event_handler(sender: *mut ());
8    // fn cargo_apk_injected_glue_remove_sync_event_handler(sender: *mut ());
9    // fn cargo_apk_injected_glue_set_multitouch(multitouch: bool);
10    // fn cargo_apk_injected_glue_write_log(ptr: *const (), len: usize);
11    // fn cargo_apk_injected_glue_load_asset(ptr: *const (), len: usize) -> *mut c_void;
12    // fn cargo_apk_injected_glue_wake_event_loop();
13// }
14
15use std::mem;
16use std::os::raw::c_void;
17use std::sync::mpsc::Sender;
18
19/// An event triggered by the Android environment.
20#[derive(Clone, Copy, Debug)]
21pub enum Event {
22    EventMotion(Motion),
23    EventKeyUp,
24    EventKeyDown,
25    InitWindow,
26    SaveState,
27    TermWindow,
28    GainedFocus,
29    LostFocus,
30    InputChanged,
31    WindowResized,
32    WindowRedrawNeeded,
33    ContentRectChanged,
34    ConfigChanged,
35    LowMemory,
36    Start,
37    Resume,
38    Pause,
39    Stop,
40    Destroy,
41    Wake
42}
43
44/// Data about a motion event.
45#[derive(Clone, Copy, Debug)]
46pub struct Motion {
47    pub action: MotionAction,
48    pub pointer_id: i32,
49    pub x: f32,
50    pub y: f32,
51}
52
53/// The type of pointer action in a motion event.
54#[derive(Clone, Copy, Debug)]
55pub enum MotionAction {
56    Down,
57    Move,
58    Up,
59    Cancel,
60}
61
62pub enum AssetError {
63    AssetMissing,
64    EmptyBuffer,
65}
66
67// Trait used to dispatch sync events from the polling loop thread.
68pub trait SyncEventHandler {
69    fn handle(&mut self, event: &Event);
70}
71
72/// Adds a sender where events will be sent to.
73#[inline]
74pub fn add_sender(sender: Sender<Event>) {
75    unsafe {
76        let sender = Box::into_raw(Box::new(sender)) as *mut _;
77        android_ffi::cargo_apk_injected_glue_add_sender(sender);
78    }
79}
80
81/// Adds a SyncEventHandler which will receive sync events from the polling loop.
82#[inline]
83pub fn add_sync_event_handler(handler: Box<SyncEventHandler>) {
84    unsafe {
85        let handler = Box::into_raw(Box::new(handler)) as *mut _;
86        android_ffi::cargo_apk_injected_glue_add_sync_event_handler(handler);
87    }
88}
89
90/// Removes a SyncEventHandler.
91#[inline]
92pub fn remove_sync_event_handler(handler: *const SyncEventHandler) {
93    unsafe {
94        let handler = Box::into_raw(Box::new(handler)) as *mut _;
95        android_ffi::cargo_apk_injected_glue_remove_sync_event_handler(handler);
96    }
97}
98
99#[inline]
100pub fn set_multitouch(multitouch: bool) {
101    unsafe {
102        android_ffi::cargo_apk_injected_glue_set_multitouch(multitouch);
103    }
104}
105
106/// Adds a sender where events will be sent to, but also sends
107/// any missing events to the sender object.
108///
109/// The missing events happen when the application starts, but before
110/// any senders are registered. Since these might be important to certain
111/// applications, this function provides that support.
112#[inline]
113pub fn add_sender_missing(sender: Sender<Event>) {
114    unsafe {
115        let sender = Box::into_raw(Box::new(sender)) as *mut _;
116        android_ffi::cargo_apk_injected_glue_add_sender_missing(sender);
117    }
118}
119
120/// Returns a handle to the native window.
121#[inline]
122pub unsafe fn get_native_window() -> *const c_void {
123    android_ffi::cargo_apk_injected_glue_get_native_window()
124}
125
126///
127#[inline]
128pub fn write_log(message: &str) {
129    unsafe {
130        let (message_ptr, message_len) = mem::transmute(message);
131        android_ffi::cargo_apk_injected_glue_write_log(message_ptr, message_len);
132    }
133}
134
135#[inline]
136pub fn load_asset(filename: &str) -> Result<Vec<u8>, AssetError> {
137    unsafe {
138        let (filename_ptr, filename_len) = mem::transmute(filename);
139        let data = android_ffi::cargo_apk_injected_glue_load_asset(filename_ptr, filename_len);
140        let data: Box<Result<Vec<u8>, AssetError>> = Box::from_raw(data as *mut _);
141        *data
142    }
143}
144
145// Wakes the event poll asynchronously and sends a Event::Wake event to the senders. 
146// This method can be called on any thread. This method returns immediately.
147#[inline]
148pub fn wake_event_loop() {
149    unsafe {
150        android_ffi::cargo_apk_injected_glue_wake_event_loop();
151    }
152}