status for all panes
authorLaurent Mazet <mazet@softndesign.org>
Sun, 5 Jan 2025 19:51:58 +0000 (20:51 +0100)
committerLaurent Mazet <mazet@softndesign.org>
Sun, 5 Jan 2025 19:51:58 +0000 (20:51 +0100)
display.c
display.h
fm.c
function.c
function.h

index 3edaea75ae75a7aaa628290e15f150c76ceb3928..348723fe43dff7af1b269bda39bbbd2dea3dcdd8 100644 (file)
--- a/display.c
+++ b/display.c
@@ -214,89 +214,35 @@ void displaywindow (window_t *win, list_t *list, int page, int *index_x, int *in
     set_color (white);
 }
 
-void elementwindow (window_t *win, elem_t *elem)
+void elementwindow (window_t *win, char *status, int *index)
 {
-    char buf[64] = {0};
-
     int i;
     for (i = 0; i < win->xsize; i++) {
         mvaddch (win->yoffset, win->xoffset + i, ' ');
     }
 
-    int pos = 0;
-
-    mvaddch (win->yoffset, win->xoffset + pos++, (elem->mode & 0400) ? 'r' : '-');
-    mvaddch (win->yoffset, win->xoffset + pos++, (elem->mode & 0200) ? 'w' : '-');
-    mvaddch (win->yoffset, win->xoffset + pos++, (elem->mode & 0100) ? 'x' : '-');
-    mvaddch (win->yoffset, win->xoffset + pos++, (elem->mode & 0040) ? 'r' : '-');
-    mvaddch (win->yoffset, win->xoffset + pos++, (elem->mode & 0020) ? 'w' : '-');
-    mvaddch (win->yoffset, win->xoffset + pos++, (elem->mode & 0010) ? 'x' : '-');
-    mvaddch (win->yoffset, win->xoffset + pos++, (elem->mode & 0004) ? 'r' : '-');
-    mvaddch (win->yoffset, win->xoffset + pos++, (elem->mode & 0002) ? 'w' : '-');
-    mvaddch (win->yoffset, win->xoffset + pos++, (elem->mode & 0001) ? 'x' : '-');
-    pos += 1;
-
-    sprintf (buf, "(%d)", (int)(elem->nlk));
-    mvaddstr (win->yoffset, win->xoffset + pos, buf);
-    pos += strlen (buf) + 1;
-
-    if (elem->size < 10000l) {
-        sprintf (buf, "%dB", (int)(elem->size));
-    } else if (elem->size < 10000l * 1024) {
-        sprintf (buf, "%dkB", (int)(elem->size / 1024));
-    } else if (elem->size < 10000l * 1024 * 1024) {
-        sprintf (buf, "%dMB", (int)(elem->size / 1024 / 1024));
-    } else if (elem->size < 10000l * 1024 * 1024 * 1024) {
-        sprintf (buf, "%dGB", (int)(elem->size / 1024 / 1024 / 1024));
-    } else {
-        sprintf (buf, "%dTB", (int)(elem->size / 1024 / 1024 / 1024 / 1024));
+    if (*index < 0) {
+        *index = 0;
+    }
+    if ((int)strlen (status) - *index < win->xsize) {
+        *index = strlen (status) - win->xsize;
+    }
+    if (*index < 0) {
+        *index = 0;
+    }
+
+    for (i = 0; (i < win->xsize) && (status[*index + i] != 0); i++) {
+        mvaddch (win->yoffset, win->xoffset + i, status[*index + i]);
+    }
+
+    set_color (blue);
+    if (*index > 0) {
+        mvaddch (win->yoffset, win->xoffset, ACS_LARROW);
     }
-    mvaddstr (win->yoffset, win->xoffset + pos, buf);
-    pos += strlen (buf) + 1;
-
-    switch (elem->type) {
-    case type_unkn_e:
-        mvaddstr (win->yoffset, win->xoffset + pos, "unknown");
-        pos += 7;
-        break;
-    case type_block_e:
-        mvaddstr (win->yoffset, win->xoffset + pos, "block.dev");
-        pos += 9;
-        break;
-    case type_char_e:
-        mvaddstr (win->yoffset, win->xoffset + pos, "char.dev");
-        pos += 8;
-        break;
-    case type_dir_e:
-        mvaddstr (win->yoffset, win->xoffset + pos, "directory");
-        pos += 9;
-        break;
-    case type_pipe_e:
-        mvaddstr (win->yoffset, win->xoffset + pos, "fifo/pipe");
-        pos += 9;
-        break;
-    case type_symb_e:
-        mvaddstr (win->yoffset, win->xoffset + pos, "symb.link");
-        pos += 9;
-        break;
-    case type_reg_e:
-        mvaddstr (win->yoffset, win->xoffset + pos, "file");
-        pos += 4;
-        break;
-    case type_socket_e:
-        mvaddstr (win->yoffset, win->xoffset + pos, "socket");
-        pos += 6;
-        break;
+    if ((int)strlen (status) - *index > win->xsize) {
+        mvaddch (win->yoffset, win->xoffset + win->xsize - 1, ACS_RARROW);
     }
-    pos += 1;
-
-    mvaddstr (win->yoffset, win->xoffset + pos, elem->uid);
-    pos += strlen (elem->uid);
-    mvaddch (win->yoffset, win->xoffset + pos, '/');
-    pos += 1;
-    mvaddstr (win->yoffset, win->xoffset + pos, elem->gid);
-    //pos += strlen (elem->gid);
-    //pos += 1;
+    set_color (white);
 }
 
 char *getwindow (int length, int xoffset, int yoffset)
index e189ea80da1ac88351f409d8094061c846b24be3..d113f3b7fdbc10600246fd074b80e4c3b654fde2 100644 (file)
--- a/display.h
+++ b/display.h
@@ -10,7 +10,7 @@ int helpwindow (char *msg, int xoffset, int yoffset);
 
 void displaywindow (window_t *win, list_t *list, int page, int *index_x, int *index_y);
 
-void elementwindow (window_t *win, elem_t *elem);
+void elementwindow (window_t *win, char *status, int *index);
 
 char *getwindow (int length, int xoffset, int yoffset);
 
diff --git a/fm.c b/fm.c
index aebadbba2dc2857e07ddc6b3493aa7e1cb312398..fdbf63d05e140fb19f137e135a618d2854f68d3e 100644 (file)
--- a/fm.c
+++ b/fm.c
@@ -17,6 +17,7 @@
 /* global constants */
 
 #define MAXPANES 2
+#define MAXSTATUS 128
 
 /* static variables */
 char *progname = NULL;
@@ -37,7 +38,9 @@ char *help =
     "<j> Move left\n"
     "<k> Move down\n"
     "<l> Move right\n"
+    "<o> Status right\n"
     "<q> Quit\n"
+    "<u> Status left\n"
     ;
 
 int usage (int ret)
@@ -114,7 +117,7 @@ int main (int argc, char *argv[])
     curs_set (0);
     start_color ();
 
-    /* init windows */
+    /* init pane windows */
     window_t *windir[MAXPANES] = {0};
     for (i = 0; i < MAXPANES; i++) {
         windir[i] = allocwindow ();
@@ -124,16 +127,22 @@ int main (int argc, char *argv[])
         windir[i]->yoffset = yoffset;
         windir[i]->ysize = LINES - 2 * yoffset;
     }
-    window_t *winelem = allocwindow ();
-    winelem->xoffset = 0;
-    winelem->xsize = COLS;
-    winelem->yoffset = LINES - 1;
-    winelem->ysize = 1;
 
-    list_t *list[MAXPANES] = {0};
-    int page[MAXPANES] = {0};
+    /* init status windows */
+    window_t *winelem[MAXPANES] = {0};
+    for (i = 0; i < MAXPANES; i++) {
+        winelem[i] = allocwindow ();
+        winelem[i]->xoffset = xoffset + COLS / 2 * i;
+        winelem[i]->xsize = COLS / 2 - 2 * xoffset;
+        winelem[i]->yoffset = windir[i]->yoffset + windir[i]->ysize + 1;
+        winelem[i]->ysize = 1;
+    }
+
+    int index[MAXPANES] = {0};
     int index_x[MAXPANES] = {0};
     int index_y[MAXPANES] = {0};
+    list_t *list[MAXPANES] = {0};
+    int page[MAXPANES] = {0};
 
     /* event loop */
     int stop = 0;
@@ -155,15 +164,19 @@ int main (int argc, char *argv[])
                     return 1;
                 }
             }
