From 60152f27427c648293d0eff43f924bd800ec7dd0 Mon Sep 17 00:00:00 2001 From: Laurent Mazet Date: Wed, 22 Jan 2025 00:13:39 +0100 Subject: [PATCH] better management of long file names --- display.c | 32 ++++++++++++++++++++++++++++---- display.h | 2 +- fm.c | 24 +++++++++++++++--------- 3 files changed, 44 insertions(+), 14 deletions(-) diff --git a/display.c b/display.c index f6d543d..a8bf95e 100644 --- a/display.c +++ b/display.c @@ -187,7 +187,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) +void displaywindow (window_t *win, list_t *list, int page, int *index_x, int *index_y, int *index_f) { int i, j; @@ -205,6 +205,7 @@ void displaywindow (window_t *win, list_t *list, int page, int *index_x, int *in int _index_x = (index_x) ? *index_x : 0; int _index_y = (index_y) ? *index_y : 0; + int _index_f = (index_f) ? *index_f : 0; if ((page + _index_y == n - 1) && (_index_x > rem - 1)) { _index_x = rem - 1; } @@ -215,6 +216,9 @@ void displaywindow (window_t *win, list_t *list, int page, int *index_x, int *in if (index_y) { *index_y = _index_y; } + if (_index_f < 0) { + _index_f = 0; + } VERBOSE (DEBUG, fprintf (stderr, "index: %d\n", index)); set_color (white); @@ -224,6 +228,7 @@ void displaywindow (window_t *win, list_t *list, int page, int *index_x, int *in } } + int maxpos = 0; for (i = j = 0; i < list->nb; i++, j++) { if ((j + 1 ) % n == 0) { if (rem > 0) { @@ -273,9 +278,25 @@ void displaywindow (window_t *win, list_t *list, int page, int *index_x, int *in attron (A_BOLD); attron (A_UNDERLINE); } - int k; - for (k = 0; (k < win->width) && (elem->name[k] != '\0'); k++) { - mvaddch (win->yoffset + (j % n) - page, win->xoffset + (j / n) * win->width + k, elem->name[k]); + + if ((int)strlen (elem->name) <= win->width) { + mvaddstr (win->yoffset + (j % n) - page, win->xoffset + (j / n) * win->width, elem->name); + } else { + int pos = ((int)strlen (elem->name) - _index_f < win->width) ? (int)strlen (elem->name) - win->width : _index_f; + if (maxpos < pos) { + maxpos = pos; + } + int k; + for (k = 0; k < win->width; k++) { + mvaddch (win->yoffset + (j % n) - page, win->xoffset + k, elem->name[k + pos]); + } + set_color (blue); + if (pos > 0) { + mvaddch (win->yoffset + (j % n) - page, win->xoffset, ACS_LARROW); + } + if ((int)strlen (elem->name) - pos > win->width) { + mvaddch (win->yoffset + (j % n) - page, win->xoffset + win->width - 1, ACS_RARROW); + } } set_color (white); attron (0); @@ -284,6 +305,9 @@ void displaywindow (window_t *win, list_t *list, int page, int *index_x, int *in } } } + if (index_f) { + *index_f = maxpos; + } set_color (win->active ? black : white); _dobound (win->xsize, win->ysize, win->xoffset, win->yoffset); diff --git a/display.h b/display.h index fe438a0..6b3cf14 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); +void displaywindow (window_t *win, list_t *list, int page, int *index_x, int *index_y, int *index); void elementwindow (window_t *win, char *status, int *index); diff --git a/fm.c b/fm.c index 801d339..e7275c3 100644 --- a/fm.c +++ b/fm.c @@ -183,8 +183,9 @@ int main (int argc, char *argv[]) winelem[i]->ysize = 1; } - int index_menu = 0; - int index[MAXPANELS] = {0}; + int index_m = 0; + int index_f[MAXPANELS] = {0}; + int index_s[MAXPANELS] = {0}; int index_x[MAXPANELS] = {0}; int index_y[MAXPANELS] = {0}; list_t *list[MAXPANELS] = {0}; @@ -197,7 +198,7 @@ int main (int argc, char *argv[]) elem_t *current = NULL; char *string = NULL; - menuwindow (winmenu, menu, &index_menu); + menuwindow (winmenu, menu, &index_m); /* display panels */ for (i = 0; i < MAXPANELS; i++) { @@ -220,7 +221,7 @@ int main (int argc, char *argv[]) } /* display panel */ - displaywindow (windir[i], list[i], page[i], &index_x[i], &index_y[i]); + displaywindow (windir[i], list[i], page[i], &index_x[i], &index_y[i], &index_f[i]); /* display info */ current = list[i]->tab + windir[i]->index; @@ -229,7 +230,7 @@ int main (int argc, char *argv[]) } char status[MAXSTATUS] = {0}; createstatus (status, current); - elementwindow (winelem[i], status, index + i); + elementwindow (winelem[i], status, index_s + i); } int ch = getch (); @@ -270,7 +271,7 @@ int main (int argc, char *argv[]) free (msg); } free (src); - menuwindow (winmenu, menu, &index_menu); + menuwindow (winmenu, menu, &index_m); } break; case '\t': @@ -325,10 +326,14 @@ int main (int argc, char *argv[]) } break; case 'o': - index[panel]++; + index_f[panel]++; + index_m++; + index_s[panel]++; break; case 'u': - index[panel]--; + index_f[panel]--; + index_m--; + index_s[panel]--; break; #ifndef PDCURSES case KEY_ESC: @@ -475,7 +480,7 @@ int main (int argc, char *argv[]) free (msg); } free (src); - menuwindow (winmenu, menu, &index_menu); + menuwindow (winmenu, menu, &index_m); } break; case ALT_X: /* chmod */ @@ -548,6 +553,7 @@ int main (int argc, char *argv[]) /* test: { sleep 1; echo -n KKKKK; sleep 1; echo -n IIIII; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe -d /dev -d . */ /* test: { sleep 1; for i in $(seq 1 50); do echo -n k; done; sleep 1; for i in $(seq 1 60); do echo -n i; done; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe -d /dev -d . */ /* test: { sleep 1; echo -n kkkkkkkkk; sleep 1; echo -n ooo; sleep 1; echo -n uu; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe -x 60 -y 20 */ +/* test: touch .this_is_a_very_long_file_name && { sleep 1; echo -n ooo; sleep 1; echo -n u; sleep 1; echo -n uu; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe -x 60 -y 20 && rm .this_is_a_very_long_file_name */ /* Filter and selection */ /* test: { sleep 1; echo -en '\ef'; sleep 1; echo -n ' .*\.c'; sleep 1; echo; sleep 1; echo -en 'kkk\esl'; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe */ -- 2.30.2