diff options
| author | Anders Betts <anders.betts@gmail.com> | 2026-09-19 23:17:45 +0200 |
|---|---|---|
| committer | Anders Betts <anders.betts@gmail.com> | 2026-09-19 23:17:45 +0200 |
| commit | 985ae80d7f82cef7c273fae953c73f8bd909ebef (patch) | |
| tree | 18d4305e2bdd6f0069f431f2dce04a446ef216f2 /clients/tui.c | |
| parent | 8da6a7e849513e1cb63410d95b121df729260d0c (diff) | |
| download | bokf-985ae80d7f82cef7c273fae953c73f8bd909ebef.tar.gz bokf-985ae80d7f82cef7c273fae953c73f8bd909ebef.zip | |
tui: backspace deletes backwards while editing; esc restores the valuev0.1.41
Diffstat (limited to 'clients/tui.c')
| -rw-r--r-- | clients/tui.c | 43 |
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) |
