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~"},
103 if (!pending_.empty()) {
115unsigned char TerminalInputParser::Current() {
116 return pending_[position_];
119bool TerminalInputParser::Eat() {
124void TerminalInputParser::Send(TerminalInputParser::Output
output) {
134 out_->Send(Event::Character(std::move(pending_)));
141 pending_ =
it->second;
149 out_->Send(Event::Mouse(std::move(pending_),
output.mouse));
153 case CURSOR_POSITION:
154 out_->Send(Event::CursorPosition(std::move(pending_),
161 out_->Send(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;
213 for (
unsigned int i = 0; i < 8; ++i) {
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) {
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() {
343 if (Current() ==
'<') {
348 if (Current() >=
'0' && Current() <=
'9') {
354 if (Current() ==
';') {
362 if (Current() >=
'@' && Current() <=
'~' &&
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(
431 const int button =
arguments[0] & (1 + 2);
453TerminalInputParser::Output TerminalInputParser::ParseCursorPosition(
458 Output
output(CURSOR_POSITION);
std::shared_ptr< T > Make(Args &&... args)
Component Button(ButtonOption options)
Draw a button. Execute a function when clicked.
std::unique_ptr< SenderImpl< T > > Sender
const std::map< std::string, std::string > g_uniformize
static Event Special(std::string)
An custom event whose meaning is defined by the user of the library.