diff -urN cui99/key.h cui100/key.h --- cui99/key.h Fri Jan 31 01:10:00 2014 +++ cui100/key.h Thu Apr 3 23:00:00 2014 @@ -3,10 +3,11 @@ #define CUI_KEY_ENTER 0x0d /* '\r' */ #define CUI_KEY_BS 0x08 /* '\b' */ -#define CUI_KEY_UP 0x11 /* DC1 */ -#define CUI_KEY_DOWN 0x12 /* DC2 */ -#define CUI_KEY_LEFT 0x13 /* DC3 */ -#define CUI_KEY_RIGHT 0x14 /* DC4 */ +#define CUI_KEY_CTRL(c) (0x01+(c)-'A') +#define CUI_KEY_UP CUI_KEY_CTRL('P') +#define CUI_KEY_DOWN CUI_KEY_CTRL('N') +#define CUI_KEY_LEFT CUI_KEY_CTRL('B') +#define CUI_KEY_RIGHT CUI_KEY_CTRL('F') #define CUI_KEY_ESC 0x1b void cui_key_enter(void); diff -urN cui99/term.c cui100/term.c --- cui99/term.c Wed Apr 2 00:00:00 2014 +++ cui100/term.c Thu Apr 3 23:00:00 2014 @@ -313,7 +313,7 @@ cui_term_putc_buf_inner(cui obj, char c) { cui_term p = (cui_term)obj; - int cx; + int cx, cy; char *bp; switch(c){ @@ -328,6 +328,16 @@ if(cx < obj->w) cui_term_move(obj, cx, p->cy); else cui_term_nl(obj); return; + case '\b': + cx = p->cx; + cy = p->cy; + if(cx > 0) cx--; + else if(cy > 0){ + cy--; + cx = obj->w - 1; + } + cui_term_move(obj, cx, cy); + return; } bp = cui_term_buf(obj, p->cx, p->cy); @@ -485,6 +495,7 @@ { cui_terminal p = (cui_terminal)obj; int evts; + char *cmd = "stty erase ^H\r"; cui_base_init(obj, parent, x, y, w, h); obj->flags |= CUI_FLG_CAN_FOCUS; @@ -497,6 +508,7 @@ p->rszbox = cui_rszbox_new(obj); boot_sh(obj); + if(write(p->pipe_w, cmd, strlen(cmd)) <0) ERR("write"); evts = CUI_EVT_DRAW|CUI_EVT_KEY|CUI_EVT_RESIZE|CUI_EVT_TIMER|CUI_EVT_READABLE; cui_bind(obj, evts, cui_terminal_hdr, NULL); @@ -543,7 +555,6 @@ return FALSE; } /* in_key_mode */ - if(val == CUI_KEY_ENTER) val = '\n'; if(write(p->pipe_w, &val, 1) != 1) ERR("write"); cui_timer_set(obj, TIMEOUT_MSEC, TRUE); return TRUE;