From 4cd62551401d157c0654ec5c65443b738aae3632 Mon Sep 17 00:00:00 2001 From: Laurent Mazet Date: Thu, 2 Jan 2025 22:15:52 +0100 Subject: [PATCH] improve key management --- display.c | 42 +++++++++++++++++++++++++++++------------- display.h | 2 +- fm.c | 39 +++++++++++++++++++++++++++++++++------ 3 files changed, 63 insertions(+), 20 deletions(-) diff --git a/display.c b/display.c index fbc03ce..ec9322a 100644 --- 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) diff --git a/display.h b/display.h index 2f33b50..68a0177 100644 --- 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 d4e81ff..ab54d6a 100644 --- 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': -- 2.30.2