#pragma once #include #include class Terminal { public: void run(); uint32_t cols() const { return m_window->width() / m_font.width(); } uint32_t rows() const { return m_window->height() / m_font.height(); } private: void handle_csi(char ch); void handle_sgr(); void putchar(uint32_t codepoint); bool read_shell(int fd); void on_key_event(LibGUI::EventPacket::KeyEvent); void start_shell(); private: struct Cursor { uint32_t x; uint32_t y; }; struct ShellInfo { int in; int out; int err; pid_t pid; }; enum class State { Normal, ESC, CSI, }; struct CSIInfo { int32_t fields[2]; size_t index; }; private: BAN::UniqPtr m_window; LibFont::Font m_font; Cursor m_cursor { 0, 0 }; ShellInfo m_shell_info; State m_state { State::Normal }; CSIInfo m_csi_info; Cursor m_saved_cursor { 0, 0 }; uint32_t m_fg_color { 0xFFFFFF }; uint32_t m_bg_color { 0x000000 }; };