From 9ec2632bb036defc9f5706c1f38981dc4eb55afe Mon Sep 17 00:00:00 2001 From: Teddy Wing Date: Fri, 5 Oct 2018 19:40:53 +0200 Subject: Turn `Config` into a C struct instead of an opaque struct We want to be able to access the fields in `Config`, so make them accessible across the FFI boundary. * Return a regular, not boxed, `Config` from `parse_args()`. * Add `repr(C)`s on our structs (had forgotten how this worked in 961b3b0b2d33a2c632fbc093b61e2c2d4dc07f70). * Delete the `config_free()` function as I think the stuct doesn't need to be freed being a POD struct. Hopefully that's the case. --- dome_key_map.h | 13 +++++++++---- src/cocoa_bridge.rs | 8 +------- src/config.rs | 4 ++-- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/dome_key_map.h b/dome_key_map.h index 39ba298..74369b7 100644 --- a/dome_key_map.h +++ b/dome_key_map.h @@ -17,8 +17,6 @@ typedef enum { MapKind_Command, } MapKind; -typedef struct Config Config; - typedef struct State State; typedef struct { @@ -26,9 +24,16 @@ typedef struct { size_t length; } Trigger; -void c_run_key_action(State *state, Trigger trigger, const Trigger *mode); +typedef struct { + bool reload; + bool daemon; +} Args; -void config_free(Config *ptr); +typedef struct { + Args args; +} Config; + +void c_run_key_action(State *state, Trigger trigger, const Trigger *mode); void logger_init(void); diff --git a/src/cocoa_bridge.rs b/src/cocoa_bridge.rs index f572c37..529fb5d 100644 --- a/src/cocoa_bridge.rs +++ b/src/cocoa_bridge.rs @@ -319,13 +319,7 @@ pub extern "C" fn parse_args( let config = config::parse_args(&args); - Box::into_raw(Box::new(config)) as *const Config -} - -#[no_mangle] -pub extern "C" fn config_free(ptr: *mut Config) { - if ptr.is_null() { return } - unsafe { Box::from_raw(ptr); } + &config as *const Config } diff --git a/src/config.rs b/src/config.rs index 66769a9..b7b09ab 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,13 +1,13 @@ use getopts::Options; -#[no_mangle] +#[repr(C)] #[derive(Default)] struct Args { reload: bool, daemon: bool, } -#[no_mangle] +#[repr(C)] #[derive(Default)] pub struct Config { args: Args, -- cgit v1.2.3