improve key management
authorLaurent Mazet <mazet@softndesign.org>
Thu, 2 Jan 2025 21:15:52 +0000 (22:15 +0100)
committerLaurent Mazet <mazet@softndesign.org>
Thu, 2 Jan 2025 21:15:52 +0000 (22:15 +0100)
display.c
display.h
fm.c

index fbc03ced3285dcb3482a78d93ff762c433b046a9..ec9322a14a25a038aa97096be3b15cd23cb0278d 100644 (file)
--- a/display.c
+++ b/display.c
@@ -117,12 +117,10 @@ int helpwindow (char *msg, int xoffset, int yoffset)
     return j;
 }
 
-void displaywindow (window_t *win, list_t *list, int index)
+int displaywindow (window_t *win, list_t *list, int page, int index_x, int index_y)
 {
     int i, j;
 
-    _dobound (win->xsize, win->ysize, win->xoffset, win->yoffset);
-
     int nbcols = win->xsize / (list->width + 1);
     VERBOSE (DEBUG, fprintf (stderr, "nbcols: %d\n", nbcols));
     int width = win->xsize / nbcols;
@@ -130,7 +128,11 @@ void displaywindow (window_t *win, list_t *list, int index)
     int n = (list->nb + nbcols - 1) / nbcols;
     VERBOSE (DEBUG, fprintf (stderr, "n: %d\n", n));
     int rem = list->nb - nbcols * (list->nb / nbcols);
+    if (rem == 0) {
+        rem = nbcols;
+    }
     VERBOSE (DEBUG, fprintf (stderr, "rem: %d\n", rem));
+    int index = page + index_y + n * index_x;
 
     for (i = j = 0; i < list->nb; i++, j++) {
         if ((j + 1 ) % n == 0) {
@@ -140,38 +142,52 @@ void displaywindow (window_t *win, list_t *list, int index)
                 j++;
             }
         }
-        if ((j % n >= index) && (j % n < win->ysize + index)) {
+        if ((j % n >= page) && (j % n < win->ysize + page)) {
             elem_t *elem = list->tab + i;
             switch (elem->type) {
             case type_unkn_e:
-               set_color (black);
+               set_color ((j == index) ? white : black);
                break;
             case type_block_e:
-               set_color (yellow);
+               set_color ((j == index) ? byellow : yellow);
                break;
             case type_char_e:
-               set_color (magenta);
+               set_color ((j == index) ? bmagenta : magenta);
                break;
             case type_dir_e:
-               set_color (blue);
+               set_color ((j == index) ? bblue : blue);
                break;
             case type_pipe_e:
-               set_color (red);
+               set_color ((j == index) ? bred : red);
                break;
             case type_symb_e:
-               set_color (cyan);
+               set_color ((j == index) ? bcyan : cyan);
                break;
             case type_reg_e:
-               set_color (white);
+               set_color ((j == index) ? black : white);
                break;
             case type_socket_e:
-               set_color (red);
+               set_color ((j == index) ? bred : red);
                break;
             }
-            mvaddstr (win->yoffset + (j % n) - index, win->xoffset + (j / n) * width, elem->name);
+            mvaddstr (win->yoffset + (j % n) - page, win->xoffset + (j / n) * width, elem->name);
             set_color (white);
         }
     }
+
+    set_color (black);
+    _dobound (win->xsize, win->ysize, win->xoffset, win->yoffset);
+    if (page > 0) {
+        mvaddch (win->yoffset - 1, win->xoffset - 1, ACS_UARROW);
+        mvaddch (win->yoffset - 1, win->xsize + win->xoffset, ACS_UARROW);
+    }
+    if (page + win->ysize < n) {
+        mvaddch (win->ysize + win->yoffset, win->xoffset - 1, ACS_DARROW);
+        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 2f33b50f3b3e0219906555588815125f2fdd1688..68a0177a1f342a1bd6ebc2f137152a734d573508 100644 (file)
--- a/display.h
+++ b/display.h
@@ -8,7 +8,7 @@
 
 int helpwindow (char *msg, int xoffset, int yoffset);
 
-void displaywindow (window_t *win, list_t *list, int index);
+int 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 d4e81ff19a8663efcca2c7f540128f6a3c3d252f..ab54d6a8be2ec1e298650b6d3a97d30d61c3cf11 100644 (file)
--- a/fm.c
+++ b/fm.c
@@ -18,8 +18,8 @@ char *progname = NULL;
 char *version = "0.1";
 
 char *dirname = NULL;
-int xoffset = 1;
-int yoffset = 1;
+int xoffset = 2;
+int yoffset = 2;
 int wide = 0;
 
 char *help =
@@ -113,7 +113,9 @@ int main (int argc, char *argv[])
     VERBOSE (DEBUG, fprintf (stderr, "ysize: %d\n", windir->ysize));
 
     list_t *list  = NULL;
-    int index = 0;
+    int page = 0;
+    int index_x = 0;
+    int index_y = 0;
 
     /* event loop */
     int stop = 0;
@@ -123,23 +125,48 @@ int main (int argc, char *argv[])
             list = exploredir (dirname);
         }
 
-        displaywindow (windir, list, index);
+        clear ();
+        int nbcols = displaywindow (windir, list, page, index_x, index_y);
 
         int ch = getch ();
         switch (ch) {
+        case KEY_PPAGE:
+        case KEY_SLEFT:
+        case 'I':
+            if (page > 0) {
+                page--;
+            }
+            break;
+        case KEY_NPAGE:
+        case KEY_SRIGHT:
+        case 'K':
+            if (page + windir->ysize < (list->nb + nbcols - 1) / nbcols) {
+                page++;
+            }
+            break;
         case KEY_UP:
         case 'i':
-            index--;
+            if (index_y > 0) {
+                index_y--;
+            }
             break;
         case KEY_LEFT:
         case 'j':
+            if (index_x > 0) {
+                index_x--;
+            }
             break;
         case KEY_DOWN:
         case 'k':
-            index++;
+            if (index_y < min (windir->ysize, (list->nb + nbcols - 1) / nbcols) - 1) {
+                index_y++;
+            }
             break;
         case KEY_RIGHT:
         case 'l':
+            if (index_x < min (nbcols, list->nb) - 1) {
+                index_x++;
+            }
             break;
         case KEY_ESC:
         case 'q':