diff options
| -rw-r--r-- | dome_key_map.h | 10 | ||||
| -rw-r--r-- | src/cocoa_bridge.rs | 30 | ||||
| -rw-r--r-- | src/parser.rs | 78 | 
3 files changed, 74 insertions, 44 deletions
| diff --git a/dome_key_map.h b/dome_key_map.h index dd61a38..b8c4b79 100644 --- a/dome_key_map.h +++ b/dome_key_map.h @@ -23,7 +23,7 @@ typedef enum {    MapKind_Command,  } MapKind; -typedef struct State State; +typedef struct State_K State_K;  typedef struct {    const HeadphoneButton *buttons; @@ -36,12 +36,12 @@ typedef struct {    const Trigger *in_mode;  } CKeyActionResult; -const CKeyActionResult *c_run_key_action(State *state, Trigger trigger, const Trigger *mode); +const CKeyActionResult *c_run_key_action(State_K *state, Trigger trigger, const Trigger *mode);  void logger_init(void); -void state_free(State *ptr); +void state_free(State_K *ptr); -void state_load_map_group(State *ptr); +void state_load_map_group(State_K *ptr); -State *state_new(void); +State_K *state_new(void); diff --git a/src/cocoa_bridge.rs b/src/cocoa_bridge.rs index 8718e58..a4a072f 100644 --- a/src/cocoa_bridge.rs +++ b/src/cocoa_bridge.rs @@ -4,7 +4,7 @@ use std::mem;  use std::ptr;  use std::slice; -use autopilot::key::type_string; +use autopilot::key::{KeyCodeConvertible, type_string};  // use cocoa::base::nil;  // use cocoa::foundation::{NSArray, NSAutoreleasePool, NSDictionary};  use libc::{c_char, size_t}; @@ -97,9 +97,10 @@ pub struct CKeyActionResult {  }  #[derive(Default)] -pub struct State { +pub struct State<K: KeyCodeConvertible> +where K: Default {      in_mode: Option<Vec<HeadphoneButton>>, -    map_group: Option<MapGroup>, +    map_group: Option<MapGroup<K>>,  }  #[no_mangle] @@ -113,18 +114,21 @@ pub extern "C" fn logger_init() {  }  #[no_mangle] -pub extern "C" fn state_new() -> *mut State { +pub extern "C" fn state_new<K>() -> *mut State<K> +where K: KeyCodeConvertible {      Box::into_raw(Box::new(State::default()))  }  #[no_mangle] -pub extern "C" fn state_free(ptr: *mut State) { +pub extern "C" fn state_free<K>(ptr: *mut State<K>) +where K: KeyCodeConvertible {      if ptr.is_null() { return }      unsafe { Box::from_raw(ptr); }  }  #[no_mangle] -pub extern "C" fn state_load_map_group(ptr: *mut State) { +pub extern "C" fn state_load_map_group<K>(ptr: *mut State<K>) +where K: KeyCodeConvertible {      match xdg::BaseDirectories::with_prefix("dome-key") {          Ok(xdg_dirs) => {              match xdg_dirs.find_config_file("mappings.dkmap") { @@ -162,11 +166,12 @@ pub extern "C" fn state_load_map_group(ptr: *mut State) {  }  #[no_mangle] -pub extern "C" fn c_run_key_action( -    state: *mut State, +pub extern "C" fn c_run_key_action<K>( +    state: *mut State<K>,      trigger: Trigger,      mode: *const Trigger, -) -> *const CKeyActionResult { +) -> *const CKeyActionResult +where K: KeyCodeConvertible {      let trigger = unsafe {          assert!(!trigger.buttons.is_null()); @@ -258,11 +263,12 @@ pub extern "C" fn c_run_key_action(  }  #[no_mangle] -pub extern "C" fn run_key_action_for_mode<'a>( -    state: &mut State, +pub extern "C" fn run_key_action_for_mode<'a, K>( +    state: &mut State<K>,      trigger: &'a [HeadphoneButton],      in_mode: Option<&[HeadphoneButton]> -) -> Option<KeyActionResult<'a>> { +) -> Option<KeyActionResult<'a>> +where K: KeyCodeConvertible {      let sample_maps = "map <up> k  map <down> j  map <play><down> works! diff --git a/src/parser.rs b/src/parser.rs index 57abbbb..7fcea71 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -22,11 +22,28 @@ pub enum HeadphoneButton {      Down,  }  type Trigger = Vec<HeadphoneButton>; -type Action = String; - -enum Action2<'a, T: 'a + KeyCodeConvertible> { -    Map(&'a [(T, &'a [Flag])]), -    Command(&'a [&'a str]), +// type Action = String; + +// enum Action<'a, T: 'a + KeyCodeConvertible> { +//     String(String), +//     Map(&'a [(T, &'a [Flag])]), +//     Command(&'a [&'a str]), +// } + +// struct KeyboardKey { +//     key: , +//     flags: &[Flags], +// } + +// enum Action<T: KeyCodeConvertible> { +//     String(String), +//     Map(Vec<(T, Vec<Flag>)>), +//     Command(Vec<String>), +// } +enum Action<K: KeyCodeConvertible> { +    String(String), +    Map(Vec<(K, Vec<Flag>)>), +    Command(Vec<String>),  }  #[repr(C)] @@ -37,42 +54,42 @@ pub enum MapKind {  }  #[derive(Debug, PartialEq)] -pub struct MapAction { -    pub action: Action, +pub struct MapAction<K: KeyCodeConvertible> { +    pub action: Action<K>,      pub kind: MapKind,  }  #[derive(Debug, PartialEq)] -struct Map { +struct Map<K: KeyCodeConvertible> {      trigger: Trigger, -    action: Action, +    action: Action<K>,      kind: MapKind,  } -type MapCollection = HashMap<Trigger, MapAction>; +type MapCollection<K: KeyCodeConvertible> = HashMap<Trigger, MapAction<K>>;  #[derive(Debug, PartialEq)] -struct Mode { +struct Mode<K: KeyCodeConvertible> {      trigger: Trigger, -    maps: MapCollection, +    maps: MapCollection<K>,  }  #[derive(Debug, PartialEq)] -pub struct MapGroup { -    pub maps: MapCollection, -    pub modes: HashMap<Trigger, MapCollection>, +pub struct MapGroup<K: KeyCodeConvertible> { +    pub maps: MapCollection<K>, +    pub modes: HashMap<Trigger, MapCollection<K>>,  }  #[derive(Debug, PartialEq)] -enum Definition { -    Map(Map), -    Mode(Mode), +enum Definition<K: KeyCodeConvertible> { +    Map(Map<K>), +    Mode(Mode<K>),  } -impl MapGroup { +impl<K: KeyCodeConvertible> MapGroup<K> {      pub fn parse(          mappings: &str -    ) -> Result<MapGroup, CombineErrors<char, &str, SourcePosition>> { +    ) -> Result<MapGroup<K>, CombineErrors<char, &str, SourcePosition>> {          let input = State::new(mappings);          map_group().easy_parse(input).map(|t| t.0)      } @@ -117,12 +134,14 @@ where      many1(headphone_button())  } -fn action<I>() -> impl Parser<Input = I, Output = Action> +fn action<I, K>() -> impl Parser<Input = I, Output = Action<K>>  where      I: Stream<Item = char>,      I::Error: ParseError<I::Item, I::Range, I::Position>, +    K: KeyCodeConvertible,  {      take_until(newline()) +        .map(|action| Action::String(action))  }  fn whitespace_separator<I>() -> impl Parser<Input = I> @@ -133,10 +152,11 @@ where      skip_many1(space().or(tab()))  } -fn map<I>() -> impl Parser<Input = I, Output = Map> +fn map<I, K>() -> impl Parser<Input = I, Output = Map<K>>  where      I: Stream<Item = char>,      I::Error: ParseError<I::Item, I::Range, I::Position>, +    K: KeyCodeConvertible,  {      (          map_kind(), @@ -153,14 +173,15 @@ where      )  } -fn map_collection<I>() -> impl Parser<Input = I, Output = MapCollection> +fn map_collection<I, K>() -> impl Parser<Input = I, Output = MapCollection<K>>  where      I: Stream<Item = char>,      I::Error: ParseError<I::Item, I::Range, I::Position>, +    K: KeyCodeConvertible,  {      (          blank(), -        many::<Vec<Map>, _>(map().skip(blank())), +        many::<Vec<Map<K>>, _>(map().skip(blank())),      ).map(|(_, collection)| {          let mut maps = HashMap::new(); @@ -178,10 +199,11 @@ where      })  } -fn mode<I>() -> impl Parser<Input = I, Output = Mode> +fn mode<I, K>() -> impl Parser<Input = I, Output = Mode<K>>  where      I: Stream<Item = char>,      I::Error: ParseError<I::Item, I::Range, I::Position>, +    K: KeyCodeConvertible,  {      (          string("mode"), @@ -199,10 +221,11 @@ where      )  } -fn definitions<I>() -> impl Parser<Input = I, Output = Vec<Definition>> +fn definitions<I, K>() -> impl Parser<Input = I, Output = Vec<Definition<K>>>  where      I: Stream<Item = char>,      I::Error: ParseError<I::Item, I::Range, I::Position>, +    K: KeyCodeConvertible,  {      (          blank(), @@ -215,10 +238,11 @@ where      ).map(|(_, definitions)| definitions)  } -fn map_group<I>() -> impl Parser<Input = I, Output = MapGroup> +fn map_group<I, K>() -> impl Parser<Input = I, Output = MapGroup<K>>  where      I: Stream<Item = char>,      I::Error: ParseError<I::Item, I::Range, I::Position>, +    K: KeyCodeConvertible,  {      definitions()          .map(|definitions| { | 
