From 822ffa7a7bc99c76b582ad9056275ff3fc77cc28 Mon Sep 17 00:00:00 2001 From: Alexandre Bury Date: Sat, 25 Jun 2016 19:28:42 -0700 Subject: [PATCH] Fix keyboard input Shift/Ctrl/Alt + special keys (arrow, pageup/down, home/end, ins/del) are better supported. --- src/event.rs | 280 ++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 209 insertions(+), 71 deletions(-) diff --git a/src/event.rs b/src/event.rs index af60a81..1a21b9a 100644 --- a/src/event.rs +++ b/src/event.rs @@ -28,50 +28,94 @@ pub enum Key { /// Tabulation key Tab, ShiftTab, - Left, - Right, - Up, - Down, - PageUp, - PageDown, Backspace, - Home, - ShiftHome, - CtrlHome, - CtrlShiftHome, - End, - ShiftEnd, - CtrlEnd, - CtrlShiftEnd, - /// Delete key - Del, - ShiftDel, - CtrlDel, - CtrlShiftDel, - /// Insert key. - Ins, - /// Insert key while ctrl is pressed. - CtrlIns, + /// Escape key. Esc, /// The 5 in the center of the keypad, when numlock is disabled. NumpadCenter, - CtrlPageUp, - CtrlPageDown, - ShiftUp, - ShiftDown, + + Left, /// Left arrow while shift is pressed. ShiftLeft, + AltLeft, + AltShiftLeft, + CtrlLeft, + CtrlShiftLeft, + CtrlAltLeft, + + Right, /// Right arrow while shift is pressed. ShiftRight, - CtrlShiftLeft, - CtrlShiftRight, - CtrlShiftUp, - CtrlShiftDown, - CtrlLeft, + AltRight, + AltShiftRight, CtrlRight, + CtrlShiftRight, + CtrlAltRight, + + Up, + ShiftUp, + AltUp, + AltShiftUp, CtrlUp, + CtrlShiftUp, + CtrlAltUp, + + Down, + ShiftDown, + AltDown, + AltShiftDown, CtrlDown, + CtrlShiftDown, + CtrlAltDown, + + PageUp, + ShiftPageUp, + AltPageUp, + AltShiftPageUp, + CtrlPageUp, + CtrlShiftPageUp, + CtrlAltPageUp, + + PageDown, + ShiftPageDown, + AltPageDown, + AltShiftPageDown, + CtrlPageDown, + CtrlShiftPageDown, + CtrlAltPageDown, + + Home, + ShiftHome, + AltHome, + AltShiftHome, + CtrlHome, + CtrlShiftHome, + CtrlAltHome, + + End, + ShiftEnd, + AltEnd, + AltShiftEnd, + CtrlEnd, + CtrlShiftEnd, + CtrlAltEnd, + + /// Delete key + Del, + ShiftDel, + AltDel, + AltShiftDel, + CtrlDel, + CtrlShiftDel, + + /// Insert key. + Ins, + /// Insert key while ctrl is pressed. + CtrlIns, + AltIns, + CtrlAltIns, + F(u8), CtrlF(u8), ShiftF(u8), @@ -93,24 +137,73 @@ impl Key { 27 => Key::Esc, // `Backspace` sends 127, but Ctrl-H sends `Backspace` 127 | ncurses::KEY_BACKSPACE => Key::Backspace, + // Values under 256 are chars. + + // Values 512 and above are probably extensions // Those keys don't seem to be documented... - 515 => Key::CtrlDel, - 516 => Key::CtrlShiftDel, - 521 => Key::CtrlDown, - 522 => Key::CtrlShiftDown, - 526 => Key::CtrlEnd, - 527 => Key::CtrlShiftEnd, - 531 => Key::CtrlHome, - 532 => Key::CtrlShiftHome, - 536 => Key::CtrlIns, - 541 => Key::CtrlLeft, - 542 => Key::CtrlShiftLeft, - 546 => Key::CtrlPageDown, - 551 => Key::CtrlPageUp, - 556 => Key::CtrlRight, - 557 => Key::CtrlShiftRight, - 562 => Key::CtrlUp, - 563 => Key::CtrlShiftUp, + 519 => Key::AltDel, + 520 => Key::AltShiftDel, + 521 => Key::CtrlDel, + 522 => Key::CtrlShiftDel, + // 523: CtrlAltDel? + + // 524? + + 525 => Key::AltDown, + 526 => Key::AltShiftDown, + 527 => Key::CtrlDown, + 528 => Key::CtrlShiftDown, + 529 => Key::CtrlAltDown, + + 530 => Key::AltEnd, + 531 => Key::AltShiftEnd, + 532 => Key::CtrlEnd, + 533 => Key::CtrlShiftEnd, + 534 => Key::CtrlAltEnd, + + 535 => Key::AltHome, + 536 => Key::AltShiftHome, + 537 => Key::CtrlHome, + 538 => Key::CtrlShiftHome, + 539 => Key::CtrlAltHome, + + 540 => Key::AltIns, + // 541: AltShiftIns? + 542 => Key::CtrlIns, + // 543: CtrlShiftIns? + 544 => Key::CtrlAltIns, + + 545 => Key::AltLeft, + 546 => Key::AltShiftLeft, + 547 => Key::CtrlLeft, + 548 => Key::CtrlShiftLeft, + 549 => Key::CtrlAltLeft, + + 550 => Key::AltPageDown, + 551 => Key::AltShiftPageDown, + 552 => Key::CtrlPageDown, + 553 => Key::CtrlShiftPageDown, + 554 => Key::CtrlAltPageDown, + + 555 => Key::AltPageUp, + 556 => Key::AltShiftPageUp, + 557 => Key::CtrlPageUp, + 558 => Key::CtrlShiftPageUp, + 559 => Key::CtrlAltPageUp, + + 560 => Key::AltRight, + 561 => Key::AltShiftRight, + 562 => Key::CtrlRight, + 563 => Key::CtrlShiftRight, + 564 => Key::CtrlAltRight, + // 565? + + 566 => Key::AltUp, + 567 => Key::AltShiftUp, + 568 => Key::CtrlUp, + 569 => Key::CtrlShiftUp, + 570 => Key::CtrlAltUp, + ncurses::KEY_B2 => Key::NumpadCenter, ncurses::KEY_DC => Key::Del, ncurses::KEY_IC => Key::Ins, @@ -130,6 +223,8 @@ impl Key { ncurses::KEY_SHOME => Key::ShiftHome, ncurses::KEY_SEND => Key::ShiftEnd, ncurses::KEY_SDC => Key::ShiftDel, + ncurses::KEY_SNEXT => Key::ShiftPageDown, + ncurses::KEY_SPREVIOUS => Key::ShiftPageUp, // All Fn keys use the same enum with associated number f @ ncurses::KEY_F1...ncurses::KEY_F12 => Key::F((f - ncurses::KEY_F0) as u8), f @ 277...288 => Key::ShiftF((f - 281 + 5) as u8), @@ -159,44 +254,87 @@ impl fmt::Display for Key { "{}", match key { Key::NumpadCenter => "Numpad center", + Key::Backspace => "Backspace", + Key::Enter => "Enter", + Key::Tab => "Tab", + Key::ShiftTab => "Shift-Tab", + + Key::PageUp => "PageUp", + Key::ShiftPageUp => "Shift-PageUp", + Key::AltPageUp => "Alt-PageUp", + Key::AltShiftPageUp => "Alt-Shift-PageUp", + Key::CtrlPageUp => "Ctrl-PageUp", + Key::CtrlShiftPageUp => "Ctrl-Shift-PageUp", + Key::CtrlAltPageUp => "Ctrl-Alt-PageUp", + + Key::PageDown => "PageDown", + Key::ShiftPageDown => "Shift-PageDown", + Key::AltPageDown => "Alt-PageDown", + Key::AltShiftPageDown => "Alt-Shift-PageDown", + Key::CtrlPageDown => "Ctrl-PageDown", + Key::CtrlShiftPageDown => "Ctrl-Shift-PageDown", + Key::CtrlAltPageDown => "Ctrl-Alt-PageDown", + Key::Left => "Left", - Key::Right => "Right", - Key::Down => "Down", - Key::Up => "Up", - Key::CtrlShiftLeft => "Ctrl-Shift-Left", - Key::CtrlShiftRight => "Ctrl-Shift-Right", - Key::CtrlShiftUp => "Ctrl-Shift-Up", - Key::CtrlShiftDown => "Ctrl-Shift-Down", - Key::ShiftUp => "Shift-Up", - Key::ShiftDown => "Shift-Down", Key::ShiftLeft => "Shift-Left", + Key::AltLeft => "Alt-Left", + Key::AltShiftLeft => "Alt-Shift-Left", + Key::CtrlLeft => "Ctrl-Left", + Key::CtrlShiftLeft => "Ctrl-Shift-Left", + Key::CtrlAltLeft => "Ctrl-Alt-Left", + + Key::Right => "Right", Key::ShiftRight => "Shift-Right", + Key::AltRight => "Alt-Right", + Key::AltShiftRight => "Alt-Shift-Right", + Key::CtrlRight => "Ctrl-Right", + Key::CtrlShiftRight => "Ctrl-Shift-Right", + Key::CtrlAltRight => "Ctrl-Alt-Right", + + Key::Down => "Down", + Key::ShiftDown => "Shift-Down", + Key::AltDown => "Alt-Down", + Key::AltShiftDown => "Alt-Shift-Down", + Key::CtrlDown => "Ctrl-Down", + Key::CtrlShiftDown => "Ctrl-Shift-Down", + Key::CtrlAltDown => "Ctrl-Alt-Down", + + Key::Up => "Up", + Key::ShiftUp => "Shift-Up", + Key::AltUp => "Alt-Up", + Key::AltShiftUp => "Alt-Shift-Up", + Key::CtrlUp => "Ctrl-Up", + Key::CtrlShiftUp => "Ctrl-Shift-Up", + Key::CtrlAltUp => "Ctrl-Alt-Up", + + Key::Del => "Del", Key::ShiftDel => "Shift-Del", + Key::AltDel => "Alt-Del", + Key::AltShiftDel => "Alt-Shift-Del", Key::CtrlDel => "Ctrl-Del", Key::CtrlShiftDel => "Ctrl-Shift-Del", - Key::CtrlLeft => "Ctrl-Left", - Key::CtrlRight => "Ctrl-Right", - Key::CtrlUp => "Ctrl-Up", - Key::CtrlDown => "Ctrl-Down", - Key::CtrlPageUp => "Ctrl-PageUp", - Key::CtrlPageDown => "Ctrl-PageDown", - Key::PageUp => "PageUp", - Key::PageDown => "PageDown", + Key::Home => "Home", Key::ShiftHome => "Shift-Home", + Key::AltHome => "Alt-Home", + Key::AltShiftHome => "Alt-Shift-Home", Key::CtrlHome => "Ctrl-Home", Key::CtrlShiftHome => "Ctrl-Shift-Home", + Key::CtrlAltHome => "Ctrl-Alt-Home", + Key::End => "End", Key::ShiftEnd => "Shift-End", + Key::AltEnd => "Alt-End", + Key::AltShiftEnd => "Alt-Shift-End", Key::CtrlEnd => "Ctrl-End", Key::CtrlShiftEnd => "Ctrl-Shift-End", - Key::Backspace => "Backspace", - Key::Del => "Del", - Key::Enter => "Enter", - Key::ShiftTab => "Shift-Tab", - Key::Tab => "Tab", + Key::CtrlAltEnd => "Ctrl-Alt-End", + Key::Ins => "Ins", + Key::AltIns => "Alt-Ins", Key::CtrlIns => "Ctrl-Ins", + Key::CtrlAltIns => "Ctrl-Alt-Ins", + Key::Esc => "Esc", _ => "Missing key label", })