partial search in file list
authorLaurent Mazet <mazet@softndesign.org>
Mon, 10 Mar 2025 22:29:05 +0000 (23:29 +0100)
committerLaurent Mazet <mazet@softndesign.org>
Mon, 10 Mar 2025 22:29:05 +0000 (23:29 +0100)
display.c
display.h
fm.c

index 44275faf421045a17d40f7145d14a8809fbe22de..f7041bea5ab9fb6acc30657e9e1a65df08b0fa1c 100644 (file)
--- a/display.c
+++ b/display.c
@@ -191,7 +191,7 @@ void menuwindow (window_t *win, char *menu, int *index)
     set_color (white);
 }
 
-void displaywindow (window_t *win, list_t *list, int page, int *index_x, int *index_y, int *index_f)
+void displaywindow (window_t *win, list_t *list, int page, int *index_x, int *index_y, int *index_f, char *search)
 {
     int i, j;
 
@@ -233,6 +233,7 @@ void displaywindow (window_t *win, list_t *list, int page, int *index_x, int *in
     }
 
     int maxpos = 0;
+    int slen = (search) ? strlen (search) : 0;
     for (i = j = 0; i < list->nb; i++, j++) {
         if ((j + 1 ) % n == 0) {
             if (rem > 0) {
@@ -283,22 +284,48 @@ void displaywindow (window_t *win, list_t *list, int page, int *index_x, int *in
                 attron (A_UNDERLINE);
             }
 
-            if ((int)strlen (elem->name) <= win->width) {
-                mvaddstr (win->yoffset + (j % n) - page, win->xoffset + (j / n) * win->width, elem->name);
+            int len = strlen (elem->name);
+            if (len <= win->width) {
+                int highlight = 0;
+                int k;
+                for (k = 0; k < len; k++) {
+                    if ((slen) && (strncmp (elem->name + k, search, slen) == 0)) {
+                        highlight = slen;
+                    }
+                    if (highlight) {
+                        attron (A_BOLD);
+                    }
+                    mvaddch (win->yoffset + (j % n) - page, win->xoffset + (j / n) * win->width + k, elem->name[k]);
+                    if (highlight) {
+                        attroff (A_BOLD);
+                        highlight--;
+                    }
+                }
             } else {
-                int pos = ((int)strlen (elem->name) - _index_f < win->width) ? (int)strlen (elem->name) - win->width : _index_f;
+                int highlight = 0;
+                int pos = (len - _index_f < win->width) ? len - win->width : _index_f;
                 if (maxpos < pos) {
                     maxpos = pos;
                 }
                 int k;
                 for (k = 0; k < win->width; k++) {
+                    if ((slen) && (strncmp (elem->name + k + pos, search, slen) == 0)) {
+                        highlight = slen;
+                    }
+                    if (highlight) {
+                        attron (A_BOLD);
+                    }
                     mvaddch (win->yoffset + (j % n) - page, win->xoffset + k, elem->name[k + pos]);
+                    if (highlight) {
+                        attroff (A_BOLD);
+                        highlight--;
+                    }
                 }
                 set_color (blue);
                 if (pos > 0) {
                     mvaddch (win->yoffset + (j % n) - page, win->xoffset, ACS_LARROW);
                 }
-                if ((int)strlen (elem->name) - pos > win->width) {
+                if (len - pos > win->width) {
                     mvaddch (win->yoffset + (j % n) - page, win->xoffset + win->width - 1, ACS_RARROW);
                 }
             }
index 6b3cf14ed18f151a6a2b3b68617e48fb21760212..caeb1054c0a5dc53ff9cc3c6e901fb57e8af4c88 100644 (file)
--- a/display.h
+++ b/display.h
@@ -7,7 +7,7 @@ int helpwindow (char *msg, int xoffset, int yoffset);
 
 void menuwindow (window_t *win, char *status, int *index);
 
-void displaywindow (window_t *win, list_t *list, int page, int *index_x, int *index_y, int *index);
+void displaywindow (window_t *win, list_t *list, int page, int *index_x, int *index_y, int *index, char *search);
 
 void elementwindow (window_t *win, char *status, int *index);
 
diff --git a/fm.c b/fm.c
index e1d2aaf510b2a9ae42118f95b4aaec9f6badefb2..9fd6cba7eb26b066b0db1c5671a365058723292b 100644 (file)
--- a/fm.c
+++ b/fm.c
@@ -193,6 +193,8 @@ int main (int argc, char *argv[])
 
     /* event loop */
     int stop = 0;
+    int mode = 0;
+    char *search[2] = {0};
     while (!stop) {
         int len = 0;
         elem_t *current  = NULL;
@@ -222,7 +224,7 @@ int main (int argc, char *argv[])
             }
 
             /* display panel */
-            displaywindow (windir[i], list[i], page[i], &index_x[i], &index_y[i], &index_f[i]);
+            displaywindow (windir[i], list[i], page[i], &index_x[i], &index_y[i], &index_f[i], search[i]);
 
             /* display info */
             current  = list[i]->tab + windir[i]->index;
@@ -235,6 +237,38 @@ int main (int argc, char *argv[])
         }
 
         int ch = getch ();
+
+        /* search mode */
+        if (mode) {
+            int len = (search[panel]) ? strlen (search[panel]) : 0;
+            switch (ch) {
+            case KEY_ESC:
+            case '\n':
+            case '\t':
+            case '\r':
+                mode = 0;
+                free (search[panel]);
+                search[panel] = NULL;
+                break;
+            case KEY_BACKSPACE:
+            case KEY_DELETE:
+            case 127:
+            case '\b':
+                if (len) {
+                    search[panel][len - 1] = '\0';
+                }
+                break;
+            default:
+                search[panel] = (char *) realloc (search[panel], len + 2);
+                CHECKALLOC (search[panel]);
+                search[panel][len] = ch;
+                search[panel][len + 1] = 0;
+                break;
+            }
+            continue;
+        }
+
+        /* command mode */
         switch (ch) {
         case '\n':
         case '\r':
@@ -326,6 +360,10 @@ int main (int argc, char *argv[])
                 index_x[panel]++;
             }
             break;
+        case '/':
+        case 'f':
+            mode = 1;
+            break;
         case 'o':
             index_f[panel]++;
             index_m++;