diff options
| -rw-r--r-- | dome_key_map.h | 7 | ||||
| -rw-r--r-- | src/cocoa_bridge.rs | 39 |
2 files changed, 41 insertions, 5 deletions
diff --git a/dome_key_map.h b/dome_key_map.h index d128979..1206d1d 100644 --- a/dome_key_map.h +++ b/dome_key_map.h @@ -17,8 +17,13 @@ typedef struct MapKind MapKind; typedef struct Option_CString Option_CString; typedef struct { + const char *action; + const MapKind *kind; +} CKeyActionResult; + +typedef struct { Option_CString action; MapKind kind; } KeyActionResult; -const KeyActionResult *c_run_key_action(const HeadphoneButton *trigger, size_t length); +const CKeyActionResult *c_run_key_action(const HeadphoneButton *trigger, size_t length); 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] |
