1
1

Add --color option, simple theme support, disable colors by default

I've decided not to use ls-like file name coloring for now, instead just
coloring the difference between a (regular) file and a dir.

Still looking for a good color scheme for light backgrounds.
Этот коммит содержится в:
Yorhel 2018-01-21 15:38:36 +01:00
родитель a369a43d94
Коммит 6c2ee0d6ab
8 изменённых файлов: 78 добавлений и 42 удалений

Просмотреть файл

@ -118,6 +118,12 @@ prefixes, that is, powers of 1024 (KiB, MiB, etc).
Requires a confirmation before quitting ncdu. Very helpful when you
accidentally press 'q' during or after a very long scan.
=item --color I<SCHEME>
Select a color scheme. Currently only two schemes are recognized: I<off> to
disable colors (the default) and I<dark> for a color scheme intended for dark
backgrounds.
=back
=head2 Scan Options

Просмотреть файл

@ -64,13 +64,13 @@ static void browse_draw_info(struct dir *dr) {
ncmove(6, 18);
printsize(UIC_DEFAULT, dr->size);
addstrc(UIC_DEFAULT, " (");
addstrc(UIC_KEYNUM, fullsize(dr->size));
addstrc(UIC_NUM, fullsize(dr->size));
addstrc(UIC_DEFAULT, " B)");
ncmove(7, 18);
printsize(UIC_DEFAULT, dr->asize);
addstrc(UIC_DEFAULT, " (");
addstrc(UIC_KEYNUM, fullsize(dr->asize));
addstrc(UIC_NUM, fullsize(dr->asize));
addstrc(UIC_DEFAULT, " B)");
break;
@ -88,7 +88,7 @@ static void browse_draw_info(struct dir *dr) {
}
ncaddstr(9, 31, "Press ");
addchc(UIC_KEYNUM, 'i');
addchc(UIC_KEY, 'i');
addstrc(UIC_DEFAULT, " to hide this window");
}
@ -129,7 +129,7 @@ static void browse_draw_graph(struct dir *n, int *x) {
pc = (float)(show_as ? n->parent->asize : n->parent->size);
if(pc < 1)
pc = 1.0f;
uic_set(c == UIC_SEL ? UIC_KEYNUM_SEL : UIC_KEYNUM);
uic_set(c == UIC_SEL ? UIC_NUM_SEL : UIC_NUM);
printw("%5.1f", ((float)(show_as ? n->asize : n->size) / pc) * 100.0f);
addchc(c, '%');
}
@ -158,10 +158,10 @@ static void browse_draw_items(struct dir *n, int *x) {
if(n->items > 99999) {
addstrc(c, "> ");
addstrc(c == UIC_SEL ? UIC_KEYNUM_SEL : UIC_KEYNUM, "100");
addstrc(c == UIC_SEL ? UIC_NUM_SEL : UIC_NUM, "100");
addchc(c, 'k');
} else if(n->items) {
uic_set(c == UIC_SEL ? UIC_KEYNUM_SEL : UIC_KEYNUM);
uic_set(c == UIC_SEL ? UIC_NUM_SEL : UIC_NUM);
printw("%6s", fullsize(n->items));
}
}
@ -189,7 +189,9 @@ static void browse_draw_item(struct dir *n, int row) {
browse_draw_items(n, &x);
move(row, x);
addchc(c == UIC_SEL ? UIC_DIR_SEL : UIC_DIR, n->flags & FF_DIR ? '/' : ' ');
if(n->flags & FF_DIR)
c = c == UIC_SEL ? UIC_DIR_SEL : UIC_DIR;
addchc(c, n->flags & FF_DIR ? '/' : ' ');
addstrc(c, cropstr(n->name, wincols-x-1));
}
@ -206,7 +208,7 @@ void browse_draw() {
uic_set(UIC_HD);
mvhline(0, 0, ' ', wincols);
mvprintw(0,0,"%s %s ~ Use the arrow keys to navigate, press ", PACKAGE_NAME, PACKAGE_VERSION);
addchc(UIC_KEYNUM_HD, '?');
addchc(UIC_KEY_HD, '?');
addstrc(UIC_HD, " for help");
if(dir_import_active)
mvaddstr(0, wincols-10, "[imported]");
@ -229,10 +231,10 @@ void browse_draw() {
mvaddstr(winrows-1, 0, " Total disk usage: ");
printsize(UIC_HD, t->parent->size);
addstrc(UIC_HD, " Apparent size: ");
uic_set(UIC_KEYNUM_HD);
uic_set(UIC_NUM_HD);
printsize(UIC_HD, t->parent->asize);
addstrc(UIC_HD, " Items: ");
uic_set(UIC_KEYNUM_HD);
uic_set(UIC_NUM_HD);
printw("%d", t->parent->items);
} else
mvaddstr(winrows-1, 0, " No items to display.");

Просмотреть файл

@ -71,7 +71,7 @@ static void delete_draw_progress() {
ncaddstr(1, 2, cropstr(getpath(curdir), 47));
ncaddstr(4, 41, "Press ");
addchc(UIC_KEYNUM, 'q');
addchc(UIC_KEY, 'q');
addstrc(UIC_DEFAULT, " to abort");
}

Просмотреть файл

@ -132,7 +132,7 @@ static void draw_progress() {
nccreate(10, width, antext);
ncaddstr(2, 2, "Total items: ");
uic_set(UIC_KEYNUM);
uic_set(UIC_NUM);
printw("%-8d", dir_output.items);
if(dir_output.size) {
@ -144,11 +144,11 @@ static void draw_progress() {
ncprint(3, 2, "Current item: %s", cropstr(dir_curpath, width-18));
if(confirm_quit_while_scanning_stage_1_passed) {
ncaddstr(8, width-26, "Press ");
addchc(UIC_KEYNUM, 'y');
addchc(UIC_KEY, 'y');
addstrc(UIC_DEFAULT, " to confirm abort");
} else {
ncaddstr(8, width-18, "Press ");
addchc(UIC_KEYNUM, 'q');
addchc(UIC_KEY, 'q');
addstrc(UIC_DEFAULT, " to abort");
}

Просмотреть файл

@ -62,7 +62,7 @@ void help_draw() {
nccreate(15, 60, "ncdu help");
ncaddstr(13, 42, "Press ");
uic_set(UIC_KEYNUM);
uic_set(UIC_KEY);
addch('q');
uic_set(UIC_DEFAULT);
addstr(" to close");
@ -75,7 +75,7 @@ void help_draw() {
case 1:
line = 1;
for(i=start*2; i<start*2+20; i+=2) {
uic_set(UIC_KEYNUM);
uic_set(UIC_KEY);
ncaddstr(++line, 13-strlen(keys[i]), keys[i]);
uic_set(UIC_DEFAULT);
ncaddstr(line, 15, keys[i+1]);

Просмотреть файл

@ -131,6 +131,7 @@ static void argv_parse(int argc, char **argv) {
{ 'C', 0, "--exclude-caches" },
{ 's', 0, "--si" },
{ 'Q', 0, "--confirm-quit" },
{ 'c', 1, "--color" },
{0,0,NULL}
};
@ -180,6 +181,14 @@ static void argv_parse(int argc, char **argv) {
case 'C':
cachedir_tags = 1;
break;
case 'c':
if(strcmp(val, "off") == 0) { uic_theme = 0; }
if(strcmp(val, "dark") == 0) { uic_theme = 1; }
else {
fprintf(stderr, "Unknown --color option: %s\n", val);
exit(1);
}
break;
case -2:
fprintf(stderr, "ncdu: %s.\n", val);
exit(1);

Просмотреть файл

@ -33,6 +33,7 @@
#include <locale.h>
#endif
int uic_theme;
int winrows, wincols;
int subwinr, subwinc;
int si;
@ -87,7 +88,7 @@ float formatsize(int64_t from, char **unit) {
void printsize(enum ui_coltype t, int64_t from) {
char *unit;
float r = formatsize(from, &unit);
uic_set(t == UIC_HD ? UIC_KEYNUM_HD : t == UIC_SEL ? UIC_KEYNUM_SEL : UIC_KEYNUM);
uic_set(t == UIC_HD ? UIC_NUM_HD : t == UIC_SEL ? UIC_NUM_SEL : UIC_NUM);
printw("%5.1f", r);
addchc(t, ' ');
addstrc(t, unit);
@ -201,7 +202,7 @@ void ncprint(int r, int c, char *fmt, ...) {
void nctab(int c, int sel, int num, char *str) {
uic_set(sel ? UIC_KEYNUM_HD : UIC_KEYNUM);
uic_set(sel ? UIC_KEY_HD : UIC_KEY);
ncprint(0, c, "%d", num);
uic_set(sel ? UIC_HD : UIC_DEFAULT);
addch(':');
@ -211,24 +212,36 @@ void nctab(int c, int sel, int num, char *str) {
static int colors[] = {
#define C(name, fg, bg, attr) 0,
#define C(name, ...) 0,
UI_COLORS
#undef C
0
};
static int lastcolor = 0;
void uic_init() {
start_color();
use_default_colors();
int i=0;
#define C(name, fg, bg, attr) \
init_pair(i+1, fg, bg);\
colors[i] = attr | COLOR_PAIR(i+1);\
i++;
static const struct {
short fg, bg;
int attr;
} color_defs[] = {
#define C(name, off_fg, off_bg, off_a, dark_fg, dark_bg, dark_a) \
{off_fg, off_bg, off_a}, \
{dark_fg, dark_bg, dark_a},
UI_COLORS
#undef C
{0,0,0}
};
void uic_init() {
size_t i, j;
start_color();
use_default_colors();
for(i=0; i<sizeof(colors)/sizeof(*colors)-1; i++) {
j = i*2 + uic_theme;
init_pair(i+1, color_defs[j].fg, color_defs[j].bg);
colors[i] = color_defs[j].attr | COLOR_PAIR(i+1);
}
}
void uic_set(enum ui_coltype c) {

Просмотреть файл

@ -30,30 +30,36 @@
#include <ncurses.h>
/* UI colors: C(name, foreground, background, attrs) */
/* UI colors: (foreground, background, attrs)
* NAME OFF DARK
*/
#define UI_COLORS \
C(DEFAULT, -1, -1, 0 )\
C(BOX_TITLE, COLOR_BLUE, -1, A_BOLD)\
C(HD, COLOR_BLACK, COLOR_CYAN, 0 ) /* header & footer */\
C(SEL, COLOR_WHITE, COLOR_GREEN, A_BOLD)\
C(KEYNUM, COLOR_YELLOW, -1, A_BOLD)\
C(KEYNUM_HD, COLOR_YELLOW, COLOR_CYAN, A_BOLD)\
C(KEYNUM_SEL, COLOR_YELLOW, COLOR_GREEN, A_BOLD)\
C(DIR, COLOR_BLUE, -1, A_BOLD)\
C(DIR_SEL, COLOR_BLUE, COLOR_GREEN, A_BOLD)\
C(FLAG, COLOR_RED, -1, 0 )\
C(FLAG_SEL, COLOR_RED, COLOR_GREEN, 0 )\
C(GRAPH, COLOR_MAGENTA, -1, 0 )\
C(GRAPH_SEL, COLOR_MAGENTA, COLOR_GREEN, 0 )
C(DEFAULT, -1,-1,0 , -1, -1, 0 )\
C(BOX_TITLE, -1,-1,A_BOLD , COLOR_BLUE, -1, A_BOLD)\
C(HD, -1,-1,A_REVERSE , COLOR_BLACK, COLOR_CYAN, 0 ) /* header & footer */\
C(SEL, -1,-1,A_REVERSE , COLOR_WHITE, COLOR_GREEN,A_BOLD)\
C(NUM, -1,-1,0 , COLOR_YELLOW, -1, A_BOLD)\
C(NUM_HD, -1,-1,A_REVERSE , COLOR_YELLOW, COLOR_CYAN, A_BOLD)\
C(NUM_SEL, -1,-1,A_REVERSE , COLOR_YELLOW, COLOR_GREEN,A_BOLD)\
C(KEY, -1,-1,A_BOLD , COLOR_YELLOW, -1, A_BOLD)\
C(KEY_HD, -1,-1,A_BOLD|A_REVERSE, COLOR_YELLOW, COLOR_CYAN, A_BOLD)\
C(DIR, -1,-1,0 , COLOR_BLUE, -1, A_BOLD)\
C(DIR_SEL, -1,-1,A_REVERSE , COLOR_BLUE, COLOR_GREEN,A_BOLD)\
C(FLAG, -1,-1,0 , COLOR_RED, -1, 0 )\
C(FLAG_SEL, -1,-1,A_REVERSE , COLOR_RED, COLOR_GREEN,0 )\
C(GRAPH, -1,-1,0 , COLOR_MAGENTA,-1, 0 )\
C(GRAPH_SEL, -1,-1,A_REVERSE , COLOR_MAGENTA,COLOR_GREEN,0 )
enum ui_coltype {
#define C(name, fg, bg, attr) UIC_##name,
#define C(name, ...) UIC_##name,
UI_COLORS
#undef C
UIC_NONE
};
/* Color & attribute manipulation */
extern int uic_theme;
void uic_init();
void uic_set(enum ui_coltype);