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)
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);
/* global constants */
#define MAXPANES 2
+#define MAXSTATUS 128
/* static variables */
char *progname = NULL;
"<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)
curs_set (0);
start_color ();
- /* init windows */
+ /* init pane windows */
window_t *windir[MAXPANES] = {0};
for (i = 0; i < MAXPANES; i++) {
windir[i] = allocwindow ();
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;
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) {
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':
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':
stop = 1;
}
break;
+ case 'u':
+ index[pane]--;
+ break;
}
}
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) {
void getinfo (char *dirname, elem_t *elem);
+void createstatus (char *status, elem_t *elem);
+
void freelist (list_t *list);
window_t *allocwindow (void);