From: Laurent Mazet Date: Mon, 10 Mar 2025 22:29:05 +0000 (+0100) Subject: partial search in file list X-Git-Tag: v1.1~11 X-Git-Url: https://secure.softndesign.org/git/?a=commitdiff_plain;h=4da645db087c90a178a48edd63f4f25925586783;p=fm.git partial search in file list --- diff --git a/display.c b/display.c index 44275fa..f7041be 100644 --- 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); } } diff --git a/display.h b/display.h index 6b3cf14..caeb105 100644 --- 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 e1d2aaf..9fd6cba 100644 --- 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++;