From 882dfbe6f0aad091613839841d2f54334e37b32e Mon Sep 17 00:00:00 2001 From: Teddy Wing Date: Mon, 24 Sep 2018 11:20:03 +0200 Subject: run_key_action_for_mode(): Keep track of `in_mode` in `state` Instead of letting the Objective-C code keep track of `in_mode` by passing it around in `CKeyActionResult`, keep track of it in a `State` struct. Derive `Clone` on `HeadphoneButton` to resolve this error: error[E0277]: the trait bound `parser::HeadphoneButton: std::clone::Clone` is not satisfied --> src/cocoa_bridge.rs:273:38 | 273 | state.in_mode = Some(trigger.to_vec()); | ^^^^^^ the trait `std::clone::Clone` is not implemented for `parser::HeadphoneButton` --- dome_key_map.h | 2 +- src/cocoa_bridge.rs | 13 +++++++++++-- src/parser.rs | 2 +- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/dome_key_map.h b/dome_key_map.h index 633e9b3..fc2e7fd 100644 --- a/dome_key_map.h +++ b/dome_key_map.h @@ -36,7 +36,7 @@ typedef struct { const Trigger *in_mode; } CKeyActionResult; -const CKeyActionResult *c_run_key_action(Trigger trigger, const Trigger *mode); +const CKeyActionResult *c_run_key_action(State *state, Trigger trigger, const Trigger *mode); void state_free(State *ptr); diff --git a/src/cocoa_bridge.rs b/src/cocoa_bridge.rs index a864e13..11dc1c9 100644 --- a/src/cocoa_bridge.rs +++ b/src/cocoa_bridge.rs @@ -110,6 +110,7 @@ pub extern "C" fn state_free(ptr: *mut State) { #[no_mangle] pub extern "C" fn c_run_key_action( + state: *mut State, trigger: Trigger, mode: *const Trigger, ) -> *const CKeyActionResult { @@ -133,7 +134,12 @@ pub extern "C" fn c_run_key_action( }; println!("Mode after unsafe (118): {:?}", mode); - let result = run_key_action_for_mode(trigger, mode); + let mut state = unsafe { + assert!(!state.is_null()); + &mut *state + }; + + let result = run_key_action_for_mode(&mut state, trigger, mode); let result = match result { Some(k) => { let action = k.action.map_or_else( @@ -200,6 +206,7 @@ pub extern "C" fn c_run_key_action( #[no_mangle] pub extern "C" fn run_key_action_for_mode<'a>( + state: &mut State, trigger: &'a [HeadphoneButton], in_mode: Option<&[HeadphoneButton]> ) -> Option> { @@ -217,7 +224,7 @@ mode { let map = map_group.maps.get(trigger); let mode = map_group.modes.get(trigger); - if let Some(in_mode) = in_mode { + if let Some(ref mut in_mode) = state.in_mode { if let Some(mode) = map_group.modes.get(in_mode) { if let Some(map) = mode.get(trigger) { return match map.kind { @@ -263,6 +270,8 @@ mode { } if let Some(mode) = mode { + state.in_mode = Some(trigger.to_vec()); + return Some( KeyActionResult::new(ActionKind::Mode) .in_mode(trigger) diff --git a/src/parser.rs b/src/parser.rs index 1d9aa56..ea96740 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -14,7 +14,7 @@ use combine::parser::repeat::take_until; use combine::stream::state::{SourcePosition, State}; #[repr(C)] -#[derive(Debug, Hash, Eq, PartialEq)] +#[derive(Clone, Debug, Hash, Eq, PartialEq)] pub enum HeadphoneButton { Play, Up, -- cgit v1.2.3