diff options
Diffstat (limited to 'src/edbox.c')
| -rw-r--r-- | src/edbox.c | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/src/edbox.c b/src/edbox.c new file mode 100644 index 0000000..f1c77d1 --- /dev/null +++ b/src/edbox.c @@ -0,0 +1,138 @@ +#include <atari.h> +#include <conio.h> +#include <string.h> +#include "addrs.h" +#include "screen.h" +#include "edbox.h" + +/* TODO: tab completion */ + +// static int edbox_visible = 0; /* don't think we'll ever need it */ +static u16 edbox_pos; /* range 0 to EDBOX_SIZE - 1 */ + +void (*edbox_callback)(void); + +static void hide_cursor(void) { + edit_box[edbox_pos] &= 0x7f; +} + +static void show_cursor(void) { + edit_box[edbox_pos] |= 0x80; +} + +void edbox_clear(void) { + memset(edit_box, 0, EDBOX_SIZE); + edbox_pos = 0; + show_cursor(); +} + +void edbox_show(void) { + u16 addr; + + if(edbox_pos < 80) + addr = (u16)edit_box; + else + addr = (u16)edit_box + edbox_pos - 79; + + scr_waitvcount(116); + + *dlist_bottom_lms = addr; +} + +void edbox_hide(void) { + scr_refresh(); +} + +void edbox_putc(char c) { + if(!c) + return; /* no inserting nulls */ + if((c != CH_EOL) && (edbox_pos == EDBOX_SIZE - 1)) + return; + edit_box[edbox_pos++] = c; + edbox_show(); +} + +static void special_keystroke(char c) { + OS.ch = 0xff; + edbox_putc(c); +} + +static void backspace(void) { + if(!edbox_pos) return; + edit_box[--edbox_pos] = 0; + edbox_show(); +} + +static void del_word(void) { +} + +static void normal_keystroke(void) { + char c; + + c = cgetc(); + + switch(c) { + case CH_EOL: + edbox_putc(c); + if(edbox_callback) + (*edbox_callback)(); + /* fall thru */ + case CH_CLR: + edbox_hide(); + /* fall thru */ + case CH_DELLINE: + case 0x15: /* ^U */ + edbox_clear(); + break; + case CH_DEL: + backspace(); + break; + case 0x17: /* ^W */ + del_word(); + break; + default: + edbox_putc(c); + break; + } +} + +void edbox_keystroke(void) { + char c; + + hide_cursor(); + edbox_show(); + + OS.invflg = c = 0; + + /* XXX: these keys don't click. */ + switch(OS.ch) { + case 0xa0: /* key: ctrl [ */ + c = 0x7b; /* ascii: { */ + break; + case 0xa2: /* key: ctrl ] */ + c = 0x7d; /* ascii: } */ + break; + case 0x1c: /* key: ESC */ + c = 0x60; /* ascii: ` */ + break; + case 0x5c: /* key: shift ESC */ + case 0x9c: /* key: ctrl ESC */ + c = 0x7e; /* ascii: ~ */ + break; + case 0x27: /* atari key */ + case 0x67: /* ...w/shift */ + case 0x97: /* ...w/ctrl */ + return; /* ignore it! */ + break; + default: + break; + } + + if(c) { + special_keystroke(c); + } else { + normal_keystroke(); + } + + show_cursor(); +} |
