diff --git a/src/browser.c b/src/browser.c index d7cc2c2d51d4fd61c65d9afd27c6bb2dfddf570a..ac6c68d12f5d3a297d9a350f415942efca550b80 100644 --- a/src/browser.c +++ b/src/browser.c @@ -28,6 +28,35 @@ struct dir *bcur; +void drawInfo(struct dir *dr) { + WINDOW *nfo; + char path[PATH_MAX]; + + nfo = newwin(11, 60, winrows/2-5, wincols/2-30); + box(nfo, 0, 0); + wattron(nfo, A_BOLD); + mvwaddstr(nfo, 0, 4, "Item info"); + + mvwaddstr(nfo, 2, 3, "Name:"); + mvwaddstr(nfo, 3, 3, "Path:"); + mvwaddstr(nfo, 4, 3, "Type:"); + mvwaddstr(nfo, 6, 3, " Disk usage:"); + mvwaddstr(nfo, 7, 3, "Apparent size:"); + wattroff(nfo, A_BOLD); + + mvwaddstr(nfo, 2, 9, cropdir(dr->name, 49)); + mvwaddstr(nfo, 3, 9, cropdir(getpath(dr, path), 49)); + mvwaddstr(nfo, 4, 9, dr->flags & FF_DIR ? "Directory" + : dr->flags & FF_FILE ? "File" : "Other (link, device, socket, ..)"); + mvwprintw(nfo, 6, 18, "%s (%s B)", cropsize(dr->size), fullsize(dr->size)); + mvwprintw(nfo, 7, 18, "%s (%s B)", cropsize(dr->asize), fullsize(dr->asize)); + + mvwaddstr(nfo, 9, 32, "Press any key to continue"); + wrefresh(nfo); + delwin(nfo); +} + + int cmp(struct dir *x, struct dir *y) { struct dir *a, *b; int r = 0; @@ -51,6 +80,8 @@ int cmp(struct dir *x, struct dir *y) { r = strcmp(a->name, b->name); if(r == 0) r = a->size > b->size ? 1 : (a->size == b->size ? 0 : -1); + if(r == 0) + r = a->asize > b->asize ? 1 : (a->asize == b->asize ? 0 : -1); if(r == 0) r = strcmp(x->name, y->name); return(r); @@ -120,7 +151,7 @@ char *graph(off_t max, off_t size) { void drawBrowser(int change) { struct dir *n; - char tmp[PATH_MAX], ct, dt; + char tmp[PATH_MAX], ct, dt, *size; int selected, i, o; off_t max = 1; @@ -233,28 +264,29 @@ void drawBrowser(int change) { && n->sub == NULL ? 'e' : ' ' ; dt = n->flags & FF_DIR ? '/' : ' '; + size = cropsize(bflags & BF_AS ? n->asize : n->size); /* format and add item to the list */ switch(bgraph) { case 0: - mvprintw(i+2, 0, tmp, ct, cropsize(n->size), + mvprintw(i+2, 0, tmp, ct, size, dt, cropdir(n->name, wincols-12) ); break; case 1: - mvprintw(i+2, 0, tmp, ct, cropsize(n->size), + mvprintw(i+2, 0, tmp, ct, size, graph(max, n->size), dt, cropdir(n->name, wincols-24) ); break; case 2: - mvprintw(i+2, 0, tmp, ct, cropsize(n->size), + mvprintw(i+2, 0, tmp, ct, size, ((float) n->size / (float) n->parent->size) * 100.0f, dt, cropdir(n->name, wincols-19) ); break; case 3: - mvprintw(i+2, 0, tmp, ct, cropsize(n->size), + mvprintw(i+2, 0, tmp, ct, size, ((float) n->size / (float) n->parent->size) * 100.0f, graph(max, n->size), dt, cropdir(n->name, wincols-30) ); @@ -340,6 +372,9 @@ void showBrowser(void) { case 't': toggle(bflags, BF_NDIRF); break; + case 'a': + toggle(bflags, BF_AS); + break; /* browsing */ case 10: @@ -408,6 +443,16 @@ void showBrowser(void) { case '?': showHelp(); break; + case 'i': + n = selected(); + if(!(n->flags & FF_PAR)) { + drawInfo(n); + while(getch() == KEY_RESIZE) { + drawBrowser(0); + drawInfo(n); + } + } + break; case 'd': n = selected(); if(!(n->flags & FF_PAR)) @@ -418,7 +463,7 @@ void showBrowser(void) { case 'q': goto endloop; } - if((last != bcur || (oldflags | BF_HIDE) != (bflags | BF_HIDE)) && bflags & BF_SORT) + if((last != bcur || (oldflags | BF_HIDE | BF_AS) != (bflags | BF_HIDE | BF_AS)) && bflags & BF_SORT) bflags -= BF_SORT; drawBrowser(change); diff --git a/src/ncdu.h b/src/ncdu.h index 452164dddb344242e8ed69c07e2a525d71f3161d..acc960760bc6d3c3faae2ef3003c0274a108d523 100644 --- a/src/ncdu.h +++ b/src/ncdu.h @@ -90,19 +90,20 @@ #define FF_PAR 0x80 /* reference to parent directory (hack) */ /* Settings Flags (int sflags) */ -#define SF_SMFS 1 /* same filesystem */ -#define SF_SI 4 /* use powers of 1000 instead of 1024 */ -#define SF_IGNS 8 /* ignore too small terminal sizes */ -#define SF_NOCFM 16 /* don't confirm file deletion */ -#define SF_IGNE 32 /* ignore errors when deleting */ +#define SF_SMFS 0x01 /* same filesystem */ +#define SF_SI 0x02 /* use powers of 1000 instead of 1024 */ +#define SF_IGNS 0x04 /* ignore too small terminal sizes */ +#define SF_NOCFM 0x08 /* don't confirm file deletion */ +#define SF_IGNE 0x10 /* ignore errors when deleting */ /* Browse Flags (int bflags) */ -#define BF_NAME 1 -#define BF_SIZE 2 -#define BF_NDIRF 32 /* Normally, dirs before files, setting this disables it */ -#define BF_DESC 64 -#define BF_HIDE 128 /* don't show hidden files... */ -#define BF_SORT 256 /* no need to resort, list is already in correct order */ +#define BF_NAME 0x01 +#define BF_SIZE 0x02 +#define BF_NDIRF 0x04 /* Normally, dirs before files, setting this disables it */ +#define BF_DESC 0x08 +#define BF_HIDE 0x10 /* don't show hidden files... */ +#define BF_SORT 0x20 /* no need to resort, list is already in correct order */ +#define BF_AS 0x40 /* show apparent sizes instead of disk usage */ /* @@ -137,6 +138,7 @@ extern int sflags, bflags, sdelay, bgraph; /* util.c */ extern char *cropdir(const char *, int); extern char *cropsize(const off_t); +extern char *fullsize(const off_t); extern void ncresize(void); extern struct dir * freedir(struct dir *); extern char *getpath(struct dir *, char *); diff --git a/src/util.c b/src/util.c index b8cca5f20c7212c7e7e20b2d558fd08194d5aa90..e48ec487eb520fa4f9d25442dfcbe8cd11b93ab4 100644 --- a/src/util.c +++ b/src/util.c @@ -26,6 +26,7 @@ #include "ncdu.h" char cropsizedat[8]; +char fullsizedat[20]; /* max: 999.999.999.999.999 */ char cropdirdat[4096]; char *cropdir(const char *from, int s) { @@ -68,6 +69,25 @@ char *cropsize(const off_t from) { return(cropsizedat); } +/* returns integer as a string with thousand seperators + BUG: Uses a dot as seperator, ignores current locale */ +char *fullsize(const off_t from) { + char tmp[20]; + int i, j, len; + + sprintf(tmp, "%lld", from); + + fullsizedat[19] = '\0'; + len = strlen(tmp); + for(i=len, j=18; i >= 0; i--) { + if(len-i != 1 && (len-i-1) % 3 == 0) + fullsizedat[j--] = '.'; + fullsizedat[j--] = tmp[i]; + } + return fullsizedat+j+1; +} + + void ncresize(void) { int ch; getmaxyx(stdscr, winrows, wincols);