use crate::core::bindings::{CodeMap, KeyCode};
pub fn parse_key_binding(pattern: String, known_codes: &CodeMap) -> Option<KeyCode> {
let mut parts: Vec<&str> = pattern.split('-').collect();
match known_codes.get(parts.remove(parts.len() - 1)) {
Some(code) => {
let mask = parts
.iter()
.map(|&s| match s {
"A" => xcb::MOD_MASK_1,
"M" => xcb::MOD_MASK_4,
"S" => xcb::MOD_MASK_SHIFT,
"C" => xcb::MOD_MASK_CONTROL,
_ => panic!("invalid key binding prefix: {}", s),
})
.fold(0, |acc, v| acc | v);
trace!(?pattern, mask, code, "parsed keybinding");
Some(KeyCode {
mask: mask as u16,
code: *code,
})
}
None => None,
}
}