@@ -12,26 +12,60 @@ pub struct Whkdrc {
1212
1313impl 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