added more special keys
Key now supports Home, End, PageUp, PageDown, Delete, Insert and Function keys. All this is done through the detection of both VT100 escape codes and more modern standard counterparts. For instance, F2 can be both ESC OQ on VT100, screen, and some versions of xterm and ESC [12~ on rxvt and other xterm versions depending on your terminal
This commit is contained in:
parent
3996d24f12
commit
0e74a7672f
54
src/input.rs
54
src/input.rs
|
@ -15,6 +15,20 @@ pub enum Key {
|
||||||
Up,
|
Up,
|
||||||
/// Down arrow.
|
/// Down arrow.
|
||||||
Down,
|
Down,
|
||||||
|
/// Home key.
|
||||||
|
Home,
|
||||||
|
/// End key.
|
||||||
|
End,
|
||||||
|
/// Page Up key.
|
||||||
|
PageUp,
|
||||||
|
/// Page Down key.
|
||||||
|
PageDown,
|
||||||
|
/// Delete key.
|
||||||
|
Delete,
|
||||||
|
/// Insert key.
|
||||||
|
Insert,
|
||||||
|
/// Function keys.
|
||||||
|
F(u8),
|
||||||
/// Normal character.
|
/// Normal character.
|
||||||
Char(char),
|
Char(char),
|
||||||
/// Alt modified character.
|
/// Alt modified character.
|
||||||
|
@ -28,6 +42,7 @@ pub enum Key {
|
||||||
/// Null byte.
|
/// Null byte.
|
||||||
Null,
|
Null,
|
||||||
|
|
||||||
|
|
||||||
#[allow(missing_docs)]
|
#[allow(missing_docs)]
|
||||||
#[doc(hidden)]
|
#[doc(hidden)]
|
||||||
__IsNotComplete
|
__IsNotComplete
|
||||||
|
@ -46,11 +61,50 @@ impl<I: Iterator<Item = Result<char, io::CharsError>>> Iterator for Keys<I> {
|
||||||
fn next(&mut self) -> Option<Result<Key, io::CharsError>> {
|
fn next(&mut self) -> Option<Result<Key, io::CharsError>> {
|
||||||
Some(match self.chars.next() {
|
Some(match self.chars.next() {
|
||||||
Some(Ok('\x1B')) => Ok(match self.chars.next() {
|
Some(Ok('\x1B')) => Ok(match self.chars.next() {
|
||||||
|
Some(Ok('O')) => match self.chars.next() {
|
||||||
|
Some(Ok('P')) => Key::F(1),
|
||||||
|
Some(Ok('Q')) => Key::F(2),
|
||||||
|
Some(Ok('R')) => Key::F(3),
|
||||||
|
Some(Ok('S')) => Key::F(4),
|
||||||
|
_ => Key::Invalid,
|
||||||
|
},
|
||||||
Some(Ok('[')) => match self.chars.next() {
|
Some(Ok('[')) => match self.chars.next() {
|
||||||
Some(Ok('D')) => Key::Left,
|
Some(Ok('D')) => Key::Left,
|
||||||
Some(Ok('C')) => Key::Right,
|
Some(Ok('C')) => Key::Right,
|
||||||
Some(Ok('A')) => Key::Up,
|
Some(Ok('A')) => Key::Up,
|
||||||
Some(Ok('B')) => Key::Down,
|
Some(Ok('B')) => Key::Down,
|
||||||
|
Some(Ok('H')) => Key::Home,
|
||||||
|
Some(Ok('F')) => Key::End,
|
||||||
|
Some(Ok(c @ '1' ... '6')) => match self.chars.next() {
|
||||||
|
Some(Ok('~')) => match c {
|
||||||
|
'1' => Key::Home,
|
||||||
|
'2' => Key::Insert,
|
||||||
|
'3' => Key::Delete,
|
||||||
|
'4' => Key::End,
|
||||||
|
'5' => Key::PageUp,
|
||||||
|
'6' => Key::PageDown,
|
||||||
|
_ => Key::Invalid,
|
||||||
|
},
|
||||||
|
Some(Ok(k @ '0' ... '9')) => match self.chars.next() {
|
||||||
|
Some(Ok('~')) => match (c, k) {
|
||||||
|
('1', '1') => Key::F(1),
|
||||||
|
('1', '2') => Key::F(2),
|
||||||
|
('1', '3') => Key::F(3),
|
||||||
|
('1', '4') => Key::F(4),
|
||||||
|
('1', '5') => Key::F(5),
|
||||||
|
('1', '7') => Key::F(6),
|
||||||
|
('1', '8') => Key::F(7),
|
||||||
|
('1', '9') => Key::F(8),
|
||||||
|
('2', '0') => Key::F(9),
|
||||||
|
('2', '1') => Key::F(10),
|
||||||
|
('2', '3') => Key::F(11),
|
||||||
|
('2', '4') => Key::F(12),
|
||||||
|
_ => Key::Invalid,
|
||||||
|
},
|
||||||
|
_ => Key::Invalid,
|
||||||
|
},
|
||||||
|
_ => Key::Invalid,
|
||||||
|
},
|
||||||
_ => Key::Invalid,
|
_ => Key::Invalid,
|
||||||
},
|
},
|
||||||
Some(Ok(c)) => Key::Alt(c),
|
Some(Ok(c)) => Key::Alt(c),
|
||||||
|
|
Loading…
Reference in New Issue