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.
Этот коммит содержится в:
родитель
a369a43d94
Коммит
6c2ee0d6ab
@ -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);
|
||||
|
35
src/util.c
35
src/util.c
@ -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) {
|
||||
|
36
src/util.h
36
src/util.h
@ -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);
|
||||
|
||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user