aboutsummaryrefslogtreecommitdiffstats
path: root/src/api/ios/ffi.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/api/ios/ffi.rs')
-rw-r--r--src/api/ios/ffi.rs130
1 files changed, 130 insertions, 0 deletions
diff --git a/src/api/ios/ffi.rs b/src/api/ios/ffi.rs
new file mode 100644
index 0000000..72f2ff2
--- /dev/null
+++ b/src/api/ios/ffi.rs
@@ -0,0 +1,130 @@
+use std::ffi::CString;
+
+use libc;
+use objc::runtime::{ Object, Class };
+
+#[allow(non_camel_case_types)]
+pub type id = *mut Object;
+
+#[allow(non_camel_case_types)]
+#[allow(non_upper_case_globals)]
+pub const nil: id = 0 as id;
+
+pub type CFStringRef = *const libc::c_void;
+pub type CFTimeInterval = f64;
+pub type Boolean = u32;
+
+#[allow(non_upper_case_globals)]
+pub const kCFRunLoopRunHandledSource: i32 = 4;
+
+#[cfg(target_pointer_width = "32")]
+pub type CGFloat = f32;
+#[cfg(target_pointer_width = "64")]
+pub type CGFloat = f64;
+
+#[cfg(target_pointer_width = "32")]
+pub type NSUInteger = u32;
+#[cfg(target_pointer_width = "64")]
+pub type NSUInteger = u64;
+
+#[allow(non_upper_case_globals)]
+pub const UIViewAutoresizingFlexibleWidth: NSUInteger = 1 << 1;
+#[allow(non_upper_case_globals)]
+pub const UIViewAutoresizingFlexibleHeight: NSUInteger = 1 << 4;
+
+
+#[repr(C)]
+#[derive(Debug, Clone)]
+pub struct CGPoint {
+ pub x: CGFloat,
+ pub y: CGFloat,
+}
+
+#[repr(C)]
+#[derive(Debug, Clone)]
+pub struct CGRect {
+ pub origin: CGPoint,
+ pub size: CGSize
+}
+
+#[repr(C)]
+#[derive(Debug, Clone)]
+pub struct CGSize {
+ pub width: CGFloat,
+ pub height: CGFloat
+}
+
+pub mod gles {
+ include!(concat!(env!("OUT_DIR"), "/gles2_bindings.rs"));
+}
+
+#[link(name = "UIKit", kind = "framework")]
+#[link(name = "CoreFoundation", kind = "framework")]
+#[link(name = "GlKit", kind = "framework")]
+extern {
+ pub static kCFRunLoopDefaultMode: CFStringRef;
+
+ pub static kEAGLColorFormatRGB565: id;
+ // pub static kEAGLColorFormatRGBA8: id;
+ pub static kEAGLDrawablePropertyColorFormat: id;
+ pub static kEAGLDrawablePropertyRetainedBacking: id;
+
+ // int UIApplicationMain ( int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName );
+ pub fn UIApplicationMain(argc: libc::c_int, argv: *const libc::c_char, principalClassName: id, delegateClassName: id) -> libc::c_int;
+
+ // SInt32 CFRunLoopRunInMode ( CFStringRef mode, CFTimeInterval seconds, Boolean returnAfterSourceHandled );
+ pub fn CFRunLoopRunInMode(mode: CFStringRef, seconds: CFTimeInterval, returnAfterSourceHandled: Boolean) -> i32;
+}
+
+extern {
+ pub fn setjmp(env: *mut libc::c_void) -> libc::c_int;
+ pub fn longjmp(env: *mut libc::c_void, val: libc::c_int);
+}
+
+pub const RTLD_LAZY: libc::c_int = 0x001;
+pub const RTLD_GLOBAL: libc::c_int = 0x100;
+
+extern {
+ pub fn dlopen(filename: *const libc::c_char, flag: libc::c_int) -> *mut libc::c_void;
+ pub fn dlsym(handle: *mut libc::c_void, symbol: *const libc::c_char) -> *mut libc::c_void;
+}
+
+pub trait NSString {
+ unsafe fn alloc(_: Self) -> id {
+ msg_send![class("NSString"), alloc]
+ }
+
+ #[allow(non_snake_case)]
+ unsafe fn initWithUTF8String_(self, c_string: *const i8) -> id;
+ #[allow(non_snake_case)]
+ unsafe fn stringByAppendingString_(self, other: id) -> id;
+ unsafe fn init_str(self, string: &str) -> Self;
+ #[allow(non_snake_case)]
+ unsafe fn UTF8String(self) -> *const libc::c_char;
+}
+
+impl NSString for id {
+ unsafe fn initWithUTF8String_(self, c_string: *const i8) -> id {
+ msg_send![self, initWithUTF8String:c_string as id]
+ }
+
+ unsafe fn stringByAppendingString_(self, other: id) -> id {
+ msg_send![self, stringByAppendingString:other]
+ }
+
+ unsafe fn init_str(self, string: &str) -> id {
+ let cstring = CString::new(string).unwrap();
+ self.initWithUTF8String_(cstring.as_ptr())
+ }
+
+ unsafe fn UTF8String(self) -> *const libc::c_char {
+ msg_send![self, UTF8String]
+ }
+}
+
+#[inline]
+pub fn class(name: &str) -> *mut Class {
+ unsafe {
+ ::std::mem::transmute(Class::get(name))
+ }
+}