diff options
| -rw-r--r-- | dome_key_map.h | 2 | ||||
| -rw-r--r-- | src/cocoa_bridge.rs | 13 | ||||
| -rw-r--r-- | 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<KeyActionResult<'a>> { @@ -217,7 +224,7 @@ mode <play><up> {      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 <play><up> {      }      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, | 
