aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--dome_key_map.h7
-rw-r--r--src/cocoa_bridge.rs39
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]