Support arrow keys in application mode. (#627)

Depending on the Cursor Key Mode (DECCKM), the terminal sends different
escape sequences:

Key     Normal    Application
-----   --------  -----------
Up      ESC [ A   ESC O A
Down    ESC [ B   ESC O B
Right   ESC [ C   ESC O C
Left    ESC [ D   ESC O D
Home    ESC [ H   ESC O H
End     ESC [ F   ESC O F

I decided not to update the current mode to fit what FTXUI parse, but
instead support parsing both. We convert the sequences from the
"application mode" into the "normal mode".

Bug:https://github.com/ArthurSonzogni/FTXUI/issues/626
Fixed:https://github.com/ArthurSonzogni/FTXUI/issues/626
This commit is contained in:
Arthur Sonzogni 2023-04-25 08:52:16 +02:00 committed by ArthurSonzogni
parent debcbc668c
commit 78897ef1f4
No known key found for this signature in database
GPG Key ID: 41D98248C074CD6C
2 changed files with 55 additions and 8 deletions

View File

@ -19,8 +19,31 @@ const std::map<std::string, std::string> g_uniformize = {
// See https://github.com/ArthurSonzogni/FTXUI/issues/337 // See https://github.com/ArthurSonzogni/FTXUI/issues/337
// Here, we uniformize the new line character to `\n`. // Here, we uniformize the new line character to `\n`.
{"\r", "\n"}, {"\r", "\n"},
// See: https://github.com/ArthurSonzogni/FTXUI/issues/508 // See: https://github.com/ArthurSonzogni/FTXUI/issues/508
{std::string({8}), std::string({127})}, {std::string({8}), std::string({127})},
// See: https://github.com/ArthurSonzogni/FTXUI/issues/626
//
// Depending on the Cursor Key Mode (DECCKM), the terminal sends different
// escape sequences:
//
// Key Normal Application
// ----- -------- -----------
// Up ESC [ A ESC O A
// Down ESC [ B ESC O B
// Right ESC [ C ESC O C
// Left ESC [ D ESC O D
// Home ESC [ H ESC O H
// End ESC [ F ESC O F
//
{"\x1BOA", "\x1B[A"}, // UP
{"\x1BOB", "\x1B[B"}, // DOWN
{"\x1BOC", "\x1B[C"}, // RIGHT
{"\x1BOD", "\x1B[D"}, // LEFT
{"\x1BOH", "\x1B[H"}, // HOME
{"\x1BOF", "\x1B[F"}, // END
}; };
TerminalInputParser::TerminalInputParser(Sender<Task> out) TerminalInputParser::TerminalInputParser(Sender<Task> out)

View File

@ -333,22 +333,44 @@ TEST(Event, Special) {
output.push_back(it); output.push_back(it);
return output; return output;
}; };
struct { struct {
std::vector<unsigned char> input; std::vector<unsigned char> input;
Event expected; Event expected;
} kTestCase[] = { } kTestCase[] = {
{str("\x1B[D"), Event::ArrowLeft}, // Arrow (defaut cursor mode)
{str("\x1B[C"), Event::ArrowRight},
{str("\x1B[A"), Event::ArrowUp}, {str("\x1B[A"), Event::ArrowUp},
{str("\x1B[B"), Event::ArrowDown}, {str("\x1B[B"), Event::ArrowDown},
{str("\x1B[C"), Event::ArrowRight},
{str("\x1B[D"), Event::ArrowLeft},
{str("\x1B[H"), Event::Home},
{str("\x1B[F"), Event::End},
// Arrow (application cursor mode)
{str("\x1BOA"), Event::ArrowUp},
{str("\x1BOB"), Event::ArrowDown},
{str("\x1BOC"), Event::ArrowRight},
{str("\x1BOD"), Event::ArrowLeft},
{str("\x1BOH"), Event::Home},
{str("\x1BOF"), Event::End},
// Backspace & Quirk for:
// https://github.com/ArthurSonzogni/FTXUI/issues/508
{{127}, Event::Backspace}, {{127}, Event::Backspace},
// Quirk for: https://github.com/ArthurSonzogni/FTXUI/issues/508
{{8}, Event::Backspace}, {{8}, Event::Backspace},
// Delete
{str("\x1B[3~"), Event::Delete}, {str("\x1B[3~"), Event::Delete},
//{str("\x1B"), Event::Escape},
// Return
{{13}, Event::Return},
{{10}, Event::Return}, {{10}, Event::Return},
// Tabs:
{{9}, Event::Tab}, {{9}, Event::Tab},
{{27, 91, 90}, Event::TabReverse}, {{27, 91, 90}, Event::TabReverse},
// Function keys
{str("\x1BOP"), Event::F1}, {str("\x1BOP"), Event::F1},
{str("\x1BOQ"), Event::F2}, {str("\x1BOQ"), Event::F2},
{str("\x1BOR"), Event::F3}, {str("\x1BOR"), Event::F3},
@ -361,10 +383,12 @@ TEST(Event, Special) {
{str("\x1B[21~"), Event::F10}, {str("\x1B[21~"), Event::F10},
{str("\x1B[23~"), Event::F11}, {str("\x1B[23~"), Event::F11},
{str("\x1B[24~"), Event::F12}, {str("\x1B[24~"), Event::F12},
{{27, 91, 72}, Event::Home},
{{27, 91, 70}, Event::End}, // Page up and down:
{{27, 91, 53, 126}, Event::PageUp}, {str("\x1B[5~"), Event::PageUp},
{{27, 91, 54, 126}, Event::PageDown}, {str("\x1B[6~"), Event::PageDown},
// Custom:
{{0}, Event::Custom}, {{0}, Event::Custom},
}; };