aboutsummaryrefslogtreecommitdiffstats
path: root/src/map.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/map.rs')
-rw-r--r--src/map.rs77
1 files changed, 77 insertions, 0 deletions
diff --git a/src/map.rs b/src/map.rs
new file mode 100644
index 0000000..0591db9
--- /dev/null
+++ b/src/map.rs
@@ -0,0 +1,77 @@
+use std::env;
+use std::ffi::OsString;
+use std::process::Command;
+
+use {Action, HeadphoneButton, MapAction, MapKind};
+use ffi::State;
+
+pub fn run_key_action_for_mode<'a>(
+ state: &mut State,
+ trigger: &'a [HeadphoneButton],
+) {
+ match state.map_group {
+ Some(ref map_group) => {
+ let map = map_group.maps.get(trigger);
+ let mode = map_group.modes.get(trigger);
+
+ if let Some(in_mode) = state.in_mode.clone() {
+ if let Some(mode) = map_group.modes.get(&in_mode) {
+ // Deactivate mode by pressing current mode trigger
+ if &in_mode[..] == trigger {
+ state.in_mode = None;
+
+ return;
+ }
+
+ if let Some(map) = mode.get(trigger) {
+ run_action(&map);
+ }
+ }
+ }
+
+ // TODO: make sure this doesn't run when in_mode
+ if state.in_mode.is_none() {
+ if let Some(map) = map {
+ run_action(&map);
+ }
+ }
+
+ if mode.is_some() {
+ state.in_mode = Some(trigger.to_vec());
+ }
+ },
+ None => (),
+ }
+}
+
+fn run_action(map_action: &MapAction) {
+ match map_action.kind {
+ MapKind::Map => {
+ if let Action::Map(action) = &map_action.action {
+ for key in action {
+ key.tap()
+ }
+ }
+ },
+ MapKind::Command => {
+ if let Action::String(action) = &map_action.action {
+ let shell = match env::var_os("SHELL") {
+ Some(s) => s,
+ None => OsString::from("/bin/sh"),
+ };
+
+ match Command::new(shell)
+ .arg("-c")
+ .arg(action)
+ .spawn() {
+ Ok(_) => (),
+ Err(e) => error!(
+ "Command failed to start: `{}'",
+ e
+ ),
+ }
+ }
+ },
+ }
+}
+