27 {std::string({8}), std::string({127})},
58 {
"\x1B[[A",
"\x1BOP"},
59 {
"\x1B[[B",
"\x1BOQ"},
60 {
"\x1B[[C",
"\x1BOR"},
61 {
"\x1B[[D",
"\x1BOS"},
62 {
"\x1B[[E",
"\x1B[15~"},
65 {
"\x1B[11~",
"\x1BOP"},
66 {
"\x1B[12~",
"\x1BOQ"},
67 {
"\x1B[13~",
"\x1BOR"},
68 {
"\x1B[14~",
"\x1BOS"},
71 {
"\x1BOt",
"\x1B[15~"},
72 {
"\x1BOu",
"\x1B[17~"},
73 {
"\x1BOv",
"\x1B[18~"},
74 {
"\x1BOl",
"\x1B[19~"},
75 {
"\x1BOw",
"\x1B[20~"},
76 {
"\x1BOx",
"\x1B[21~"},
83 {
"\x1B[Q",
"\x1B[15~"},
84 {
"\x1B[R",
"\x1B[17~"},
85 {
"\x1B[S",
"\x1B[18~"},
86 {
"\x1B[T",
"\x1B[19~"},
87 {
"\x1B[U",
"\x1B[20~"},
88 {
"\x1B[V",
"\x1B[21~"},
89 {
"\x1B[W",
"\x1B[23~"},
90 {
"\x1B[X",
"\x1B[24~"},
94 : out_(std::move(
out)) {}
98 const int timeout_threshold = 50;
99 if (timeout_ < timeout_threshold) {
103 if (!pending_.empty()) {
115unsigned char TerminalInputParser::Current() {
116 return pending_[position_];
119bool TerminalInputParser::Eat() {
121 return position_ < static_cast<int>(pending_.size());
124void TerminalInputParser::Send(TerminalInputParser::Output output) {
125 switch (output.type) {
134 out_(Event::Character(std::move(pending_)));
141 pending_ = it->second;
149 out_(Event::Mouse(std::move(pending_), output.mouse));
153 case CURSOR_POSITION:
154 out_(Event::CursorPosition(std::move(pending_),
161 out_(Event::CursorShape(std::move(pending_), output.cursor_shape));
168TerminalInputParser::Output TerminalInputParser::Parse() {
173 if (Current() ==
'\x1B') {
177 if (Current() < 32) {
181 if (Current() == 127) {
204TerminalInputParser::Output TerminalInputParser::ParseUTF8() {
205 auto head = Current();
206 unsigned char selector = 0b1000'0000;
209 unsigned char mask = selector;
212 unsigned int first_zero = 8;
213 for (
unsigned int i = 0; i < 8; ++i) {
215 if (!(head & selector)) {
223 auto value = uint32_t(head & ~mask);
226 const unsigned int max_utf8_bytes = 5;
227 if (first_zero == 1 || first_zero >= max_utf8_bytes) {
232 for (
unsigned int i = 2; i <= first_zero; ++i) {
239 if ((head & 0b1100'0000) != 0b1000'0000) {
243 value += head & 0b0011'1111;
248 if (value <= 0b000'0000'0111'1111) {
250 }
else if (value <= 0b000'0111'1111'1111) {
252 }
else if (value <= 0b1111'1111'1111'1111) {
254 }
else if (value <= 0b1'0000'1111'1111'1111'1111) {
260 if (extra_byte != position_) {
267TerminalInputParser::Output TerminalInputParser::ParseESC() {
301TerminalInputParser::Output TerminalInputParser::ParseDCS() {
308 if (Current() !=
'\x1B') {
316 if (Current() !=
'\\') {
320 if (pending_.size() == 10 &&
321 pending_[2] ==
'1' &&
322 pending_[3] ==
'$' &&
323 pending_[4] ==
'r' &&
325 Output output(CURSOR_SHAPE);
326 output.cursor_shape = pending_[5] -
'0';
334TerminalInputParser::Output TerminalInputParser::ParseCSI() {
335 bool altered =
false;
337 std::vector<int> arguments;
343 if (Current() ==
'<') {
348 if (Current() >=
'0' && Current() <=
'9') {
350 argument += Current() -
'0';
354 if (Current() ==
';') {
355 arguments.push_back(argument);
362 if (Current() >=
'@' && Current() <=
'~' &&
367 arguments.push_back(argument);
372 return ParseMouse(altered,
true, std::move(arguments));
374 return ParseMouse(altered,
false, std::move(arguments));
376 return ParseCursorPosition(std::move(arguments));
383 if (Current() ==
'\x1B') {
389TerminalInputParser::Output TerminalInputParser::ParseOSC() {
395 if (Current() !=
'\x1B') {
401 if (Current() !=
'\\') {
408TerminalInputParser::Output TerminalInputParser::ParseMouse(
411 std::vector<int> arguments) {
412 if (arguments.size() != 3) {
418 Output output(MOUSE);
431 const int button = arguments[0] & (1 + 2);
432 const bool is_shift = arguments[0] & 4;
433 const bool is_meta = arguments[0] & 8;
434 const bool is_control = arguments[0] & 16;
435 const bool is_move = arguments[0] & 32;
436 const bool is_wheel = arguments[0] & 64;
441 : Mouse::Button(button);
442 output.mouse.shift = is_shift;
443 output.mouse.meta = is_meta;
444 output.mouse.control = is_control;
445 output.mouse.x = arguments[1];
446 output.mouse.y = arguments[2];
453TerminalInputParser::Output TerminalInputParser::ParseCursorPosition(
454 std::vector<int> arguments) {
455 if (arguments.size() != 2) {
458 Output output(CURSOR_POSITION);
459 output.cursor.y = arguments[0];
460 output.cursor.x = arguments[1];
static Event Special(std::string)
Un evento personalizado cuyo significado es definido por el usuario de la biblioteca.
Representa un evento. Puede ser un evento de pulsación de tecla, un redimensionamiento de terminal,...
El espacio de nombres ftxui:: de FTXUI.
const std::map< std::string, std::string > g_uniformize