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:
M | noice.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);