From 9be9462bd0803b34a179be66626656166b7f32b0 Mon Sep 17 00:00:00 2001 From: Laurent Mazet Date: Sun, 5 Jan 2025 20:51:58 +0100 Subject: [PATCH] status for all panes --- display.c | 96 ++++++++++++------------------------------------------ display.h | 2 +- fm.c | 55 +++++++++++++++++++++---------- function.c | 63 +++++++++++++++++++++++++++++++++++ function.h | 2 ++ 5 files changed, 124 insertions(+), 94 deletions(-) diff --git a/display.c b/display.c index 3edaea7..348723f 100644 --- 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) diff --git a/display.h b/display.h index e189ea8..d113f3b 100644 --- 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 aebadbb..fdbf63d 100644 --- 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 = " Move left\n" " Move down\n" " Move right\n" + " Status right\n" " Quit\n" + " 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; } } diff --git a/function.c b/function.c index bcdf33a..fcee89f 100644 --- a/function.c +++ b/function.c @@ -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) { diff --git a/function.h b/function.h index 78c88ba..d118fdd 100644 --- a/function.h +++ b/function.h @@ -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); -- 2.30.2