noice

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

commit 383abc8aa9265f3a81142973106dcaeaded63e85
parent ffd423c6175d8c219ae4a6d939670e81845c68fc
Author: dok <dok@grehack.fr>
Date:   Sun,  6 Jan 2019 14:10:16 +0100

Add colors

Diffstat:
Mconfig.def.h | 18++++++++++++++++++
Mnoice.c | 51++++++++++++++++++++++++++++++++++++++-------------
2 files changed, 56 insertions(+), 13 deletions(-)

diff --git a/config.def.h b/config.def.h @@ -8,6 +8,24 @@ int idletimeout = 0; /* Screensaver timeout in seconds, 0 to disable */ int showhidden = 0; /* Set to 1 to show hidden files by default */ char *idlecmd = "rain"; /* The screensaver program */ +#define CURSR_ATTR A_REVERSE +#define DIR_ATTR A_BOLD | COLOR_PAIR(4) +#define LINK_ATTR A_BOLD | COLOR_PAIR(6) +#define SOCK_ATTR A_BOLD | COLOR_PAIR(1) +#define FIFO_ATTR A_BOLD | COLOR_PAIR(5) +#define EXEC_ATTR A_BOLD | COLOR_PAIR(2) + +struct cpair pairs[] = { + { .fg = 0, .bg = 0 }, + /* pairs start at 1 */ + { COLOR_RED, 0 }, + { COLOR_GREEN, 0 }, + { COLOR_YELLOW, 0 }, + { COLOR_BLUE, 0 }, + { COLOR_MAGENTA, 0 }, + { COLOR_CYAN, 0 }, +}; + struct assoc assocs[] = { { "\\.(avi|mp4|mkv|mp3|ogg|flac|mov)$", "mpv" }, { "\\.(png|jpg|gif)$", "sxiv" }, diff --git a/noice.c b/noice.c @@ -45,6 +45,11 @@ struct assoc { char *bin; /* Program */ }; +struct cpair { + int fg; + int bg; +}; + /* Supported actions */ enum action { SEL_QUIT = 1, @@ -270,6 +275,16 @@ entrycmp(const void *va, const void *vb) } void +initcolor(void) +{ + int i; + + start_color(); + for (i = 1; i < LEN(pairs); i++) + init_pair(i, pairs[i].fg, pairs[i].bg); +} + +void initcurses(void) { char *term; @@ -282,6 +297,8 @@ initcurses(void) fprintf(stderr, "failed to initialize curses\n"); exit(1); } + if (has_colors()) + initcolor(); cbreak(); noecho(); nonl(); @@ -420,37 +437,45 @@ void printent(struct entry *ent, int active) { char name[PATH_MAX]; - unsigned int maxlen = COLS - strlen(CURSR) - 1; + unsigned int len = COLS - strlen(CURSR) - 1; char cm = 0; + int attr = 0; /* Copy name locally */ strlcpy(name, ent->name, sizeof(name)); + /* No text wrapping in entries */ + if (strlen(name) < len) + len = strlen(name) + 1; + if (S_ISDIR(ent->mode)) { cm = '/'; - maxlen--; + attr |= DIR_ATTR; } else if (S_ISLNK(ent->mode)) { cm = '@'; - maxlen--; + attr |= LINK_ATTR; } else if (S_ISSOCK(ent->mode)) { cm = '='; - maxlen--; + attr |= SOCK_ATTR; } else if (S_ISFIFO(ent->mode)) { cm = '|'; - maxlen--; + attr |= FIFO_ATTR; } else if (ent->mode & S_IXUSR) { cm = '*'; - maxlen--; + attr |= EXEC_ATTR; } - /* No text wrapping in entries */ - if (strlen(name) > maxlen) - name[maxlen] = '\0'; + if (active) + attr |= CURSR_ATTR; - if (cm == 0) - printw("%s%s\n", active ? CURSR : EMPTY, name); - else - printw("%s%s%c\n", active ? CURSR : EMPTY, name, cm); + if (cm) { + name[len-1] = cm; + name[len] = '\0'; + } + + attron(attr); + printw("%s%s\n", active ? CURSR : EMPTY, name); + attroff(attr); } int