aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorTeddy Wing2018-10-03 23:49:05 +0200
committerTeddy Wing2018-10-03 23:52:49 +0200
commit548074e8b3717b9ff55edd04eebc9fef59d5b6f0 (patch)
tree1edc0f533b1b9b630110d94e4df5a0f2b8548717 /src
parent9af4701e7364dac691ce8d2f2875a974091d5453 (diff)
downloaddome-key-map-548074e8b3717b9ff55edd04eebc9fef59d5b6f0.tar.bz2
run_key_action_for_mode(): Extract action code to a new method
Move the key simulation and command execution code to a new method so that it can be reused in both top-level map and mode branches. This additionally enables command running from top-level maps (previously it only worked for in-mode maps).
Diffstat (limited to 'src')
-rw-r--r--src/cocoa_bridge.rs78
-rw-r--r--src/lib.rs2
2 files changed, 35 insertions, 45 deletions
diff --git a/src/cocoa_bridge.rs b/src/cocoa_bridge.rs
index 65bc9a2..8d2f453 100644
--- a/src/cocoa_bridge.rs
+++ b/src/cocoa_bridge.rs
@@ -13,7 +13,7 @@ use libc::{c_char, size_t};
use stderrlog;
use xdg;
-use {Action, HeadphoneButton, MapGroup, MapKind};
+use {Action, HeadphoneButton, MapAction, MapGroup, MapKind};
#[repr(C)]
struct renameMeMapGroup {
@@ -228,34 +228,7 @@ mode <play><up> {
}
if let Some(map) = mode.get(trigger) {
- match map.kind {
- MapKind::Map => {
- if let Action::Map(action) = &map.action {
- for key in action {
- key.tap()
- }
- }
- },
- MapKind::Command => {
- if let Action::String(action) = &map.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
- ),
- }
- }
- },
- }
+ run_action(&map);
}
}
}
@@ -263,21 +236,7 @@ mode <play><up> {
// TODO: make sure this doesn't run when in_mode
if state.in_mode.is_none() {
if let Some(map) = map {
- match map.kind {
- MapKind::Map => {
- if let Action::Map(action) = &map.action {
- for key in action {
- key.tap()
- }
- }
- },
- MapKind::Command => {
- },
- // MapKind::Mode => {
- // TODO: Maybe make a new type just for KeyActionResult that
- // combines regular MapKinds and Mode
- // },
- }
+ run_action(&map);
}
}
@@ -302,6 +261,37 @@ mode <play><up> {
}
}
+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
+ ),
+ }
+ }
+ },
+ }
+}
+
// fn run_command(command: Action) -> Result {
// }
diff --git a/src/lib.rs b/src/lib.rs
index c6f66d1..8dc8e93 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -15,6 +15,6 @@ extern crate xdg;
mod cocoa_bridge;
mod parser;
-use parser::{Action, HeadphoneButton, MapGroup, MapKind};
+use parser::{Action, HeadphoneButton, MapAction, MapGroup, MapKind};
pub use cocoa_bridge::*;