URI:
       Add colors - noice - small file browser (mirror / fork from 2f30.org)
  HTML git clone git://git.codemadness.org/noice
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 383abc8aa9265f3a81142973106dcaeaded63e85
   DIR parent ffd423c6175d8c219ae4a6d939670e81845c68fc
  HTML Author: dok <dok@grehack.fr>
       Date:   Sun,  6 Jan 2019 14:10:16 +0100
       
       Add colors
       
       Diffstat:
         M config.def.h                        |      18 ++++++++++++++++++
         M noice.c                             |      51 +++++++++++++++++++++++--------
       
       2 files changed, 56 insertions(+), 13 deletions(-)
       ---
   DIR 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" },
   DIR 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