Skip to content

Commit ee97062

Browse files
committed
fix(whkd): ensure rwin bindings are not overridden
1 parent 9c9665d commit ee97062

File tree

1 file changed

+106
-13
lines changed

1 file changed

+106
-13
lines changed

core/src/lib.rs

Lines changed: 106 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,26 +12,60 @@ pub struct Whkdrc {
1212

1313
impl Whkdrc {
1414
pub fn add_rwin_bindings(&mut self) {
15+
let initial_rwin_bindings: Vec<_> = self
16+
.bindings
17+
.iter()
18+
.filter(|b| b.keys.iter().any(|k| k == "rwin"))
19+
.collect();
20+
1521
let mut rwin_bindings = vec![];
16-
for binding in &mut self.bindings {
17-
if let Some(i) = binding.keys.iter().position(|key| key == "win") {
18-
let mut rwin_binding = binding.clone();
19-
rwin_binding.keys[i] = "rwin".to_string();
20-
rwin_bindings.push(rwin_binding);
22+
for binding in &self.bindings {
23+
let Some(key_idx) = binding.keys.iter().position(|key| key == "win") else {
24+
continue;
25+
};
26+
27+
let mut rwin_binding = binding.clone();
28+
rwin_binding.keys[key_idx] = "rwin".to_string();
29+
30+
// skip any hotkeys that are already specified
31+
if initial_rwin_bindings
32+
.iter()
33+
.any(|b| b.keys == rwin_binding.keys)
34+
{
35+
continue;
2136
}
37+
38+
rwin_bindings.push(rwin_binding);
2239
}
2340
self.bindings.extend(rwin_bindings);
2441

42+
let initial_rwin_app_bindings: Vec<_> = self
43+
.app_bindings
44+
.iter()
45+
.filter(|b| b.0.iter().any(|k| k == "rwin"))
46+
.collect();
47+
2548
let mut rwin_app_bindings = vec![];
26-
for binding in &mut self.app_bindings {
27-
if let Some(i) = binding.0.iter().position(|key| key == "win") {
28-
let mut rwin_binding = binding.clone();
29-
rwin_binding.0[i] = "rwin".to_string();
30-
for app_binding in &mut rwin_binding.1 {
31-
app_binding.keys[i] = "rwin".to_string();
32-
}
33-
rwin_app_bindings.push(rwin_binding);
49+
for binding in &self.app_bindings {
50+
let Some(key_idx) = binding.0.iter().position(|key| key == "win") else {
51+
continue;
52+
};
53+
54+
let mut rwin_binding = binding.clone();
55+
rwin_binding.0[key_idx] = "rwin".to_string();
56+
for app_binding in &mut rwin_binding.1 {
57+
app_binding.keys[key_idx] = "rwin".to_string();
3458
}
59+
60+
// skip any hotkeys that are already specified
61+
if initial_rwin_app_bindings
62+
.iter()
63+
.any(|b| b.0 == rwin_binding.0)
64+
{
65+
continue;
66+
}
67+
68+
rwin_app_bindings.push(rwin_binding);
3569
}
3670
self.app_bindings.extend(rwin_app_bindings);
3771
}
@@ -72,3 +106,62 @@ pub struct HotkeyBinding {
72106
pub command: String,
73107
pub process_name: Option<String>,
74108
}
109+
110+
#[cfg(test)]
111+
mod tests {
112+
use super::*;
113+
114+
fn hb(keys: &str, cmd: &str) -> HotkeyBinding {
115+
HotkeyBinding {
116+
keys: keys.split(" + ").map(String::from).collect(),
117+
command: String::from(cmd),
118+
process_name: None,
119+
}
120+
}
121+
122+
#[test]
123+
fn test_add_rwin_binding() {
124+
let mut config = Whkdrc {
125+
bindings: vec![hb("win + j", "win + j"), hb("alt + j", "alt + j")],
126+
shell: Shell::Pwsh,
127+
app_bindings: vec![],
128+
pause_binding: None,
129+
pause_hook: None,
130+
};
131+
132+
config.add_rwin_bindings();
133+
134+
let expected = vec![
135+
hb("win + j", "win + j"),
136+
hb("alt + j", "alt + j"),
137+
hb("rwin + j", "win + j"),
138+
];
139+
140+
assert_eq!(config.bindings, expected);
141+
}
142+
143+
#[test]
144+
fn test_use_provided_rwin() {
145+
let mut config = Whkdrc {
146+
bindings: vec![
147+
hb("win + j", "win + j"),
148+
hb("rwin + j", "rwin + j"),
149+
hb("alt + j", "alt + j"),
150+
],
151+
shell: Shell::Pwsh,
152+
app_bindings: vec![],
153+
pause_binding: None,
154+
pause_hook: None,
155+
};
156+
157+
config.add_rwin_bindings();
158+
159+
let expected = vec![
160+
hb("win + j", "win + j"),
161+
hb("rwin + j", "rwin + j"),
162+
hb("alt + j", "alt + j"),
163+
];
164+
165+
assert_eq!(config.bindings, expected);
166+
}
167+
}

0 commit comments

Comments
 (0)