From 3e6affa73d59b0ca71b9f23f1cdda79727913eee Mon Sep 17 00:00:00 2001 From: Yorhel <git@yorhel.nl> Date: Tue, 23 Jan 2018 14:59:38 +0100 Subject: [PATCH] Display extended information in the info window It's looking a bit cramped, but I'm lazy. --- src/browser.c | 24 +++++++++++++++++++++--- src/dir_mem.c | 7 ++++--- src/util.c | 24 ++++++++++++++++++++++++ src/util.h | 3 +++ 4 files changed, 52 insertions(+), 6 deletions(-) diff --git a/src/browser.c b/src/browser.c index 0ed690e..d9a7d5e 100644 --- a/src/browser.c +++ b/src/browser.c @@ -28,6 +28,7 @@ #include <string.h> #include <stdlib.h> #include <ncurses.h> +#include <time.h> static int graph = 1, show_as = 0, info_show = 0, info_page = 0, info_start = 0, show_items = 0; @@ -37,6 +38,8 @@ static char *message = NULL; static void browse_draw_info(struct dir *dr) { struct dir *t; + struct dir_ext *e = dir_ext_ptr(dr); + char mbuf[46]; int i; nccreate(11, 60, "Item info"); @@ -51,15 +54,30 @@ static void browse_draw_info(struct dir *dr) { attron(A_BOLD); ncaddstr(2, 3, "Name:"); ncaddstr(3, 3, "Path:"); - ncaddstr(4, 3, "Type:"); + if(!e) + ncaddstr(4, 3, "Type:"); + else { + ncaddstr(4, 3, "Mode:"); + ncaddstr(4, 21, "UID:"); + ncaddstr(4, 33, "GID:"); + ncaddstr(5, 3, "Last modified:"); + } ncaddstr(6, 3, " Disk usage:"); ncaddstr(7, 3, "Apparent size:"); attroff(A_BOLD); ncaddstr(2, 9, cropstr(dr->name, 49)); ncaddstr(3, 9, cropstr(getpath(dr->parent), 49)); - ncaddstr(4, 9, dr->flags & FF_DIR ? "Directory" - : dr->flags & FF_FILE ? "File" : "Other (link, device, socket, ..)"); + ncaddstr(4, 9, dr->flags & FF_DIR ? "Directory" : dr->flags & FF_FILE ? "File" : "Other"); + + if(e) { + ncaddstr(4, 9, fmtmode(e->mode)); + ncprint(4, 26, "%d", e->uid); + ncprint(4, 38, "%d", e->gid); + time_t t = (time_t)e->mtime; + strftime(mbuf, sizeof(mbuf), "%Y-%m-%d %H:%M:%S %z", localtime(&t)); + ncaddstr(5, 18, mbuf); + } ncmove(6, 18); printsize(UIC_DEFAULT, dr->size); diff --git a/src/dir_mem.c b/src/dir_mem.c index 457678a..f3bb2fd 100644 --- a/src/dir_mem.c +++ b/src/dir_mem.c @@ -123,11 +123,12 @@ static int item(struct dir *dir, const char *name, struct dir_ext *ext) { if(!root && orig) name = orig->name; - int extended = extended_info && (dir->flags & FF_EXT); - item = malloc(extended ? dir_ext_memsize(name) : dir_memsize(name)); + if(!extended_info) + dir->flags &= ~FF_EXT; + item = malloc(dir->flags & FF_EXT ? dir_ext_memsize(name) : dir_memsize(name)); memcpy(item, dir, offsetof(struct dir, name)); strcpy(item->name, name); - if(extended) + if(dir->flags & FF_EXT) memcpy(dir_ext_ptr(item), ext, sizeof(struct dir_ext)); item_add(item); diff --git a/src/util.c b/src/util.c index b85ac2b..fbf6e9d 100644 --- a/src/util.c +++ b/src/util.c @@ -121,6 +121,30 @@ char *fullsize(int64_t from) { } +char *fmtmode(unsigned short mode) { + static char buf[11]; + unsigned short ft = mode & S_IFMT; + buf[0] = ft == S_IFDIR ? 'd' + : ft == S_IFREG ? '-' + : ft == S_IFLNK ? 'l' + : ft == S_IFIFO ? 'p' + : ft == S_IFSOCK ? 's' + : ft == S_IFCHR ? 'c' + : ft == S_IFBLK ? 'b' : '?'; + buf[1] = mode & 0400 ? 'r' : '-'; + buf[2] = mode & 0200 ? 'w' : '-'; + buf[3] = mode & 0100 ? 'x' : '-'; + buf[4] = mode & 0040 ? 'r' : '-'; + buf[5] = mode & 0020 ? 'w' : '-'; + buf[6] = mode & 0010 ? 'x' : '-'; + buf[7] = mode & 0004 ? 'r' : '-'; + buf[8] = mode & 0002 ? 'w' : '-'; + buf[9] = mode & 0001 ? 'x' : '-'; + buf[10] = 0; + return buf; +} + + void read_locale() { thou_sep = '.'; #ifdef HAVE_LOCALE_H diff --git a/src/util.h b/src/util.h index dccfaf8..5ac47cc 100644 --- a/src/util.h +++ b/src/util.h @@ -137,6 +137,9 @@ void printsize(enum ui_coltype, int64_t); /* int2string with thousand separators */ char *fullsize(int64_t); +/* format's a file mode as a ls -l string */ +char *fmtmode(unsigned short); + /* read locale information from the environment */ void read_locale(); -- GitLab