aboutsummaryrefslogtreecommitdiff
path: root/clients
diff options
context:
space:
mode:
authorAnders Betts <anders.betts@gmail.com>2026-09-19 23:17:45 +0200
committerAnders Betts <anders.betts@gmail.com>2026-09-19 23:17:45 +0200
commit985ae80d7f82cef7c273fae953c73f8bd909ebef (patch)
tree18d4305e2bdd6f0069f431f2dce04a446ef216f2 /clients
parent8da6a7e849513e1cb63410d95b121df729260d0c (diff)
downloadbokf-985ae80d7f82cef7c273fae953c73f8bd909ebef.tar.gz
bokf-985ae80d7f82cef7c273fae953c73f8bd909ebef.zip
tui: backspace deletes backwards while editing; esc restores the valuev0.1.41
Diffstat (limited to 'clients')
-rw-r--r--clients/tui.c43
1 files changed, 24 insertions, 19 deletions
diff --git a/clients/tui.c b/clients/tui.c
index 473cc0e..8f410c2 100644
--- a/clients/tui.c
+++ b/clients/tui.c
@@ -306,8 +306,7 @@ int tui_date_field_edit(char *buf, size_t cap, size_t *pos, int ch,
}
if (*fresh) {
- int editing = ch == KEY_BACKSPACE || ch == 127 || ch == 8 ||
- ch == KEY_DC || (ch >= '0' && ch <= '9');
+ int editing = ch >= '0' && ch <= '9';
int moving = ch == KEY_LEFT || ch == KEY_RIGHT || ch == KEY_HOME ||
ch == KEY_END || ch == 1 || ch == 5;
if (editing || moving) {
@@ -394,8 +393,7 @@ int tui_field_edit(char *buf, size_t cap, size_t *pos, int ch, int *fresh)
if (*pos != (size_t)-1 && *pos <= e.len)
e.pos = *pos;
if (*fresh) {
- int editing = ch == KEY_BACKSPACE || ch == 127 || ch == 8 ||
- ch == KEY_DC || (ch >= 32 && ch < 256);
+ int editing = ch >= 32 && ch < 256;
int moving = ch == KEY_LEFT || ch == KEY_RIGHT || ch == KEY_HOME ||
ch == KEY_END || ch == 1 || ch == 5;
if (editing || moving) {
@@ -705,8 +703,9 @@ int tui_confirm(const char *title, const char *fmt, ...)
int tui_prompt_into(char *buf, size_t cap, const char *label,
const char *def, int mask)
{
- if (def && def != buf)
- snprintf(buf, cap, "%s", def);
+ char scratch[512];
+ size_t scap = cap < sizeof scratch ? cap : sizeof scratch;
+ snprintf(scratch, scap, "%s", def ? def : buf);
int y = LINES - 3;
move(y, 2);
@@ -716,16 +715,19 @@ int tui_prompt_into(char *buf, size_t cap, const char *label,
tui_style_reset();
refresh();
int prev = curs_set(1);
- int rc = tui_edit_field(y, (int)strlen(label) + 3, buf, cap, mask);
+ int rc = tui_edit_field(y, (int)strlen(label) + 3, scratch, scap, mask);
curs_set(prev == ERR ? 0 : prev);
+ if (rc != 0)
+ snprintf(buf, cap, "%s", scratch);
return rc != 0;
}
int tui_date_prompt_into(char *buf, size_t cap, const char *label,
const char *def)
{
- if (def && def != buf)
- snprintf(buf, cap, "%s", def);
+ char scratch[16];
+ size_t scap = cap < sizeof scratch ? cap : sizeof scratch;
+ snprintf(scratch, scap, "%s", def ? def : buf);
int y = LINES - 3;
move(y, 2);
@@ -736,26 +738,29 @@ int tui_date_prompt_into(char *buf, size_t cap, const char *label,
size_t pos = (size_t)-1;
int fresh = 1;
int prev = curs_set(1);
+ int rc = 0;
for (;;) {
move(y, (int)strlen(label) + 3);
clrtoeol();
- addnstr(buf, (int)cap);
+ addnstr(scratch, (int)scap);
clrtoeol();
- size_t slen = strlen(buf);
+ size_t slen = strlen(scratch);
size_t cp = pos == (size_t)-1 || pos > slen ? slen : pos;
- move(y, (int)strlen(label) + 3 + (int)tui_disp_width_n(buf, cp));
+ move(y, (int)strlen(label) + 3 + (int)tui_disp_width_n(scratch, cp));
refresh();
int ch = in_key();
if (ch == '\n' || ch == '\r' || ch == KEY_ENTER) {
- curs_set(prev == ERR ? 0 : prev);
- return 1;
- }
- if (ch == 27) {
- curs_set(prev == ERR ? 0 : prev);
- return 0;
+ rc = 1;
+ break;
}
- tui_date_field_edit(buf, cap, &pos, ch, &fresh);
+ if (ch == 27)
+ break;
+ tui_date_field_edit(scratch, scap, &pos, ch, &fresh);
}
+ curs_set(prev == ERR ? 0 : prev);
+ if (rc)
+ snprintf(buf, cap, "%s", scratch);
+ return rc;
}
int tui_amount_prompt_into(int64_t *out, const char *label, int64_t def_ore)