Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
123 changes: 123 additions & 0 deletions core/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
use std::collections::HashSet;
use std::fmt::Display;
use std::fmt::Formatter;

Expand All @@ -10,6 +11,69 @@ pub struct Whkdrc {
pub pause_hook: Option<String>,
}

impl Whkdrc {
pub fn add_rwin_bindings(&mut self) {
let initial_rwin_bindings: Vec<HashSet<&String>> = self
.bindings
.iter()
.filter(|b| b.keys.iter().any(|k| k == "rwin"))
.map(|b| HashSet::from_iter(b.keys.iter()))
.collect();

let mut rwin_bindings = vec![];
for binding in &self.bindings {
let Some(key_idx) = binding.keys.iter().position(|key| key == "win") else {
continue;
};

let mut rwin_binding = binding.clone();
rwin_binding.keys[key_idx] = "rwin".to_string();

// skip any hotkeys that are already specified
if initial_rwin_bindings
.iter()
.any(|b| b == &HashSet::from_iter(rwin_binding.keys.iter()))
{
continue;
}

rwin_bindings.push(rwin_binding);
}
self.bindings.extend(rwin_bindings);

let initial_rwin_app_bindings: Vec<HashSet<&String>> = self
.app_bindings
.iter()
.filter(|b| b.0.iter().any(|k| k == "rwin"))
.map(|b| HashSet::from_iter(b.0.iter()))
.collect();

let mut rwin_app_bindings = vec![];
for binding in &self.app_bindings {
let Some(key_idx) = binding.0.iter().position(|key| key == "win") else {
continue;
};

let mut rwin_binding = binding.clone();
rwin_binding.0[key_idx] = "rwin".to_string();
for app_binding in &mut rwin_binding.1 {
app_binding.keys[key_idx] = "rwin".to_string();
}

// skip any hotkeys that are already specified
if initial_rwin_app_bindings
.iter()
.any(|b| b == &HashSet::from_iter(rwin_binding.0.iter()))
{
continue;
}

rwin_app_bindings.push(rwin_binding);
}
self.app_bindings.extend(rwin_app_bindings);
}
}

#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub enum Shell {
Cmd,
Expand Down Expand Up @@ -45,3 +109,62 @@ pub struct HotkeyBinding {
pub command: String,
pub process_name: Option<String>,
}

#[cfg(test)]
mod tests {
use super::*;

fn hb(keys: &str, cmd: &str) -> HotkeyBinding {
HotkeyBinding {
keys: keys.split(" + ").map(String::from).collect(),
command: String::from(cmd),
process_name: None,
}
}

#[test]
fn test_add_rwin_binding() {
let mut config = Whkdrc {
bindings: vec![hb("win + j", "win + j"), hb("alt + j", "alt + j")],
shell: Shell::Pwsh,
app_bindings: vec![],
pause_binding: None,
pause_hook: None,
};

config.add_rwin_bindings();

let expected = vec![
hb("win + j", "win + j"),
hb("alt + j", "alt + j"),
hb("rwin + j", "win + j"),
];

assert_eq!(config.bindings, expected);
}

#[test]
fn test_use_provided_rwin() {
let mut config = Whkdrc {
bindings: vec![
hb("win + j", "win + j"),
hb("j + rwin", "j + rwin"),
hb("alt + j", "alt + j"),
],
shell: Shell::Pwsh,
app_bindings: vec![],
pause_binding: None,
pause_hook: None,
};

config.add_rwin_bindings();

let expected = vec![
hb("win + j", "win + j"),
hb("j + rwin", "j + rwin"),
hb("alt + j", "alt + j"),
];

assert_eq!(config.bindings, expected);
}
}
10 changes: 7 additions & 3 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,9 @@ lazy_static! {
},
);
home.push("whkdrc");
whkd_parser::load(&home).unwrap_or_else(|_| panic!("could not load whkdrc from {home:?}"))
let mut parsed = whkd_parser::load(&home).unwrap_or_else(|_| panic!("could not load whkdrc from {home:?}"));
parsed.add_rwin_bindings();
parsed
};
static ref SESSION_STDIN: Mutex<Option<ChildStdin>> = Mutex::new(None);
}
Expand Down Expand Up @@ -173,8 +175,10 @@ fn main() -> Result<()> {
let whkdrc = cli.config.map_or_else(
|| WHKDRC.clone(),
|config| {
whkd_parser::load(&config)
.unwrap_or_else(|_| panic!("could not load whkdrc from {config:?}"))
let mut parsed = whkd_parser::load(&config)
.unwrap_or_else(|_| panic!("could not load whkdrc from {config:?}"));
parsed.add_rwin_bindings();
parsed
},
);

Expand Down