manage two panes
authorLaurent Mazet <mazet@softndesign.org>
Fri, 3 Jan 2025 16:05:07 +0000 (17:05 +0100)
committerLaurent Mazet <mazet@softndesign.org>
Fri, 3 Jan 2025 16:05:07 +0000 (17:05 +0100)
display.c
fm.c
type.h

index 01b822211459b3b45c5d8e40d740af8666c6f244..f0d01a96c9109a3a7c06528644c7001de83782b2 100644 (file)
--- 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 c951224eca54a138dc0b9153e403dea197bc5d53..dcaeb3b84a58101c2a55b0af1fad329ce7365732 100644 (file)
--- a/fm.c
+++ b/fm.c
 #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 =
     "<i> 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 3893352f099263cfdc6810826bc7ff56c25e8c82..f2658f608716b72f1c275a4e59600afc2512ce75 100644 (file)
--- a/type.h
+++ b/type.h
@@ -28,6 +28,7 @@ typedef struct {
 } list_t;
 
 typedef struct {
+    int active;
     int nbcols;
     int width;
     int xoffset;