diff options
Diffstat (limited to 'src/cocoa_bridge.rs')
| -rw-r--r-- | src/cocoa_bridge.rs | 39 | 
1 files changed, 35 insertions, 4 deletions
| diff --git a/src/cocoa_bridge.rs b/src/cocoa_bridge.rs index d98701f..f2d5f45 100644 --- a/src/cocoa_bridge.rs +++ b/src/cocoa_bridge.rs @@ -1,9 +1,10 @@  use std::ffi::CString; +use std::ptr;  use std::slice;  use cocoa::base::nil;  use cocoa::foundation::{NSArray, NSAutoreleasePool, NSDictionary}; -use libc::size_t; +use libc::{c_char, size_t};  use {HeadphoneButton, MapGroup, MapKind}; @@ -46,19 +47,49 @@ pub struct KeyActionResult {      pub kind: MapKind,  } +#[repr(C)] +pub struct CKeyActionResult { +    pub action: *const c_char, +    pub kind: *const MapKind, +} +  #[no_mangle]  pub extern "C" fn c_run_key_action(      trigger: *const HeadphoneButton,      length: size_t, -) -> *const KeyActionResult { +) -> *const CKeyActionResult {      let trigger = unsafe {          assert!(!trigger.is_null());          slice::from_raw_parts(trigger, length as usize)      }; -    let result = run_key_action(trigger).unwrap(); -    &result as *const KeyActionResult +    let result = match run_key_action(trigger) { +        Some(k) => { +            match k.action { +                Some(a) => { +                    CKeyActionResult { +                        action: a.as_ptr(), +                        kind: &k.kind, +                    } +                }, +                None => { +                    CKeyActionResult { +                        action: ptr::null(), +                        kind: &k.kind, +                    } +                }, +            } +        }, +        None => { +            CKeyActionResult { +                action: ptr::null(), +                kind: ptr::null(), +            } +        } +    }; + +    &result as *const CKeyActionResult  }  #[no_mangle] | 
