Fix alt and add F1-F12 keys

This commit is contained in:
Jeremy Soller 2023-12-22 08:45:53 -07:00
parent 94dd278f53
commit 4718703fe5
No known key found for this signature in database
GPG key ID: DCFCA852D3906975

View file

@ -313,21 +313,52 @@ where
let mut status = Status::Ignored; let mut status = Status::Ignored;
match event { match event {
//TODO: Alt keys when they are control characters
Event::Keyboard(KeyEvent::KeyPressed { Event::Keyboard(KeyEvent::KeyPressed {
key_code, key_code,
modifiers, modifiers,
}) => match key_code { }) => match (
modifiers.logo(),
modifiers.control(),
modifiers.alt(),
modifiers.shift(),
) {
(true, _, _, _) => {
// Ignore super keys
}
(_, true, _, _) => {
// Ignore ctrl keys
}
(_, _, true, _) => {
// Ignore alt keys
//TODO: alt keys for control characters
}
// Handle shift keys
(_, _, _, true) => match key_code {
KeyCode::End => {
terminal.scroll(TerminalScroll::Bottom);
}
KeyCode::Home => {
terminal.scroll(TerminalScroll::Top);
}
KeyCode::PageDown => {
terminal.scroll(TerminalScroll::PageDown);
}
KeyCode::PageUp => {
terminal.scroll(TerminalScroll::PageUp);
}
KeyCode::Tab => {
terminal.input_scroll(b"\x1B[Z".as_slice());
}
_ => {}
},
// Handle keys with no modifiers
(_, _, _, false) => match key_code {
KeyCode::Backspace => { KeyCode::Backspace => {
terminal.input_scroll(b"\x7F".as_slice()); terminal.input_scroll(b"\x7F".as_slice());
status = Status::Captured; status = Status::Captured;
} }
KeyCode::Tab => { KeyCode::Tab => {
if modifiers.shift() {
terminal.input_scroll(b"\x1B[Z".as_slice());
} else {
terminal.input_scroll(b"\t".as_slice()); terminal.input_scroll(b"\t".as_slice());
}
status = Status::Captured; status = Status::Captured;
} }
KeyCode::Enter => { KeyCode::Enter => {
@ -355,19 +386,11 @@ where
status = Status::Captured; status = Status::Captured;
} }
KeyCode::End => { KeyCode::End => {
if modifiers.shift() {
terminal.scroll(TerminalScroll::Bottom);
} else {
terminal.input_scroll(b"\x1B[F".as_slice()); terminal.input_scroll(b"\x1B[F".as_slice());
}
status = Status::Captured; status = Status::Captured;
} }
KeyCode::Home => { KeyCode::Home => {
if modifiers.shift() {
terminal.scroll(TerminalScroll::Top);
} else {
terminal.input_scroll(b"\x1B[H".as_slice()); terminal.input_scroll(b"\x1B[H".as_slice());
}
status = Status::Captured; status = Status::Captured;
} }
KeyCode::Insert => { KeyCode::Insert => {
@ -379,24 +402,64 @@ where
status = Status::Captured; status = Status::Captured;
} }
KeyCode::PageUp => { KeyCode::PageUp => {
if modifiers.shift() {
terminal.scroll(TerminalScroll::PageUp);
} else {
terminal.input_scroll(b"\x1B[5~".as_slice()); terminal.input_scroll(b"\x1B[5~".as_slice());
}
status = Status::Captured; status = Status::Captured;
} }
KeyCode::PageDown => { KeyCode::PageDown => {
if modifiers.shift() {
terminal.scroll(TerminalScroll::PageDown);
} else {
terminal.input_scroll(b"\x1B[6~".as_slice()); terminal.input_scroll(b"\x1B[6~".as_slice());
}
status = Status::Captured; status = Status::Captured;
} }
//TODO: F1-F12 keys KeyCode::F1 => {
terminal.input_scroll(b"\x1BOP".as_slice());
status = Status::Captured;
}
KeyCode::F2 => {
terminal.input_scroll(b"\x1BOQ".as_slice());
status = Status::Captured;
}
KeyCode::F3 => {
terminal.input_scroll(b"\x1BOR".as_slice());
status = Status::Captured;
}
KeyCode::F4 => {
terminal.input_scroll(b"\x1BOS".as_slice());
status = Status::Captured;
}
KeyCode::F5 => {
terminal.input_scroll(b"\x1B[15~".as_slice());
status = Status::Captured;
}
KeyCode::F6 => {
terminal.input_scroll(b"\x1B[17~".as_slice());
status = Status::Captured;
}
KeyCode::F7 => {
terminal.input_scroll(b"\x1B[18~".as_slice());
status = Status::Captured;
}
KeyCode::F8 => {
terminal.input_scroll(b"\x1B[19~".as_slice());
status = Status::Captured;
}
KeyCode::F9 => {
terminal.input_scroll(b"\x1B[20~".as_slice());
status = Status::Captured;
}
KeyCode::F10 => {
terminal.input_scroll(b"\x1B[21~".as_slice());
status = Status::Captured;
}
KeyCode::F11 => {
terminal.input_scroll(b"\x1B[23~".as_slice());
status = Status::Captured;
}
KeyCode::F12 => {
terminal.input_scroll(b"\x1B[24~".as_slice());
status = Status::Captured;
}
_ => (), _ => (),
}, },
},
Event::Keyboard(KeyEvent::ModifiersChanged(modifiers)) => { Event::Keyboard(KeyEvent::ModifiersChanged(modifiers)) => {
state.modifiers = modifiers; state.modifiers = modifiers;
} }
@ -426,8 +489,11 @@ where
if !character.is_control() { if !character.is_control() {
// Handle alt for non-control characters // Handle alt for non-control characters
let mut buf = [0x1B, 0, 0, 0, 0]; let mut buf = [0x1B, 0, 0, 0, 0];
let len = {
let str = character.encode_utf8(&mut buf[1..]); let str = character.encode_utf8(&mut buf[1..]);
terminal.input_scroll(str.as_bytes().to_vec()); str.len() + 1
};
terminal.input_scroll(buf[..len].to_vec());
status = Status::Captured; status = Status::Captured;
} }
} }