better management of long file names
authorLaurent Mazet <mazet@softndesign.org>
Tue, 21 Jan 2025 23:13:39 +0000 (00:13 +0100)
committerLaurent Mazet <mazet@softndesign.org>
Tue, 21 Jan 2025 23:13:39 +0000 (00:13 +0100)
display.c
display.h
fm.c

index f6d543d9ab1fc13adba9940c304591a3f1e190a4..a8bf95e228fd1f7c38a5234c01ef5629a00c2b50 100644 (file)
--- 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);
index fe438a082d37cd01c8375ce18b6ca335a6c37dad..6b3cf14ed18f151a6a2b3b68617e48fb21760212 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);
+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 801d339da48c8c373181be82e13d9e09c1e2022a..e7275c3901b9c6cec0f61eb722795b3505f4224b 100644 (file)
--- 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 */