From 548074e8b3717b9ff55edd04eebc9fef59d5b6f0 Mon Sep 17 00:00:00 2001 From: Teddy Wing Date: Wed, 3 Oct 2018 23:49:05 +0200 Subject: 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). --- src/cocoa_bridge.rs | 78 +++++++++++++++++++++++------------------------------ src/lib.rs | 2 +- 2 files changed, 35 insertions(+), 45 deletions(-) (limited to 'src') 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 { } 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 { // 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 { } } +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::*; -- cgit v1.2.3