From 659f6cddb0c6b440c121f70ad5a2446201f5d12f Mon Sep 17 00:00:00 2001 From: Laurent Mazet Date: Fri, 3 Jan 2025 17:05:07 +0100 Subject: [PATCH] manage two panes --- display.c | 9 +++- fm.c | 125 ++++++++++++++++++++++++++++++++---------------------- type.h | 1 + 3 files changed, 84 insertions(+), 51 deletions(-) diff --git a/display.c b/display.c index 01b8222..f0d01a9 100644 --- a/display.c +++ b/display.c @@ -136,6 +136,13 @@ void displaywindow (window_t *win, list_t *list, int page, int *index_x, int *in int index = page + *index_y + n * *index_x; VERBOSE (DEBUG, fprintf (stderr, "index: %d\n", index)); + set_color (white); + for (i = 0; i < win->xsize; i++) { + for (j = 0; j < win->ysize; j++) { + mvaddch (win->yoffset + j, win->xoffset + i, ' '); + } + } + for (i = j = 0; i < list->nb; i++, j++) { if ((j + 1 ) % n == 0) { if (rem > 0) { @@ -177,7 +184,7 @@ void displaywindow (window_t *win, list_t *list, int page, int *index_x, int *in } } - set_color (black); + set_color (win->active ? black : white); _dobound (win->xsize, win->ysize, win->xoffset, win->yoffset); if (page > 0) { mvaddch (win->yoffset - 1, win->xoffset - 1, ACS_UARROW); diff --git a/fm.c b/fm.c index c951224..dcaeb3b 100644 --- a/fm.c +++ b/fm.c @@ -13,14 +13,19 @@ #include "display.h" #include "function.h" +/* global constants */ + +#define MAXPANES 2 + /* static variables */ char *progname = NULL; char *version = "0.1"; -char *dirname = NULL; -int xoffset = 2; -int yoffset = 2; +char *dirname[MAXPANES] = {0}; +int pane = 0; int wide = 0; +int xoffset = 1; +int yoffset = 2; char *help = " Move up\n" @@ -34,7 +39,7 @@ int usage (int ret) { FILE *fd = ret ? stderr : stdout; fprintf (fd, "usage: %s [-d dir] [-h] [-w]\n", progname); - fprintf (fd, " -d: dir name (%s)\n", (dirname) ? dirname : "."); + fprintf (fd, " -d: dir name (%s)\n", (dirname[0]) ? dirname[0] : "."); fprintf (fd, " -h: help message\n"); fprintf (fd, " -w: wide board (%d)\n", wide); fprintf (fd, "%s version %s\n", progname, version); @@ -45,6 +50,8 @@ int usage (int ret) /* main function */ int main (int argc, char *argv[]) { + int i; + /* get basename */ char *pt = progname = argv[0]; while (*pt) { @@ -69,10 +76,11 @@ int main (int argc, char *argv[]) VERBOSE (ERROR, fprintf (stderr, "%s: missing verbose level\n", progname)); return usage (1); } - if (dirname == NULL) { - free (dirname); + if (dirname[pane] == NULL) { + free (dirname[pane]); } - dirname = strdup (arg); + dirname[pane] = strdup (arg); + pane = (pane + 1) % MAXPANES; break; case 'v': arg = (arg[2]) ? arg + 2 : (--argc > 0) ? *(++argv) : NULL; @@ -90,8 +98,10 @@ int main (int argc, char *argv[]) return usage (c != 'h'); } } - if (dirname == NULL) { - dirname = strdup ("."); + for (i = 0; i < MAXPANES; i++) { + if (dirname[i] == NULL) { + dirname[i] = strdup ("."); + } } /* init curses */ @@ -104,83 +114,95 @@ int main (int argc, char *argv[]) start_color (); /* init windows */ - window_t *windir = allocwindow (); - windir->xoffset = xoffset; - windir->yoffset = yoffset; - windir->xsize = COLS - 2 * xoffset; - VERBOSE (DEBUG, fprintf (stderr, "xsize: %d\n", windir->xsize)); - windir->ysize = LINES - 2 * yoffset; - VERBOSE (DEBUG, fprintf (stderr, "ysize: %d\n", windir->ysize)); - - list_t *list = NULL; - int page = 0; - int index_x = 0; - int index_y = 0; + window_t *windir[MAXPANES] = {0}; + for (i = 0; i < MAXPANES; i++) { + windir[i] = allocwindow (); + windir[i]->active = (pane == i); + windir[i]->xoffset = xoffset + COLS / 2 * i; + windir[i]->xsize = COLS / 2 - 2 * xoffset; + windir[i]->yoffset = yoffset; + windir[i]->ysize = LINES - 2 * yoffset; + } + + list_t *list[MAXPANES] = {0}; + int page[MAXPANES] = {0}; + int index_x[MAXPANES] = {0}; + int index_y[MAXPANES] = {0}; /* event loop */ int stop = 0; while (!stop) { - if (list == NULL) { - list = exploredir (dirname); - if (list == NULL) { - endwin (); - freewindow (windir); - VERBOSE (ERROR, fprintf (stderr, "can't read directory '%s'\n", dirname)); - return 1; + for (i = 0; i < MAXPANES; i++) { + if (list[i] == NULL) { + list[i] = exploredir (dirname[i]); + if (list[i] == NULL) { + endwin (); + int _i; + for (_i = 0; _i < MAXPANES; _i++) { + free (dirname[i]); + freelist (list[_i]); + freewindow (windir[_i]); + } + VERBOSE (ERROR, fprintf (stderr, "can't read directory '%s'\n", dirname[i])); + return 1; + } } + displaywindow (windir[i], list[i], page[i], &index_x[i], &index_y[i]); } - clear (); - 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--; + if (page[pane] > 0) { + page[pane]--; } break; case KEY_NPAGE: case KEY_SRIGHT: case 'K': - if (page + windir->ysize < (list->nb + windir->nbcols - 1) / windir->nbcols) { - page++; + if (page[pane]+ windir[pane]->ysize < (list[pane]->nb + windir[pane]->nbcols - 1) / windir[pane]->nbcols) { + page[pane]++; } break; case KEY_UP: case 'i': - if (index_y > 0) { - index_y--; - } else if (page > 0) { - page--; + if (index_y[pane]> 0) { + index_y[pane]--; + } else if (page[pane]> 0) { + page[pane]--; } break; case KEY_LEFT: case 'j': - if (index_x > 0) { - index_x--; + if (index_x[pane]> 0) { + index_x[pane]--; } break; case KEY_DOWN: case 'k': - if (index_y < min (windir->ysize, (list->nb + windir->nbcols - 1) / windir->nbcols) - 1) { - index_y++; - } else if (page + windir->ysize < (list->nb + windir->nbcols - 1) / windir->nbcols) { - page++; + if (index_y[pane]< min (windir[pane]->ysize, (list[pane]->nb + windir[pane]->nbcols - 1) / windir[pane]->nbcols) - 1) { + index_y[pane]++; + } else if (page[pane]+ windir[pane]->ysize < (list[pane]->nb + windir[pane]->nbcols - 1) / windir[pane]->nbcols) { + page[pane]++; } break; case KEY_RIGHT: case 'l': - if (index_x < min (windir->nbcols, list->nb) - 1) { - index_x++; + if (index_x[pane]< min (windir[pane]->nbcols, list[pane]->nb) - 1) { + index_x[pane]++; } break; + case '\t': + windir[pane]->active = 0; + pane = (pane + 1) % MAXPANES; + windir[pane]->active = 1; + break; case KEY_ESC: case 'q': - if (askwindow (" Restart (Y/N) ", max (windir->xoffset + (windir->xsize - 15) / 2, 1), windir->yoffset + (windir->ysize - 1) / 2, "Yy", "Nn") == 1) { + if (askwindow (" Restart (Y/N) ", max (windir[pane]->xoffset + (windir[pane]->xsize - 15) / 2, 1), windir[pane]->yoffset + (windir[pane]->ysize - 1) / 2, "Yy", "Nn") == 1) { stop = 1; } break; @@ -189,8 +211,11 @@ int main (int argc, char *argv[]) endwin (); - freelist (list); - freewindow (windir); + for (i = 0; i < MAXPANES; i++) { + free (dirname[i]); + freelist (list[pane]); + freewindow (windir[i]); + } return 0; } diff --git a/type.h b/type.h index 3893352..f2658f6 100644 --- a/type.h +++ b/type.h @@ -28,6 +28,7 @@ typedef struct { } list_t; typedef struct { + int active; int nbcols; int width; int xoffset; -- 2.30.2