// Copyright 2020 Arthur Sonzogni. All rights reserved. // Use of this source code is governed by the MIT license that can be found in // the LICENSE file. #ifndef FTXUI_COMPONENT_EVENT_HPP #define FTXUI_COMPONENT_EVENT_HPP #include // for Mouse #include #include // for string, operator== #include namespace ftxui { class ScreenInteractive; class ComponentBase; /// @brief Represent an event. It can be key press event, a terminal resize, or /// more ... /// /// For example: /// - Printable character can be created using Event::Character('a'). /// - Some special are predefined, like Event::ArrowLeft. /// - One can find arbitrary code for special Events using: /// ./example/util/print_key_press /// For instance, CTLR+A maps to Event::Special({1}); /// /// Useful documentation about xterm specification: /// https://invisible-island.net/xterm/ctlseqs/ctlseqs.html struct Event { // --- Constructor section --------------------------------------------------- static Event Character(std::string); static Event Character(char); static Event Character(wchar_t); static Event Special(std::string); static Event Mouse(std::string, Mouse mouse); static Event CursorPosition(std::string, int x, int y); // Internal static Event CursorShape(std::string, int shape); // Internal // --- Arrow --- static const Event ArrowLeft; static const Event ArrowRight; static const Event ArrowUp; static const Event ArrowDown; static const Event ArrowLeftCtrl; static const Event ArrowRightCtrl; static const Event ArrowUpCtrl; static const Event ArrowDownCtrl; // --- Other --- static const Event Backspace; static const Event Delete; static const Event Return; static const Event Escape; static const Event Tab; static const Event TabReverse; static const Event F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12; static const Event Insert; static const Event Home; static const Event End; static const Event PageUp; static const Event PageDown; // --- Custom --- static const Event Custom; //--- Method section --------------------------------------------------------- bool operator==(const Event& other) const { return input_ == other.input_; } bool operator!=(const Event& other) const { return !operator==(other); } const std::string& input() const { return input_; } bool is_character() const { return type_ == Type::Character; } std::string character() const { return input_; } bool is_mouse() const { return type_ == Type::Mouse; } struct Mouse& mouse() { return data_.mouse; } // --- Internal Method section ----------------------------------------------- bool is_cursor_position() const { return type_ == Type::CursorPosition; } int cursor_x() const { return data_.cursor.x; } int cursor_y() const { return data_.cursor.y; } bool is_cursor_shape() const { return type_ == Type::CursorShape; } int cursor_shape() const { return data_.cursor_shape; } //--- State section ---------------------------------------------------------- ScreenInteractive* screen_ = nullptr; private: friend ComponentBase; friend ScreenInteractive; enum class Type { Unknown, Character, Mouse, CursorPosition, CursorShape, }; Type type_ = Type::Unknown; struct Cursor { int x = 0; int y = 0; }; union { struct Mouse mouse; struct Cursor cursor; int cursor_shape; } data_ = {}; std::string input_; }; } // namespace ftxui #endif /* end of include guard: FTXUI_COMPONENT_EVENT_HPP */