solve issue on last line
authorLaurent Mazet <mazet@softndesign.org>
Thu, 2 Jan 2025 22:00:40 +0000 (23:00 +0100)
committerLaurent Mazet <mazet@softndesign.org>
Thu, 2 Jan 2025 22:00:40 +0000 (23:00 +0100)
display.c
display.h
fm.c
type.h

index ec9322a14a25a038aa97096be3b15cd23cb0278d..01b822211459b3b45c5d8e40d740af8666c6f244 100644 (file)
--- a/display.c
+++ b/display.c
@@ -117,22 +117,24 @@ int helpwindow (char *msg, int xoffset, int yoffset)
     return j;
 }
 
-int 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 i, j;
 
-    int nbcols = win->xsize / (list->width + 1);
-    VERBOSE (DEBUG, fprintf (stderr, "nbcols: %d\n", nbcols));
-    int width = win->xsize / nbcols;
-    VERBOSE (DEBUG, fprintf (stderr, "width: %d\n", width));
-    int n = (list->nb + nbcols - 1) / nbcols;
-    VERBOSE (DEBUG, fprintf (stderr, "n: %d\n", n));
-    int rem = list->nb - nbcols * (list->nb / nbcols);
+    win->nbcols = win->xsize / (list->width + 1);
+    win->width = win->xsize / win->nbcols;
+    int n = (list->nb + win->nbcols - 1) / win->nbcols;
+    int rem = list->nb - win->nbcols * (list->nb / win->nbcols);
     if (rem == 0) {
-        rem = nbcols;
+        rem = win->nbcols;
     }
     VERBOSE (DEBUG, fprintf (stderr, "rem: %d\n", rem));
-    int index = page + index_y + n * index_x;
+
+    if ((page + *index_y == n - 1) && (*index_x > rem - 1)) {
+        *index_x = rem - 1;
+    }
+    int index = page + *index_y + n * *index_x;
+    VERBOSE (DEBUG, fprintf (stderr, "index: %d\n", index));
 
     for (i = j = 0; i < list->nb; i++, j++) {
         if ((j + 1 ) % n == 0) {
@@ -170,7 +172,7 @@ int displaywindow (window_t *win, list_t *list, int page, int index_x, int index
                set_color ((j == index) ? bred : red);
                break;
             }
-            mvaddstr (win->yoffset + (j % n) - page, win->xoffset + (j / n) * width, elem->name);
+            mvaddstr (win->yoffset + (j % n) - page, win->xoffset + (j / n) * win->width, elem->name);
             set_color (white);
         }
     }
@@ -186,8 +188,6 @@ int displaywindow (window_t *win, list_t *list, int page, int index_x, int index
         mvaddch (win->ysize + win->yoffset, win->xsize + win->xoffset, ACS_DARROW);
     }
     set_color (white);
-
-    return nbcols;
 }
 
 char *getwindow (int length, int xoffset, int yoffset)
index 68a0177a1f342a1bd6ebc2f137152a734d573508..cb23d4ac903d6c6491e45800734e157d272646bd 100644 (file)
--- a/display.h
+++ b/display.h
@@ -8,7 +8,7 @@
 
 int helpwindow (char *msg, int xoffset, int yoffset);
 
-int 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);
 
 char *getwindow (int length, int xoffset, int yoffset);
 
diff --git a/fm.c b/fm.c
index ab54d6a8be2ec1e298650b6d3a97d30d61c3cf11..f01826e9cadfce1e2f6f9052f53a04397e4a97fb 100644 (file)
--- a/fm.c
+++ b/fm.c
@@ -126,7 +126,7 @@ int main (int argc, char *argv[])
         }
 
         clear ();
-        int nbcols = displaywindow (windir, list, page, index_x, index_y);
+        displaywindow (windir, list, page, &index_x, &index_y);
 
         int ch = getch ();
         switch (ch) {
@@ -140,7 +140,7 @@ int main (int argc, char *argv[])
         case KEY_NPAGE:
         case KEY_SRIGHT:
         case 'K':
-            if (page + windir->ysize < (list->nb + nbcols - 1) / nbcols) {
+            if (page + windir->ysize < (list->nb + windir->nbcols - 1) / windir->nbcols) {
                 page++;
             }
             break;
@@ -158,13 +158,13 @@ int main (int argc, char *argv[])
             break;
         case KEY_DOWN:
         case 'k':
-            if (index_y < min (windir->ysize, (list->nb + nbcols - 1) / nbcols) - 1) {
+            if (index_y < min (windir->ysize, (list->nb + windir->nbcols - 1) / windir->nbcols) - 1) {
                 index_y++;
             }
             break;
         case KEY_RIGHT:
         case 'l':
-            if (index_x < min (nbcols, list->nb) - 1) {
+            if (index_x < min (windir->nbcols, list->nb) - 1) {
                 index_x++;
             }
             break;
diff --git a/type.h b/type.h
index 921dacc72351611d46352baef1865731fa789423..3893352f099263cfdc6810826bc7ff56c25e8c82 100644 (file)
--- a/type.h
+++ b/type.h
@@ -28,9 +28,11 @@ typedef struct {
 } list_t;
 
 typedef struct {
+    int nbcols;
+    int width;
     int xoffset;
-    int yoffset;
     int xsize;
+    int yoffset;
     int ysize;
 } window_t;