diff options
| author | Teddy Wing | 2018-08-26 01:32:43 +0200 |
|---|---|---|
| committer | Teddy Wing | 2018-08-26 01:32:43 +0200 |
| commit | 9b0e6e4207f5c44bef5d0b28ba036040845f82d8 (patch) | |
| tree | 5b36998374244fe599fe34670f9def45753110f4 /src | |
| parent | 4fd3fd4ded73aa4ba5320de50cd6b19fdf70a8a7 (diff) | |
| download | dome-key-map-9b0e6e4207f5c44bef5d0b28ba036040845f82d8.tar.bz2 | |
Get `run_key_action` to export correctly to C
Add a new wrapper function for `run_key_action` that uses C appropriate
inputs & outputs and calls into our Rusty `run_key_action`. This new
function now correctly gets a header generated for it by 'cbindgen'.
Immense thanks to Jake Goulding on the Rust FFI Omnibus for showing me
how to pass a slice argument from C:
http://jakegoulding.com/rust-ffi-omnibus/slice_arguments/
In order to pass the slice from C, we need to pass a C array and its
length to the function. Cool.
Diffstat (limited to 'src')
| -rw-r--r-- | src/cocoa_bridge.rs | 17 | ||||
| -rw-r--r-- | src/lib.rs | 1 |
2 files changed, 18 insertions, 0 deletions
diff --git a/src/cocoa_bridge.rs b/src/cocoa_bridge.rs index d4749f0..d98701f 100644 --- a/src/cocoa_bridge.rs +++ b/src/cocoa_bridge.rs @@ -1,7 +1,9 @@ use std::ffi::CString; +use std::slice; use cocoa::base::nil; use cocoa::foundation::{NSArray, NSAutoreleasePool, NSDictionary}; +use libc::size_t; use {HeadphoneButton, MapGroup, MapKind}; @@ -45,6 +47,21 @@ pub struct KeyActionResult { } #[no_mangle] +pub extern "C" fn c_run_key_action( + trigger: *const HeadphoneButton, + length: size_t, +) -> *const KeyActionResult { + 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 +} + +#[no_mangle] pub extern "C" fn run_key_action( trigger: &[HeadphoneButton] ) -> Option<KeyActionResult> { @@ -2,6 +2,7 @@ extern crate cocoa; #[macro_use] extern crate combine; +extern crate libc; mod cocoa_bridge; mod parser; |
