5#include <initializer_list>
20#pragma clang diagnostic ignored "-Wshadow"
22#pragma GCC diagnostic ignored "-Wshadow"
23#elif defined(_MSC_VER)
24#pragma warning(disable : 6244)
25#pragma warning(disable : 6246)
33Event Event::Character(std::string_view input) {
35 event.input_ = std::string(input);
36 event.type_ = Type::Character;
43Event Event::Character(
char c) {
44 return Event::Character(std::string{c});
50Event Event::Character(
wchar_t c) {
51 return Event::Character(to_string(std::wstring{c}));
58Event Event::Mouse(std::string_view input,
struct Mouse mouse) {
60 event.input_ = std::string(input);
61 event.type_ = Type::Mouse;
62 event.data_.mouse = mouse;
68Event Event::CursorShape(std::string_view input,
int shape) {
70 event.input_ = std::string(input);
71 event.type_ = Type::CursorShape;
72 event.data_.cursor_shape = shape;
78Event Event::TerminalNameVersion(std::string_view input,
82 event.input_ = std::string(input);
83 event.type_ = Type::TerminalNameVersion;
84 event.terminal_name_ = std::make_shared<std::string>(std::move(name));
85 event.data_.terminal_version = version;
91Event Event::TerminalEmulator(std::string_view input,
93 std::string version) {
95 event.input_ = std::string(input);
96 event.type_ = Type::TerminalEmulator;
97 event.terminal_name_ = std::make_shared<std::string>(std::move(name));
98 event.terminal_emulator_version_ =
99 std::make_shared<std::string>(std::move(version));
105Event Event::TerminalCapabilities(std::string_view input,
106 std::vector<int> capabilities) {
108 event.input_ = std::string(input);
109 event.type_ = Type::TerminalCapabilities;
110 event.terminal_capabilities_ =
111 std::make_shared<std::vector<int>>(std::move(capabilities));
116std::vector<std::string> Event::TerminalCapabilityNames()
const {
117 if (type_ != Type::TerminalCapabilities) {
121 std::vector<std::string> names;
122 for (
const int cap : *terminal_capabilities_) {
127 names.emplace_back(
"132-columns");
130 names.emplace_back(
"Printer-port");
133 names.emplace_back(
"ReGIS-graphics");
136 names.emplace_back(
"Sixel-graphics");
139 names.emplace_back(
"Selective-erase");
142 names.emplace_back(
"Soft-character-set-(DRCS)");
145 names.emplace_back(
"User-defined-keys-(UDK)");
148 names.emplace_back(
"National-replacement-character-sets-(NRC)");
151 names.emplace_back(
"Local-editing");
154 names.emplace_back(
"Technical-character-set");
157 names.emplace_back(
"Windowing-capability");
160 names.emplace_back(
"Horizontal-scrolling");
163 names.emplace_back(
"ANSI-color");
166 names.emplace_back(
"Font-loading");
169 names.emplace_back(
"ANSI-text-locator-(Mouse)");
172 names.emplace_back(
"UTF-8");
175 names.emplace_back(
"VT510");
178 names.emplace_back(
"VT220");
181 names.emplace_back(
"VT320");
184 names.emplace_back(
"VT420");
187 names.emplace_back(
"VT525");
190 names.emplace_back(
"Unknown-" + std::to_string(cap));
198bool Event::IsTerminalNameVersion()
const {
199 return type_ == Type::TerminalNameVersion;
203const std::string& Event::TerminalName()
const {
204 return *terminal_name_;
208int Event::TerminalVersion()
const {
209 return data_.terminal_version;
213bool Event::IsTerminalCapabilities()
const {
214 return type_ == Type::TerminalCapabilities;
218const std::vector<int>& Event::TerminalCapabilities()
const {
219 return *terminal_capabilities_;
223bool Event::IsTerminalEmulator()
const {
224 return type_ == Type::TerminalEmulator;
228const std::string& Event::TerminalEmulatorName()
const {
229 return *terminal_name_;
233const std::string& Event::TerminalEmulatorVersion()
const {
234 return *terminal_emulator_version_;
240Event Event::Special(std::string_view input) {
242 event.input_ = std::string(input);
249Event Event::Special(std::initializer_list<char> input) {
250 return Event::Special(std::string(input));
255Event Event::CursorPosition(std::string_view input,
int x,
int y) {
257 event.input_ = std::string(input);
258 event.type_ = Type::CursorPosition;
259 event.data_.cursor = {x,
y};
264std::string Event::DebugString()
const {
265 static std::map<Event, const char*> event_to_string = {
267 {Event::ArrowLeft,
"Event::ArrowLeft"},
268 {Event::ArrowRight,
"Event::ArrowRight"},
269 {Event::ArrowUp,
"Event::ArrowUp"},
270 {Event::ArrowDown,
"Event::ArrowDown"},
273 {Event::ArrowLeftCtrl,
"Event::ArrowLeftCtrl"},
274 {Event::ArrowRightCtrl,
"Event::ArrowRightCtrl"},
275 {Event::ArrowUpCtrl,
"Event::ArrowUpCtrl"},
276 {Event::ArrowDownCtrl,
"Event::ArrowDownCtrl"},
279 {Event::Backspace,
"Event::Backspace"},
280 {Event::Delete,
"Event::Delete"},
281 {Event::Escape,
"Event::Escape"},
282 {Event::Return,
"Event::Return"},
283 {Event::Tab,
"Event::Tab"},
284 {Event::TabReverse,
"Event::TabReverse"},
287 {Event::F1,
"Event::F1"},
288 {Event::F2,
"Event::F2"},
289 {Event::F3,
"Event::F3"},
290 {Event::F4,
"Event::F4"},
291 {Event::F5,
"Event::F5"},
292 {Event::F6,
"Event::F6"},
293 {Event::F7,
"Event::F7"},
294 {Event::F8,
"Event::F8"},
295 {Event::F9,
"Event::F9"},
296 {Event::F10,
"Event::F10"},
297 {Event::F11,
"Event::F11"},
298 {Event::F12,
"Event::F12"},
301 {Event::Insert,
"Event::Insert"},
302 {Event::Home,
"Event::Home"},
303 {Event::End,
"Event::End"},
304 {Event::PageUp,
"Event::PageUp"},
305 {Event::PageDown,
"Event::PageDown"},
308 {Event::CtrlA,
"Event::CtrlA"},
309 {Event::CtrlB,
"Event::CtrlB"},
310 {Event::CtrlC,
"Event::CtrlC"},
311 {Event::CtrlD,
"Event::CtrlD"},
312 {Event::CtrlE,
"Event::CtrlE"},
313 {Event::CtrlF,
"Event::CtrlF"},
314 {Event::CtrlG,
"Event::CtrlG"},
315 {Event::CtrlH,
"Event::CtrlH"},
316 {Event::CtrlI,
"Event::CtrlI"},
317 {Event::CtrlJ,
"Event::CtrlJ"},
318 {Event::CtrlK,
"Event::CtrlK"},
319 {Event::CtrlL,
"Event::CtrlL"},
320 {Event::CtrlM,
"Event::CtrlM"},
321 {Event::CtrlN,
"Event::CtrlN"},
322 {Event::CtrlO,
"Event::CtrlO"},
323 {Event::CtrlP,
"Event::CtrlP"},
324 {Event::CtrlQ,
"Event::CtrlQ"},
325 {Event::CtrlR,
"Event::CtrlR"},
326 {Event::CtrlS,
"Event::CtrlS"},
327 {Event::CtrlT,
"Event::CtrlT"},
328 {Event::CtrlU,
"Event::CtrlU"},
329 {Event::CtrlV,
"Event::CtrlV"},
330 {Event::CtrlW,
"Event::CtrlW"},
331 {Event::CtrlX,
"Event::CtrlX"},
332 {Event::CtrlY,
"Event::CtrlY"},
333 {Event::CtrlZ,
"Event::CtrlZ"},
336 {Event::AltA,
"Event::AltA"},
337 {Event::AltB,
"Event::AltB"},
338 {Event::AltC,
"Event::AltC"},
339 {Event::AltD,
"Event::AltD"},
340 {Event::AltE,
"Event::AltE"},
341 {Event::AltF,
"Event::AltF"},
342 {Event::AltG,
"Event::AltG"},
343 {Event::AltH,
"Event::AltH"},
344 {Event::AltI,
"Event::AltI"},
345 {Event::AltJ,
"Event::AltJ"},
346 {Event::AltK,
"Event::AltK"},
347 {Event::AltL,
"Event::AltL"},
348 {Event::AltM,
"Event::AltM"},
349 {Event::AltN,
"Event::AltN"},
350 {Event::AltO,
"Event::AltO"},
351 {Event::AltP,
"Event::AltP"},
352 {Event::AltQ,
"Event::AltQ"},
353 {Event::AltR,
"Event::AltR"},
354 {Event::AltS,
"Event::AltS"},
355 {Event::AltT,
"Event::AltT"},
356 {Event::AltU,
"Event::AltU"},
357 {Event::AltV,
"Event::AltV"},
358 {Event::AltW,
"Event::AltW"},
359 {Event::AltX,
"Event::AltX"},
360 {Event::AltY,
"Event::AltY"},
361 {Event::AltZ,
"Event::AltZ"},
364 {Event::CtrlAltA,
"Event::CtrlAltA"},
365 {Event::CtrlAltB,
"Event::CtrlAltB"},
366 {Event::CtrlAltC,
"Event::CtrlAltC"},
367 {Event::CtrlAltD,
"Event::CtrlAltD"},
368 {Event::CtrlAltE,
"Event::CtrlAltE"},
369 {Event::CtrlAltF,
"Event::CtrlAltF"},
370 {Event::CtrlAltG,
"Event::CtrlAltG"},
371 {Event::CtrlAltH,
"Event::CtrlAltH"},
372 {Event::CtrlAltI,
"Event::CtrlAltI"},
373 {Event::CtrlAltJ,
"Event::CtrlAltJ"},
374 {Event::CtrlAltK,
"Event::CtrlAltK"},
375 {Event::CtrlAltL,
"Event::CtrlAltL"},
376 {Event::CtrlAltM,
"Event::CtrlAltM"},
377 {Event::CtrlAltN,
"Event::CtrlAltN"},
378 {Event::CtrlAltO,
"Event::CtrlAltO"},
379 {Event::CtrlAltP,
"Event::CtrlAltP"},
380 {Event::CtrlAltQ,
"Event::CtrlAltQ"},
381 {Event::CtrlAltR,
"Event::CtrlAltR"},
382 {Event::CtrlAltS,
"Event::CtrlAltS"},
383 {Event::CtrlAltT,
"Event::CtrlAltT"},
384 {Event::CtrlAltU,
"Event::CtrlAltU"},
385 {Event::CtrlAltV,
"Event::CtrlAltV"},
386 {Event::CtrlAltW,
"Event::CtrlAltW"},
387 {Event::CtrlAltX,
"Event::CtrlAltX"},
388 {Event::CtrlAltY,
"Event::CtrlAltY"},
389 {Event::CtrlAltZ,
"Event::CtrlAltZ"},
392 {Event::Custom,
"Event::Custom"},
395 static std::map<Mouse::Button, const char*> mouse_button_string = {
396 {Mouse::Button::Left,
".button = Mouse::Left"},
397 {Mouse::Button::Middle,
".button = Mouse::Middle"},
398 {Mouse::Button::Right,
".button = Mouse::Right"},
399 {Mouse::Button::WheelUp,
".button = Mouse::WheelUp"},
400 {Mouse::Button::WheelDown,
".button = Mouse::WheelDown"},
401 {Mouse::Button::None,
".button = Mouse::None"},
402 {Mouse::Button::WheelLeft,
".button = Mouse::WheelLeft"},
403 {Mouse::Button::WheelRight,
".button = Mouse::WheelRight"},
406 static std::map<Mouse::Motion, const char*> mouse_motion_string = {
407 {Mouse::Motion::Pressed,
".motion = Mouse::Pressed"},
408 {Mouse::Motion::Released,
".motion = Mouse::Released"},
409 {Mouse::Motion::Moved,
".motion = Mouse::Moved"},
413 case Type::Character: {
414 return "Event::Character(\"" + input_ +
"\")";
417 std::string out =
"Event::Mouse(\"...\", Mouse{";
418 out += std::string(mouse_button_string[data_.mouse.button]);
420 out += std::string(mouse_motion_string[data_.mouse.motion]);
422 if (data_.mouse.shift) {
423 out +=
".shift = true, ";
425 if (data_.mouse.meta) {
426 out +=
".meta = true, ";
428 if (data_.mouse.control) {
429 out +=
".control = true, ";
431 out +=
".x = " + std::to_string(data_.mouse.x);
433 out +=
".y = " + std::to_string(data_.mouse.y);
437 case Type::CursorShape:
438 return "Event::CursorShape(" + input_ +
", " +
439 std::to_string(data_.cursor_shape) +
")";
440 case Type::CursorPosition:
441 return "Event::CursorPosition(" + input_ +
", " +
442 std::to_string(data_.cursor.x) +
", " +
443 std::to_string(data_.cursor.y) +
")";
444 case Type::TerminalNameVersion:
445 return "Event::TerminalNameVersion(" + input_ +
", " + *terminal_name_ +
446 ", " + std::to_string(data_.terminal_version) +
")";
447 case Type::TerminalEmulator:
448 return "Event::TerminalEmulator(" + input_ +
", " + *terminal_name_ +
449 ", " + *terminal_emulator_version_ +
")";
450 case Type::TerminalCapabilities: {
451 std::string out =
"Event::TerminalCapabilities(" + input_ +
", {";
452 for (
size_t i = 0; i < terminal_capabilities_->size(); ++i) {
453 out += std::to_string((*terminal_capabilities_)[i]);
454 if (i + 1 < terminal_capabilities_->size()) {
462 auto event_it = event_to_string.find(*
this);
463 if (event_it != event_to_string.end()) {
464 return event_it->second;
477const Event Event::ArrowLeft = Event::Special(
"\x1B[D");
478const Event Event::ArrowRight = Event::Special(
"\x1B[C");
479const Event Event::ArrowUp = Event::Special(
"\x1B[A");
480const Event Event::ArrowDown = Event::Special(
"\x1B[B");
481const Event Event::ArrowLeftCtrl = Event::Special(
"\x1B[1;5D");
482const Event Event::ArrowRightCtrl = Event::Special(
"\x1B[1;5C");
483const Event Event::ArrowUpCtrl = Event::Special(
"\x1B[1;5A");
484const Event Event::ArrowDownCtrl = Event::Special(
"\x1B[1;5B");
485const Event Event::Backspace = Event::Special({127});
486const Event Event::Delete = Event::Special(
"\x1B[3~");
487const Event Event::Escape = Event::Special(
"\x1B");
488const Event Event::Return = Event::Special({10});
489const Event Event::Tab = Event::Special({9});
490const Event Event::TabReverse = Event::Special({27, 91, 90});
494const Event Event::F1 = Event::Special(
"\x1BOP");
495const Event Event::F2 = Event::Special(
"\x1BOQ");
496const Event Event::F3 = Event::Special(
"\x1BOR");
497const Event Event::F4 = Event::Special(
"\x1BOS");
498const Event Event::F5 = Event::Special(
"\x1B[15~");
499const Event Event::F6 = Event::Special(
"\x1B[17~");
500const Event Event::F7 = Event::Special(
"\x1B[18~");
501const Event Event::F8 = Event::Special(
"\x1B[19~");
502const Event Event::F9 = Event::Special(
"\x1B[20~");
503const Event Event::F10 = Event::Special(
"\x1B[21~");
504const Event Event::F11 = Event::Special(
"\x1B[23~");
505const Event Event::F12 = Event::Special(
"\x1B[24~");
507const Event Event::Insert = Event::Special(
"\x1B[2~");
508const Event Event::Home = Event::Special({27, 91, 72});
509const Event Event::End = Event::Special({27, 91, 70});
510const Event Event::PageUp = Event::Special({27, 91, 53, 126});
511const Event Event::PageDown = Event::Special({27, 91, 54, 126});
512const Event Event::Custom = Event::Special({0});
514const Event Event::a = Event::Character(
"a");
515const Event Event::b = Event::Character(
"b");
516const Event Event::c = Event::Character(
"c");
517const Event Event::d = Event::Character(
"d");
518const Event Event::e = Event::Character(
"e");
519const Event Event::f = Event::Character(
"f");
520const Event Event::g = Event::Character(
"g");
521const Event Event::h = Event::Character(
"h");
522const Event Event::i = Event::Character(
"i");
523const Event Event::j = Event::Character(
"j");
524const Event Event::k = Event::Character(
"k");
525const Event Event::l = Event::Character(
"l");
526const Event Event::m = Event::Character(
"m");
527const Event Event::n = Event::Character(
"n");
528const Event Event::o = Event::Character(
"o");
529const Event Event::p = Event::Character(
"p");
530const Event Event::q = Event::Character(
"q");
531const Event Event::r = Event::Character(
"r");
532const Event Event::s = Event::Character(
"s");
533const Event Event::t = Event::Character(
"t");
534const Event Event::u = Event::Character(
"u");
535const Event Event::v = Event::Character(
"v");
536const Event Event::w = Event::Character(
"w");
537const Event Event::x = Event::Character(
"x");
538const Event Event::y = Event::Character(
"y");
539const Event Event::z = Event::Character(
"z");
541const Event Event::A = Event::Character(
"A");
542const Event Event::B = Event::Character(
"B");
543const Event Event::C = Event::Character(
"C");
544const Event Event::D = Event::Character(
"D");
545const Event Event::E = Event::Character(
"E");
546const Event Event::F = Event::Character(
"F");
547const Event Event::G = Event::Character(
"G");
548const Event Event::H = Event::Character(
"H");
549const Event Event::I = Event::Character(
"I");
550const Event Event::J = Event::Character(
"J");
551const Event Event::K = Event::Character(
"K");
552const Event Event::L = Event::Character(
"L");
553const Event Event::M = Event::Character(
"M");
554const Event Event::N = Event::Character(
"N");
555const Event Event::O = Event::Character(
"O");
556const Event Event::P = Event::Character(
"P");
557const Event Event::Q = Event::Character(
"Q");
558const Event Event::R = Event::Character(
"R");
559const Event Event::S = Event::Character(
"S");
560const Event Event::T = Event::Character(
"T");
561const Event Event::U = Event::Character(
"U");
562const Event Event::V = Event::Character(
"V");
563const Event Event::W = Event::Character(
"W");
564const Event Event::X = Event::Character(
"X");
565const Event Event::Y = Event::Character(
"Y");
566const Event Event::Z = Event::Character(
"Z");
568const Event Event::CtrlA = Event::Special(
"\x01");
569const Event Event::CtrlB = Event::Special(
"\x02");
570const Event Event::CtrlC = Event::Special(
"\x03");
571const Event Event::CtrlD = Event::Special(
"\x04");
572const Event Event::CtrlE = Event::Special(
"\x05");
573const Event Event::CtrlF = Event::Special(
"\x06");
574const Event Event::CtrlG = Event::Special(
"\x07");
575const Event Event::CtrlH = Event::Special(
"\x08");
576const Event Event::CtrlI = Event::Special(
"\x09");
577const Event Event::CtrlJ = Event::Special(
"\x0a");
578const Event Event::CtrlK = Event::Special(
"\x0b");
579const Event Event::CtrlL = Event::Special(
"\x0c");
580const Event Event::CtrlM = Event::Special(
"\x0d");
581const Event Event::CtrlN = Event::Special(
"\x0e");
582const Event Event::CtrlO = Event::Special(
"\x0f");
583const Event Event::CtrlP = Event::Special(
"\x10");
584const Event Event::CtrlQ = Event::Special(
"\x11");
585const Event Event::CtrlR = Event::Special(
"\x12");
586const Event Event::CtrlS = Event::Special(
"\x13");
587const Event Event::CtrlT = Event::Special(
"\x14");
588const Event Event::CtrlU = Event::Special(
"\x15");
589const Event Event::CtrlV = Event::Special(
"\x16");
590const Event Event::CtrlW = Event::Special(
"\x17");
591const Event Event::CtrlX = Event::Special(
"\x18");
592const Event Event::CtrlY = Event::Special(
"\x19");
593const Event Event::CtrlZ = Event::Special(
"\x1a");
595const Event Event::AltA = Event::Special(
"\x1b""a");
596const Event Event::AltB = Event::Special(
"\x1b""b");
597const Event Event::AltC = Event::Special(
"\x1b""c");
598const Event Event::AltD = Event::Special(
"\x1b""d");
599const Event Event::AltE = Event::Special(
"\x1b""e");
600const Event Event::AltF = Event::Special(
"\x1b""f");
601const Event Event::AltG = Event::Special(
"\x1b""g");
602const Event Event::AltH = Event::Special(
"\x1b""h");
603const Event Event::AltI = Event::Special(
"\x1b""i");
604const Event Event::AltJ = Event::Special(
"\x1b""j");
605const Event Event::AltK = Event::Special(
"\x1b""k");
606const Event Event::AltL = Event::Special(
"\x1b""l");
607const Event Event::AltM = Event::Special(
"\x1b""m");
608const Event Event::AltN = Event::Special(
"\x1b""n");
609const Event Event::AltO = Event::Special(
"\x1b""o");
610const Event Event::AltP = Event::Special(
"\x1b""p");
611const Event Event::AltQ = Event::Special(
"\x1b""q");
612const Event Event::AltR = Event::Special(
"\x1b""r");
613const Event Event::AltS = Event::Special(
"\x1b""s");
614const Event Event::AltT = Event::Special(
"\x1b""t");
615const Event Event::AltU = Event::Special(
"\x1b""u");
616const Event Event::AltV = Event::Special(
"\x1b""v");
617const Event Event::AltW = Event::Special(
"\x1b""w");
618const Event Event::AltX = Event::Special(
"\x1b""x");
619const Event Event::AltY = Event::Special(
"\x1b""y");
620const Event Event::AltZ = Event::Special(
"\x1b""z");
622const Event Event::CtrlAltA = Event::Special(
"\x1b\x01");
623const Event Event::CtrlAltB = Event::Special(
"\x1b\x02");
624const Event Event::CtrlAltC = Event::Special(
"\x1b\x03");
625const Event Event::CtrlAltD = Event::Special(
"\x1b\x04");
626const Event Event::CtrlAltE = Event::Special(
"\x1b\x05");
627const Event Event::CtrlAltF = Event::Special(
"\x1b\x06");
628const Event Event::CtrlAltG = Event::Special(
"\x1b\x07");
629const Event Event::CtrlAltH = Event::Special(
"\x1b\x08");
630const Event Event::CtrlAltI = Event::Special(
"\x1b\x09");
631const Event Event::CtrlAltJ = Event::Special(
"\x1b\x0a");
632const Event Event::CtrlAltK = Event::Special(
"\x1b\x0b");
633const Event Event::CtrlAltL = Event::Special(
"\x1b\x0c");
634const Event Event::CtrlAltM = Event::Special(
"\x1b\x0d");
635const Event Event::CtrlAltN = Event::Special(
"\x1b\x0e");
636const Event Event::CtrlAltO = Event::Special(
"\x1b\x0f");
637const Event Event::CtrlAltP = Event::Special(
"\x1b\x10");
638const Event Event::CtrlAltQ = Event::Special(
"\x1b\x11");
639const Event Event::CtrlAltR = Event::Special(
"\x1b\x12");
640const Event Event::CtrlAltS = Event::Special(
"\x1b\x13");
641const Event Event::CtrlAltT = Event::Special(
"\x1b\x14");
642const Event Event::CtrlAltU = Event::Special(
"\x1b\x15");
643const Event Event::CtrlAltV = Event::Special(
"\x1b\x16");
644const Event Event::CtrlAltW = Event::Special(
"\x1b\x17");
645const Event Event::CtrlAltX = Event::Special(
"\x1b\x18");
646const Event Event::CtrlAltY = Event::Special(
"\x1b\x19");
647const Event Event::CtrlAltZ = Event::Special(
"\x1b\x1a");
The FTXUI ftxui:: namespace.