noice

small file browser
git clone git://git.2f30.org/noice.git
Log | Files | Refs | README | LICENSE

commit 4fa2a994499211ed558c8e6fea1cf623b5feaad4
parent 561caf46dbd76221d98b8c3e55b96148794fad3c
Author: lostd <lostd@2f30.org>
Date:   Tue Oct  7 06:49:46 +0000

Scrolling listing and dirname handling

Diffstat:
noice.c | 32++++++++++++++++++++++++++------
1 file changed, 26 insertions(+), 6 deletions(-)
diff --git a/noice.c b/noice.c @@ -23,6 +23,7 @@ #endif /* DEBUG */ #define LEN(x) (sizeof(x) / sizeof(*(x))) +#define MIN(x, y) ((x) < (y) ? (x) : (y)) /* * Layout: @@ -187,7 +188,7 @@ browse(const char *ipath) char *path = strdup(ipath); begin: - /* Path is a malloc(3)-ed string */ + /* Path should be a malloc(3)-ed string at all times */ n = 0; cur = 0; dents = NULL; @@ -213,6 +214,7 @@ begin: qsort(dents, n, sizeof(*dents), dentcmp); for (;;) { + int nlines = MIN(LINES - 4, n); redraw: /* Clean screen */ erase(); @@ -233,10 +235,22 @@ redraw: path); /* Print listing */ - for (i = 0; i < n; i++) - printw(" %s %s\n", - i == cur ? ">" : " ", - dents[i]->d_name); + if (cur < nlines / 2) { + for (i = 0; i < nlines; i++) + printw(" %s %s\n", + i == cur ? ">" : " ", + dents[i]->d_name); + } else if (cur >= n - nlines / 2) { + for (i = n - nlines; i < n; i++) + printw(" %s %s\n", + i == cur ? ">" : " ", + dents[i]->d_name); + } else { + for (i = cur - nlines / 2; i <= cur + nlines / 2; i++) + printw(" %s %s\n", + i == cur ? ">" : " ", + dents[i]->d_name); + } nochange: ret = nextsel(&cur, n); @@ -249,7 +263,13 @@ nochange: if (strncmp(path, "", 1) == 0) { goto nochange; } else { - path = dirname(path); + char *dir, *tmp; + + dir = dirname(path); + tmp = malloc(strlen(dir) + 1); + strncpy(tmp, dir, strlen(dir) + 1); + free(path); + path = tmp; goto out; } }