+
+            /* display pane */
             displaywindow (windir[i], list[i], page[i], &index_x[i], &index_y[i]);
-        }
 
-        /* display info */
-        elem_t *current  = list[pane]->tab + windir[pane]->index;
-        if (current->uid == NULL) {
-            getinfo (dirname[pane], current);
+            /* display info */
+            elem_t *current  = list[i]->tab + windir[i]->index;
+            if (current->uid == NULL) {
+                getinfo (dirname[i], current);
+            }
+            char status[MAXSTATUS] = {0};
+            createstatus (status, current);
+            elementwindow (winelem[i], status, index + i);
         }
-        elementwindow (winelem, current);
 
         int ch = getch ();
         switch (ch) {
@@ -181,6 +194,11 @@ int main (int argc, char *argv[])
                 page[pane] = 0;
             }
             break;
+        case '\t':
+            windir[pane]->active = 0;
+            pane = (pane + 1) % MAXPANES;
+            windir[pane]->active = 1;
+            break;
         case KEY_PPAGE:
         case KEY_SLEFT:
         case 'I':
@@ -229,10 +247,8 @@ int main (int argc, char *argv[])
                 index_x[pane]++;
             }
             break;
-        case '\t':
-            windir[pane]->active = 0;
-            pane = (pane + 1) % MAXPANES;
-            windir[pane]->active = 1;
+        case 'o':
+            index[pane]++;
             break;
         case KEY_ESC:
         case 'q':
