terminal.h
1 #pragma once 2 3 #include <stddef.h> 4 #include <stdint.h> 5 6 namespace console { 7 8 //------------------------------------------ 9 // Key codes from ANSI escape parsing 10 //------------------------------------------ 11 enum class KeyCode { 12 None, 13 Backspace, 14 Delete, 15 Enter, 16 Tab, 17 Escape, 18 ArrowUp, 19 ArrowDown, 20 ArrowLeft, 21 ArrowRight, 22 Home, 23 End, 24 CtrlA, // home 25 CtrlB, // left 26 CtrlC, // interrupt 27 CtrlD, // delete / EOF 28 CtrlE, // end 29 CtrlF, // right 30 CtrlK, // kill to end of line 31 CtrlL, // clear screen 32 CtrlN, // history next 33 CtrlP, // history previous 34 CtrlR, // redraw line 35 CtrlT, // swap chars 36 CtrlU, // kill line 37 CtrlW, // delete word 38 Char, 39 }; 40 41 //------------------------------------------ 42 // Events from key handling 43 //------------------------------------------ 44 enum class TerminalEvent { 45 None, 46 BufferChanged, 47 CursorMoved, 48 CursorHome, 49 CursorEnd, 50 CommandReady, 51 EmptyCommand, 52 Interrupt, 53 EndOfFile, 54 HistoryPrevious, 55 HistoryNext, 56 ClearScreen, 57 DeleteWord, 58 KillToEnd, 59 ClearLine, 60 SwapChars, 61 Redraw, 62 }; 63 64 //------------------------------------------ 65 // Terminal — line buffer with ANSI parsing 66 //------------------------------------------ 67 class Terminal { 68 public: 69 Terminal(char *buf, size_t cap); 70 71 KeyCode process_byte(uint8_t byte); 72 TerminalEvent handle_key(KeyCode key, uint8_t ch = 0); 73 74 const char *buffer_str() const; 75 size_t buffer_length() const; 76 size_t cursor_position() const; 77 78 void set_buffer(const char *content); 79 void clear_buffer(); 80 const char *take_command(); 81 82 private: 83 char *buf_; 84 size_t cap_; 85 size_t len_; 86 size_t cursor_; 87 uint8_t last_char_; 88 89 enum EscapeState { Normal, Escape, Bracket } escape_state_; 90 }; 91 92 }