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;
342 if (Current() ==
'<') {
346 if (Current() >=
'0' && Current() <=
'9') {
348 argument += Current() -
'0';
351 if (Current() ==
';') {
352 arguments.push_back(argument);
358 if (Current() >=
'@' && Current() <=
'~' &&
363 arguments.push_back(argument);
368 return ParseMouse(altered,
true, std::move(arguments));
370 return ParseMouse(altered,
false, std::move(arguments));
372 return ParseCursorPosition(std::move(arguments));
378 if (Current() ==
'\x1B') {
384TerminalInputParser::Output TerminalInputParser::ParseOSC() {
390 if (Current() !=
'\x1B') {
396 if (Current() !=
'\\') {
403TerminalInputParser::Output TerminalInputParser::ParseMouse(
406 std::vector<int> arguments) {
407 if (arguments.size() != 3) {
413 Output output(MOUSE);
426 const int button = arguments[0] & (1 + 2);
427 const bool is_shift = arguments[0] & 4;
428 const bool is_meta = arguments[0] & 8;
429 const bool is_control = arguments[0] & 16;
430 const bool is_move = arguments[0] & 32;
431 const bool is_wheel = arguments[0] & 64;
436 : Mouse::Button(button);
437 output.mouse.shift = is_shift;
438 output.mouse.meta = is_meta;
439 output.mouse.control = is_control;
440 output.mouse.x = arguments[1];
441 output.mouse.y = arguments[2];
448TerminalInputParser::Output TerminalInputParser::ParseCursorPosition(
449 std::vector<int> arguments) {
450 if (arguments.size() != 2) {
453 Output output(CURSOR_POSITION);
454 output.cursor.y = arguments[0];
455 output.cursor.x = arguments[1];
static Event Special(std::string)
Un événement personnalisé dont la signification est définie par l'utilisateur de la bibliothèque.
Représente un événement. Il peut s'agir d'un événement de touche, d'un redimensionnement de terminal,...
L'espace de noms FTXUI ftxui::
const std::map< std::string, std::string > g_uniformize