diff --git a/CHANGELOG.md b/CHANGELOG.md index 427b8165068bda23b3ac904009ba08af9435cb5a..200b7a1a5e385b68f495fc045f7d967048857d9f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ current (development) - Feature: `ResizeableSplit` now support arbitrary element as a separator. - Feature: `input` is now supporting multiple lines. - Feature: `input` style is now customizeable. +- Bugfix: Support F1-F5 from OS terminal. ### Dom - Feature: Add `hyperlink` decorator. For instance: diff --git a/src/ftxui/component/terminal_input_parser.cpp b/src/ftxui/component/terminal_input_parser.cpp index 9fad1ba132f5a11d8cca2b54feb83d03ab2cea4c..cbf125e27bc0d11c5bac27f2695f358fb6ea09f2 100644 --- a/src/ftxui/component/terminal_input_parser.cpp +++ b/src/ftxui/component/terminal_input_parser.cpp @@ -44,6 +44,13 @@ const std::map<std::string, std::string> g_uniformize = { {"\x1BOH", "\x1B[H"}, // HOME {"\x1BOF", "\x1B[F"}, // END + // Variations around the FN keys. + // See: https://github.com/ArthurSonzogni/FTXUI/issues/685 + {"\x1B[[A", "\x1BOP"}, // F1 + {"\x1B[[B", "\x1BOQ"}, // F2 + {"\x1B[[C", "\x1BOR"}, // F3 + {"\x1B[[D", "\x1BOS"}, // F4 + {"\x1B[[E", "\x1B[15~"}, // F5 }; TerminalInputParser::TerminalInputParser(Sender<Task> out) @@ -291,9 +298,16 @@ TerminalInputParser::Output TerminalInputParser::ParseCSI() { continue; } - if (Current() >= ' ' && Current() <= '~' && Current() != '<') { + // CSI is terminated by a character in the range 0x40–0x7E + // (ASCII @A–Z[\]^_`a–z{|}~), + if (Current() >= '@' && Current() <= '~' && + // Note: I don't remember why we exclude '<' + Current() != '<' && + // To handle F1-F4, we exclude '['. + Current() != '[') { arguments.push_back(argument); argument = 0; // NOLINT + switch (Current()) { case 'M': return ParseMouse(altered, true, std::move(arguments)); diff --git a/src/ftxui/component/terminal_input_parser_test.cpp b/src/ftxui/component/terminal_input_parser_test.cpp index 79ca86d9ca56fd7688ba99c3c83529d555e14aee..95fd4234de22003c9393b26c51ae9cfa35bc76cc 100644 --- a/src/ftxui/component/terminal_input_parser_test.cpp +++ b/src/ftxui/component/terminal_input_parser_test.cpp @@ -385,6 +385,13 @@ TEST(Event, Special) { {str("\x1B[23~"), Event::F11}, {str("\x1B[24~"), Event::F12}, + // Function keys for virtual terminal: + {str("\x1B[[A"), Event::F1}, + {str("\x1B[[B"), Event::F2}, + {str("\x1B[[C"), Event::F3}, + {str("\x1B[[D"), Event::F4}, + {str("\x1B[[E"), Event::F5}, + // Page up and down: {str("\x1B[5~"), Event::PageUp}, {str("\x1B[6~"), Event::PageDown},