diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/edbox.c | 43 |
1 files changed, 38 insertions, 5 deletions
diff --git a/src/edbox.c b/src/edbox.c index bcc41a4..d5728c2 100644 --- a/src/edbox.c +++ b/src/edbox.c @@ -9,6 +9,9 @@ /* TODO: tab completion */ +char *old_edbox[EDBOX_SIZE]; +static u16 old_len; + int edbox_visible = 0; static u16 edbox_pos; /* range 0 to EDBOX_SIZE - 1 */ u16 edbox_len; /* idem */ @@ -72,6 +75,20 @@ void edbox_putc(char c) { } } +static void copy_to_old(void) { + if(!edbox_len) return; + memcpy(old_edbox, edit_box, edbox_len); + memset(old_edbox + edbox_len, 0, (EDBOX_SIZE - 1) - edbox_len); + old_len = edbox_len; +} + +static void restore_old(void) { + edbox_clear(); + hide_cursor(); + memcpy(edit_box, old_edbox, old_len); + edbox_pos = edbox_len = old_len; +} + static void fake_keystroke(char c) { keyclick(); OS.ch = 0xff; @@ -95,6 +112,24 @@ static void backspace(void) { del_char(); } +static void up(void) { + if(!edbox_len) { + restore_old(); + } else { + if(edbox_pos > 39) + edbox_pos -= 40; + else + edbox_pos = 0; + } +} + +static void down(void) { + if(edbox_pos > 199) return; + edbox_pos += 40; + if(edbox_pos > edbox_len) + edbox_pos = edbox_len; +} + static void word_left(char del) { if(!edbox_pos) return; if(!del) edbox_pos--; @@ -140,6 +175,7 @@ static void normal_keystroke(void) { switch(c) { case CH_EOL: // hide_cursor(); // already done by the caller + copy_to_old(); edbox_hide(); if(edbox_callback) (*edbox_callback)(); @@ -176,13 +212,10 @@ static void normal_keystroke(void) { if(edbox_pos < edbox_len) edbox_pos++; break; case CH_CURS_UP: - if(edbox_pos > 39) edbox_pos -= 40; + up(); break; case CH_CURS_DOWN: - if(edbox_pos < edbox_len - 40) - edbox_pos += 40; - else - edbox_pos = edbox_len; + down(); break; case CH_DELCHR: del_char(); |
