1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
use ratatui::crossterm::event::{KeyCode, KeyEvent, KeyModifiers};
fn parse_key_names(s: &str) -> Option<KeyCode> {
if s.chars().count() == 1 {
return Some(KeyCode::Char(s.chars().next().unwrap()));
}
match s {
"esc" => Some(KeyCode::Esc),
"up" => Some(KeyCode::Up),
"down" => Some(KeyCode::Down),
"left" => Some(KeyCode::Left),
"right" => Some(KeyCode::Right),
"backspace" => Some(KeyCode::Backspace),
"enter" => Some(KeyCode::Enter),
"home" => Some(KeyCode::Home),
"end" => Some(KeyCode::End),
"pageup" => Some(KeyCode::PageUp),
"pagedown" => Some(KeyCode::PageDown),
"tab" => Some(KeyCode::Tab),
"delete" => Some(KeyCode::Delete),
"insert" => Some(KeyCode::Insert),
"f1" => Some(KeyCode::F(1)),
"f2" => Some(KeyCode::F(2)),
"f3" => Some(KeyCode::F(3)),
"f4" => Some(KeyCode::F(4)),
"f5" => Some(KeyCode::F(5)),
"f6" => Some(KeyCode::F(6)),
"f7" => Some(KeyCode::F(7)),
"f8" => Some(KeyCode::F(8)),
"f9" => Some(KeyCode::F(9)),
"f10" => Some(KeyCode::F(10)),
"f11" => Some(KeyCode::F(11)),
"f12" => Some(KeyCode::F(12)),
"capslock" => Some(KeyCode::CapsLock),
"scrolllock" => Some(KeyCode::ScrollLock),
"numlock" => Some(KeyCode::NumLock),
"printscreen" => Some(KeyCode::PrintScreen),
"pause" => Some(KeyCode::Pause),
"menu" => Some(KeyCode::Menu),
"keypadbegin" => Some(KeyCode::KeypadBegin),
_ => None
}
}
pub fn event_from_string(s: String) -> Result<KeyEvent, String> {
let mut modifiers = KeyModifiers::NONE;
let s = s.to_lowercase();
let code = if s.chars().count() == 1 {
KeyCode::Char(s.chars().next().unwrap())
} else if s.starts_with('<') && s.ends_with('>') {
let mut inner = &s[1..s.len() - 1];
loop {
if inner.starts_with("c-") {
inner = &inner[2..];
modifiers |= KeyModifiers::CONTROL;
} else if inner.starts_with("a-") {
inner = &inner[2..];
modifiers |= KeyModifiers::ALT;
} else if inner.starts_with("s-") {
inner = &inner[2..];
modifiers |= KeyModifiers::SHIFT;
} else {
break;
}
}
match parse_key_names(inner) {
Some(keycode) => keycode,
None => return Err(format!("{:?} is not a valid keyname", inner))
}
} else {
return Err(format!("{:?} is not a valid keyname", s));
};
println!("{:?}", KeyEvent::new(code, modifiers));
Ok(KeyEvent::new(code, modifiers))
}
|