diff --git a/src/vte.c b/src/vte.c index 7ebf164..e09677e 100644 --- a/src/vte.c +++ b/src/vte.c @@ -115,11 +115,75 @@ void kmscon_vte_bind(struct kmscon_vte *vte, struct kmscon_console *con) kmscon_console_ref(vte->con); } +static void parse_control(struct kmscon_vte *vte, uint32_t ctrl) +{ + switch (ctrl) { + case 0x00: /* NUL */ + /* Ignore on input */ + break; + case 0x05: /* ENQ */ + /* Transmit answerback message */ + break; + case 0x07: /* BEL */ + /* Sound bell tone */ + break; + case 0x08: /* BS */ + /* Move cursor one position left */ + break; + case 0x09: /* HT */ + /* Move to next tab stop or end of line */ + break; + case 0x0a: /* LF */ + case 0x0b: /* VT */ + case 0x0c: /* FF */ + /* Line feed or newline (CR/NL mode) */ + kmscon_console_newline(vte->con); + break; + case 0x0d: /* CR */ + /* Move cursor to left margin */ + break; + case 0x0e: /* SO */ + /* Invoke G1 character set */ + break; + case 0x0f: /* SI */ + /* Select G0 character set */ + break; + case 0x11: /* XON */ + /* Resume transmission */ + break; + case 0x13: /* XOFF */ + /* Stop transmission */ + break; + case 0x18: /* CAN */ + case 0x1a: /* SUB */ + /* Discard current escape sequence and show err-sym */ + break; + case 0x1b: /* ESC */ + /* Invokes an escape sequence */ + break; + case 0x7f: /* DEL */ + /* Ignored on input */ + break; + } +} + +static void parse_input(struct kmscon_vte *vte, uint32_t val) +{ + kmscon_symbol_t sym; + + if (val < 0x20) { + parse_control(vte, val); + return; + } + + sym = kmscon_symbol_make(val); + kmscon_console_write(vte->con, sym); +} + void kmscon_vte_input(struct kmscon_vte *vte, const char *u8, size_t len) { int state, i; uint32_t ucs4; - kmscon_symbol_t sym; if (!vte || !vte->con) return; @@ -129,12 +193,7 @@ void kmscon_vte_input(struct kmscon_vte *vte, const char *u8, size_t len) if (state == KMSCON_UTF8_ACCEPT || state == KMSCON_UTF8_REJECT) { ucs4 = kmscon_utf8_mach_get(vte->mach); - if (ucs4 == '\n') { - kmscon_console_newline(vte->con); - } else { - sym = kmscon_symbol_make(ucs4); - kmscon_console_write(vte->con, sym); - } + parse_input(vte, ucs4); } } }