summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYorhel <git@yorhel.nl>2018-01-21 15:38:36 +0100
committerYorhel <git@yorhel.nl>2018-01-21 15:41:54 +0100
commit6c2ee0d6ab3ac4eb21aeb7b51b6a4f4ff2eb5220 (patch)
tree7d6257d08ffa82288842a0c01b1db4a6ece7cf1b
parenta369a43d94c3cd31f8b08bd9ea61fccc58ef6a33 (diff)
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.
-rw-r--r--doc/ncdu.pod6
-rw-r--r--src/browser.c22
-rw-r--r--src/delete.c2
-rw-r--r--src/dir_common.c6
-rw-r--r--src/help.c4
-rw-r--r--src/main.c9
-rw-r--r--src/util.c35
-rw-r--r--src/util.h36
8 files changed, 78 insertions, 42 deletions
diff --git a/doc/ncdu.pod b/doc/ncdu.pod
index 861271a..6486416 100644
--- a/doc/ncdu.pod
+++ b/doc/ncdu.pod
@@ -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
diff --git a/src/browser.c b/src/browser.c
index a7ab424..0ed690e 100644
--- a/src/browser.c
+++ b/src/browser.c
@@ -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.");
diff --git a/src/delete.c b/src/delete.c
index 8e97992..336b504 100644
--- a/src/delete.c
+++ b/src/delete.c
@@ -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");
}
diff --git a/src/dir_common.c b/src/dir_common.c
index 3d733b4..95f26ad 100644
--- a/src/dir_common.c
+++ b/src/dir_common.c
@@ -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");
}
diff --git a/src/help.c b/src/help.c
index 5341cd9..2876274 100644
--- a/src/help.c
+++ b/src/help.c
@@ -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]);
diff --git a/src/main.c b/src/main.c
index b79c663..15d8545 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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);
diff --git a/src/util.c b/src/util.c
index f931b41..11be394 100644
--- a/src/util.c
+++ b/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) {
diff --git a/src/util.h b/src/util.h
index bb9e16b..525a9c1 100644
--- a/src/util.h
+++ b/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);