variable length field
authorLaurent MAZET <laurent.mazet@thalesgroup.com>
Thu, 9 Jan 2025 15:03:01 +0000 (16:03 +0100)
committerLaurent MAZET <laurent.mazet@thalesgroup.com>
Thu, 9 Jan 2025 15:03:01 +0000 (16:03 +0100)
display.c
display.h
fm.c

index 92b600e9bf7fcecc49ffffd7c1b54f028ece4dc4..95f4349b06a745d44cc2cc7329cea14d4bb48a0a 100644 (file)
--- 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++);
index d0c49e36220af2c6e16a58ff62fc8306509542ae..31760980f8277a8ab8c9b735c4b367dba6bbde71 100644 (file)
--- 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 69d931d66fc8332865c137b16d2c720ae8bf3ed9..511c48d18024a98bac8774f2a0c9afe5f88bb368 100644 (file)
--- 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);