@@ -240,6 +256,9 @@ int main (int argc, char *argv[])
                 stop = 1;
             }
             break;
+        case 'u':
+            index[pane]--;
+            break;
         }
     }
 
index bcdf33aae2695696ddafbf0b4bcec944b5a6600e..fcee89f48f197f75ff713d87af49984d3252c439 100644 (file)
@@ -204,6 +204,69 @@ void getinfo (char *dirname, elem_t *elem)
     elem->nlk = sb.st_nlink;
 }
 
+void createstatus (char *status, elem_t *elem)
+{
+    status[0] = 0;
+
+    strcat (status, (elem->mode & 0400) ? "r" : "-");
+    strcat (status, (elem->mode & 0200) ? "w" : "-");
+    strcat (status, (elem->mode & 0100) ? "x" : "-");
+    strcat (status, (elem->mode & 0040) ? "r" : "-");
+    strcat (status, (elem->mode & 0020) ? "w" : "-");
+    strcat (status, (elem->mode & 0010) ? "x" : "-");
+    strcat (status, (elem->mode & 0004) ? "r" : "-");
+    strcat (status, (elem->mode & 0002) ? "w" : "-");
+    strcat (status, (elem->mode & 0001) ? "x" : "-");
+
+    sprintf (status + strlen (status), " (%d)", (int)(elem->nlk));
+
+    strcat (status, " ");
+    if (elem->size < 10000l) {
+        sprintf (status + strlen (status), "%dB", (int)(elem->size));
+    } else if (elem->size < 10000l * 1024) {
+        sprintf (status + strlen (status), "%dkB", (int)(elem->size / 1024));
+    } else if (elem->size < 10000l * 1024 * 1024) {
+        sprintf (status + strlen (status), "%dMB", (int)(elem->size / 1024 / 1024));
+    } else if (elem->size < 10000l * 1024 * 1024 * 1024) {
+        sprintf (status + strlen (status), "%dGB", (int)(elem->size / 1024 / 1024 / 1024));
+    } else {
+        sprintf (status + strlen (status), "%dTB", (int)(elem->size / 1024 / 1024 / 1024 / 1024));
+    }
+
+    strcat (status, " ");
+    switch (elem->type) {
+    case type_unkn_e:
+        strcat (status, "unknown");
+        break;
+    case type_block_e:
+        strcat (status, "block.dev");
+        break;
+    case type_char_e:
+        strcat (status, "char.dev");
+        break;
+    case type_dir_e:
+        strcat (status, "directory");
+        break;
+    case type_pipe_e:
+        strcat (status, "fifo/pipe");
+        break;
+    case type_symb_e:
+        strcat (status, "symb.link");
+        break;
+    case type_reg_e:
+        strcat (status, "file");
+        break;
+    case type_socket_e:
+        strcat (status, "socket");
+        break;
+    }
+
+    strcat (status, " ");
+    strcat (status, elem->uid);
+    strcat (status, "/");
+    strcat (status, elem->gid);
+}
+
 void freelist (list_t *list)
 {
     if (list) {
index 78c88babe997d1a5da11a11fcb8c5aec152dfd51..d118fdd5328588c3020fd34a9a0e47d31977fcab 100644 (file)
@@ -25,6 +25,8 @@ list_t *exploredir (char *dirname);
 
 void getinfo (char *dirname, elem_t *elem);
 
+void createstatus (char *status, elem_t *elem);
+
 void freelist (list_t *list);
 
 window_t *allocwindow (void);