From 4df7fc8788d4b44515267db5226f412a7a2f894a Mon Sep 17 00:00:00 2001 From: Laurent MAZET Date: Thu, 9 Jan 2025 16:03:01 +0100 Subject: [PATCH] variable length field --- display.c | 52 +++++++++++++++++++++++++++++++++------------------- display.h | 2 +- fm.c | 2 +- 3 files changed, 35 insertions(+), 21 deletions(-) diff --git a/display.c b/display.c index 92b600e..95f4349 100644 --- a/display.c +++ b/display.c @@ -296,11 +296,12 @@ void elementwindow (window_t *win, char *status, int *index) set_color (white); } -char *getwindow (char *msg, window_t *win, int length) +char *getwindow (char *msg, window_t *win, int length, int size) { - char *name = (char *) calloc (1, length + 1); + int j; + char *name = (char *) calloc (1, size + 1); CHECKALLOC (name); - memset (name, ' ', length); + memset (name, ' ', size); int xoffset = win->xoffset + (win->xsize - strlen (msg) - 1 - length) / 2; if (xoffset < 1) { @@ -315,15 +316,17 @@ char *getwindow (char *msg, window_t *win, int length) mvaddch (yoffset, xoffset, ' '); xoffset++; set_color (byellow); - mvaddstr (yoffset, xoffset, name); + for (j = 0; (j < length) && (name[j] != '\0'); j++) { + mvaddch (yoffset, xoffset + j, name[j]); + } set_color (white); - int i = 0, j; + int i = 0, l = 0; int stop = 0; while (!stop) { - for (j = 0; j < length; j++) { + for (j = 0; (j < length) && (name[j + l] != '\0'); j++) { set_color ((j == i) ? yellow : byellow); - mvaddch (yoffset, xoffset + j, name[j]); + mvaddch (yoffset, xoffset + j, name[j + l]); set_color (white); } int ch = getch (); @@ -336,14 +339,25 @@ char *getwindow (char *msg, window_t *win, int length) case KEY_DELETE: case 127: case '\b': - name[i] = ' '; - i--; - break; + name[l + i] = ' '; + /* fallthrough */ case KEY_LEFT: i--; + if (i < 0) { + if (l > 0) { + l--; + } + i = 0; + } break; case KEY_RIGHT: i++; + if (i == length) { + if (l + i < size) { + l++; + } + i = length - 1; + } break; case KEY_ESC: free (name); @@ -352,22 +366,22 @@ char *getwindow (char *msg, window_t *win, int length) break; default: if ((ch >= 32) && ( ch < 128)) { - name[i] = ch; + name[l + i] = ch; i++; + if (i == length) { + if (l + i < size) { + l++; + } + i = length - 1; + } } } - - if (i < 0) { - i = 0; - } - if (i >= length) { - i = length - 1; - } + VERBOSE (DEBUG, fprintf (stderr, "i: %d l: %d\n", i, l)); } if (name) { VERBOSE (DEBUG, fprintf (stderr, "name: '%s'\n", name)); - for (j = length - 1; (j >= 0) && (name[j] == ' '); j--) { + for (j = size - 1; (j >= 0) && (name[j] == ' '); j--) { name[j] = '\0'; } for (i = 0; name[i] == ' '; i++); diff --git a/display.h b/display.h index d0c49e3..3176098 100644 --- a/display.h +++ b/display.h @@ -14,7 +14,7 @@ void displaywindow (window_t *win, list_t *list, int page, int *index_x, int *in void elementwindow (window_t *win, char *status, int *index); -char *getwindow (char *msg, window_t *win, int length); +char *getwindow (char *msg, window_t *win, int length, int size); void msgwindow (char *msg, int xoffset, int yoffset, int length); diff --git a/fm.c b/fm.c index 69d931d..511c48d 100644 --- a/fm.c +++ b/fm.c @@ -317,7 +317,7 @@ int main (int argc, char *argv[]) break; case ALT_(F): /* filter */ VERBOSE(DEBUG, fprintf (stderr, "ALT F\n")); - filter = getwindow ("Set filter", windir[pane], 16); + filter = getwindow ("Set filter", windir[pane], 8, 32); if (filter) { filterlist (list[pane], filter); free (filter); -- 2.30.2