aboutsummaryrefslogtreecommitdiff
path: root/src/edbox.c
diff options
context:
space:
mode:
authorB. Watson <urchlay@slackware.uk>2026-03-19 04:18:27 -0400
committerB. Watson <urchlay@slackware.uk>2026-03-19 04:18:27 -0400
commitdf6181a60dcff1badefaefc1d3148d0dc9246739 (patch)
treef9d23dd32bfaced27a7d198281f8f5ec55a150e8 /src/edbox.c
parentdeb43e8268b7fff9d91bc03fd832e6c2eadee524 (diff)
downloadfujinet-chat-df6181a60dcff1badefaefc1d3148d0dc9246739.tar.gz
Fix bug: cursor down could go past edbox_len.
Diffstat (limited to 'src/edbox.c')
-rw-r--r--src/edbox.c43
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();