Support left/right-specific modifiers

pull/56/head
Takashi Kokubun 3 years ago
parent c2204a4559
commit 804ad68718
No known key found for this signature in database
GPG Key ID: 6FFC433B12EE23DD

@ -167,7 +167,9 @@ For the `MOD1-` part, the following prefixes can be used (also case-insensitive)
* Alt: `M-`, `ALT-`
* Windows: `SUPER-`, `WIN-`, `WINDOWS-`
You may use multiple prefixes like `C-M-Shift-a`.
You can use multiple prefixes like `C-M-Shift-a`.
You may also prefix them with `L` or `R` (case-insensitive) so that
remapping is triggered only on a left or right modifier, e.g. `LCtrl-a`.
### application

@ -70,21 +70,37 @@ fn parse_key_press(input: &str) -> Result<KeyPress, Box<dyn error::Error>> {
fn parse_modifier(modifier: &str) -> Option<(Modifier, ModifierState)> {
// Everything is case-insensitive
match &modifier.to_uppercase()[..] {
let mut modifier = &modifier.to_uppercase()[..];
let mut modifier_state = ModifierState::Either;
if modifier.starts_with("L") {
modifier = remove_first_char(modifier);
modifier_state = ModifierState::Left;
} else if modifier.starts_with("R") {
modifier = remove_first_char(modifier);
modifier_state = ModifierState::Right;
}
match modifier {
// Shift
"SHIFT" => Some((Modifier::Shift, ModifierState::Either)),
"SHIFT" => Some((Modifier::Shift, modifier_state)),
// Control
"C" => Some((Modifier::Control, ModifierState::Either)),
"CTRL" => Some((Modifier::Control, ModifierState::Either)),
"CONTROL" => Some((Modifier::Control, ModifierState::Either)),
"C" => Some((Modifier::Control, modifier_state)),
"CTRL" => Some((Modifier::Control, modifier_state)),
"CONTROL" => Some((Modifier::Control, modifier_state)),
// Alt
"M" => Some((Modifier::Alt, ModifierState::Either)),
"ALT" => Some((Modifier::Alt, ModifierState::Either)),
"M" => Some((Modifier::Alt, modifier_state)),
"ALT" => Some((Modifier::Alt, modifier_state)),
// Windows
"SUPER" => Some((Modifier::Windows, ModifierState::Either)),
"WIN" => Some((Modifier::Windows, ModifierState::Either)),
"WINDOWS" => Some((Modifier::Windows, ModifierState::Either)),
"SUPER" => Some((Modifier::Windows, modifier_state)),
"WIN" => Some((Modifier::Windows, modifier_state)),
"WINDOWS" => Some((Modifier::Windows, modifier_state)),
// else
_ => None,
}
}
fn remove_first_char(string: &str) -> &str {
let mut chars = string.chars();
chars.next();
chars.as_str()
}

@ -56,7 +56,19 @@ fn test_keymap_basic() {
remap:
Alt-Enter: Ctrl-Enter
- remap:
Alt-S: Ctrl-S
M-S: C-S
"})
}
#[test]
fn test_keymap_lr_modifiers() {
assert_parse(indoc! {"
keymap:
- name: Global
remap:
LAlt-Enter: RCtrl-Enter
- remap:
RM-S: LC-S
"})
}

Loading…
Cancel
Save