return j;
}
-void displaywindow (window_t *win, list_t *list, int index)
+int displaywindow (window_t *win, list_t *list, int page, int index_x, int index_y)
{
int i, j;
- _dobound (win->xsize, win->ysize, win->xoffset, win->yoffset);
-
int nbcols = win->xsize / (list->width + 1);
VERBOSE (DEBUG, fprintf (stderr, "nbcols: %d\n", nbcols));
int width = win->xsize / nbcols;
int n = (list->nb + nbcols - 1) / nbcols;
VERBOSE (DEBUG, fprintf (stderr, "n: %d\n", n));
int rem = list->nb - nbcols * (list->nb / nbcols);
+ if (rem == 0) {
+ rem = nbcols;
+ }
VERBOSE (DEBUG, fprintf (stderr, "rem: %d\n", rem));
+ int index = page + index_y + n * index_x;
for (i = j = 0; i < list->nb; i++, j++) {
if ((j + 1 ) % n == 0) {
j++;
}
}
- if ((j % n >= index) && (j % n < win->ysize + index)) {
+ if ((j % n >= page) && (j % n < win->ysize + page)) {
elem_t *elem = list->tab + i;
switch (elem->type) {
case type_unkn_e:
- set_color (black);
+ set_color ((j == index) ? white : black);
break;
case type_block_e:
- set_color (yellow);
+ set_color ((j == index) ? byellow : yellow);
break;
case type_char_e:
- set_color (magenta);
+ set_color ((j == index) ? bmagenta : magenta);
break;
case type_dir_e:
- set_color (blue);
+ set_color ((j == index) ? bblue : blue);
break;
case type_pipe_e:
- set_color (red);
+ set_color ((j == index) ? bred : red);
break;
case type_symb_e:
- set_color (cyan);
+ set_color ((j == index) ? bcyan : cyan);
break;
case type_reg_e:
- set_color (white);
+ set_color ((j == index) ? black : white);
break;
case type_socket_e:
- set_color (red);
+ set_color ((j == index) ? bred : red);
break;
}
- mvaddstr (win->yoffset + (j % n) - index, win->xoffset + (j / n) * width, elem->name);
+ mvaddstr (win->yoffset + (j % n) - page, win->xoffset + (j / n) * width, elem->name);
set_color (white);
}
}
+
+ set_color (black);
+ _dobound (win->xsize, win->ysize, win->xoffset, win->yoffset);
+ if (page > 0) {
+ mvaddch (win->yoffset - 1, win->xoffset - 1, ACS_UARROW);
+ mvaddch (win->yoffset - 1, win->xsize + win->xoffset, ACS_UARROW);
+ }
+ if (page + win->ysize < n) {
+ mvaddch (win->ysize + win->yoffset, win->xoffset - 1, ACS_DARROW);
+ mvaddch (win->ysize + win->yoffset, win->xsize + win->xoffset, ACS_DARROW);
+ }
+ set_color (white);
+
+ return nbcols;
}
char *getwindow (int length, int xoffset, int yoffset)
char *version = "0.1";
char *dirname = NULL;
-int xoffset = 1;
-int yoffset = 1;
+int xoffset = 2;
+int yoffset = 2;
int wide = 0;
char *help =
VERBOSE (DEBUG, fprintf (stderr, "ysize: %d\n", windir->ysize));
list_t *list = NULL;
- int index = 0;
+ int page = 0;
+ int index_x = 0;
+ int index_y = 0;
/* event loop */
int stop = 0;
list = exploredir (dirname);
}
- displaywindow (windir, list, index);
+ clear ();
+ int nbcols = 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--;
+ }
+ break;
+ case KEY_NPAGE:
+ case KEY_SRIGHT:
+ case 'K':
+ if (page + windir->ysize < (list->nb + nbcols - 1) / nbcols) {
+ page++;
+ }
+ break;
case KEY_UP:
case 'i':
- index--;
+ if (index_y > 0) {
+ index_y--;
+ }
break;
case KEY_LEFT:
case 'j':
+ if (index_x > 0) {
+ index_x--;
+ }
break;
case KEY_DOWN:
case 'k':
- index++;
+ if (index_y < min (windir->ysize, (list->nb + nbcols - 1) / nbcols) - 1) {
+ index_y++;
+ }
break;
case KEY_RIGHT:
case 'l':
+ if (index_x < min (nbcols, list->nb) - 1) {
+ index_x++;
+ }
break;
case KEY_ESC:
case 'q':