noice

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

commit 908e43cc67f29456bd1abbb0bd4eaa838b10eb8b
parent fdf42ec50293a27f70f89ceddc84a98fe0e1d599
Author: lostd <lostd@2f30.org>
Date:   Tue,  7 Oct 2014 14:00:25 +0000

Take care of line wrapping and odd number of lines

Diffstat:
Mnoice.c | 59++++++++++++++++++++++++++++++++++++++++++-----------------
1 file changed, 42 insertions(+), 17 deletions(-)

diff --git a/noice.c b/noice.c @@ -24,6 +24,7 @@ #define LEN(x) (sizeof(x) / sizeof(*(x))) #define MIN(x, y) ((x) < (y) ? (x) : (y)) +#define ISODD(x) ((x) & 1) /* * Layout: @@ -41,6 +42,10 @@ int die = 0; +struct entry { + char name[MAXNAMLEN + 1]; +}; + struct assoc { char *ext; /* Extension */ char *bin; /* Program */ @@ -205,6 +210,7 @@ browse(const char *ipath) int i, n, cur; int r, ret; char *path = strdup(ipath); + char *cwd; begin: /* Path should be a malloc(3)-ed string at all times */ @@ -234,6 +240,8 @@ begin: for (;;) { int nlines; + struct entry *tmpents; + int odd; redraw: nlines = MIN(LINES - 4, n); @@ -251,29 +259,50 @@ redraw: DPRINTF_D(cur); DPRINTF_S(path); +#define CWD "cwd: " +#define CURSR " > " +#define EMPTY " " + + /* No text wrapping in cwd line */ + cwd = malloc(COLS * sizeof(char)); + strncpy(cwd, path, COLS); + cwd[COLS - strlen(CWD) - 1] = '\0'; + + /* No text wrapping in entries */ + tmpents = malloc(n * sizeof(*tmpents)); + for (i = 0; i < n; i++) { + strncpy(tmpents[i].name, dents[i]->d_name, + sizeof(tmpents[i].name)); + tmpents[i].name[COLS - strlen(CURSR) - 1] = '\0'; + } + /* Print cwd */ - printw("cwd: %s%s\n\n", - strncmp(path, "", 1) == 0 ? "/" : "", - path); + printw(CWD "%s%s\n\n", + strncmp(cwd, "", 1) == 0 ? "/" : "", + cwd); /* Print listing */ + odd = ISODD(nlines); if (cur < nlines / 2) { for (i = 0; i < nlines; i++) - printw(" %s %s\n", - i == cur ? ">" : " ", - dents[i]->d_name); + printw("%s%s\n", + i == cur ? CURSR : EMPTY, + tmpents[i].name); } else if (cur >= n - nlines / 2) { for (i = n - nlines; i < n; i++) - printw(" %s %s\n", - i == cur ? ">" : " ", - dents[i]->d_name); + printw("%s%s\n", + i == cur ? CURSR : EMPTY, + tmpents[i].name); } else { - for (i = cur - nlines / 2; i <= cur + nlines / 2; i++) - printw(" %s %s\n", - i == cur ? ">" : " ", - dents[i]->d_name); + for (i = cur - nlines / 2; + i < cur + nlines / 2 + odd; i++) + printw("%s%s\n", + i == cur ? CURSR : EMPTY, + tmpents[i].name); } + free(tmpents); + nochange: ret = nextsel(&cur, n); if (ret == 1) { @@ -350,10 +379,6 @@ nochange: free(file); - /* Screen may be messed up */ - clear(); - /* Some programs reset this */ - keypad(stdscr, TRUE); goto redraw; default: DPRINTF_D(dents[cur]->d_type);