]> Sergey Matveev's repositories - nnn.git/commitdiff
Status bar: show time and perms in light mode
authorArun Prakash Jana <engineerarun@gmail.com>
Sat, 14 Sep 2019 22:43:09 +0000 (04:13 +0530)
committerArun Prakash Jana <engineerarun@gmail.com>
Sat, 14 Sep 2019 22:43:26 +0000 (04:13 +0530)
src/nnn.c

index a6abad929840bc6a9274e64a6f8f0899311978ed..46ee84ee7d293f472e9ead1b9247e0c4281b316c 100644 (file)
--- a/src/nnn.c
+++ b/src/nnn.c
@@ -2274,6 +2274,61 @@ static char *coolsize(off_t size)
        return size_buf;
 }
 
+static char get_fileind(mode_t mode)
+{
+       char c = '\0';
+
+       switch (mode & S_IFMT) {
+       case S_IFREG:
+               c = '-';
+               break;
+       case S_IFDIR:
+               c = 'd';
+               break;
+       case S_IFLNK:
+               c = 'l';
+               break;
+       case S_IFSOCK:
+               c = 's';
+               break;
+       case S_IFIFO:
+               c = 'p';
+               break;
+       case S_IFBLK:
+               c = 'b';
+               break;
+       case S_IFCHR:
+               c = 'c';
+               break;
+       default:
+               c = '?';
+               break;
+       }
+
+       return c;
+}
+
+/* Convert a mode field into "ls -l" type perms field. */
+static char *get_lsperms(mode_t mode)
+{
+       static const char * const rwx[] = {"---", "--x", "-w-", "-wx", "r--", "r-x", "rw-", "rwx"};
+       static char bits[11] = {'\0'};
+
+       bits[0] = get_fileind(mode);
+       xstrlcpy(&bits[1], rwx[(mode >> 6) & 7], 4);
+       xstrlcpy(&bits[4], rwx[(mode >> 3) & 7], 4);
+       xstrlcpy(&bits[7], rwx[(mode & 7)], 4);
+
+       if (mode & S_ISUID)
+               bits[3] = (mode & 0100) ? 's' : 'S';  /* user executable */
+       if (mode & S_ISGID)
+               bits[6] = (mode & 0010) ? 's' : 'l';  /* group executable */
+       if (mode & S_ISVTX)
+               bits[9] = (mode & 0001) ? 't' : 'T';  /* others executable */
+
+       return bits;
+}
+
 static void printent(const struct entry *ent, int sel, uint namecols)
 {
        wchar_t *wstr;
@@ -3157,7 +3212,7 @@ static void redraw(char *path)
        int ncols = (xcols <= PATH_MAX) ? xcols : PATH_MAX;
        int lastln = xlines, onscreen = xlines - 4;
        int i, attrs;
-       char buf[12];
+       char buf[18];
        char c;
        char *ptr = path, *base;
 
@@ -3274,6 +3329,9 @@ static void redraw(char *path)
                char sort[] = "\0 ";
                char selmode[] = "\0 ";
 
+               if (cfg.selmode)
+                       selmode[0] = 'Y';
+
                if (cfg.mtimeorder)
                        sort[0] = cfg.mtime ? 'T' : 'A';
                else if (cfg.sizeorder)
@@ -3281,9 +3339,6 @@ static void redraw(char *path)
                else if (cfg.extnorder)
                        sort[0] = 'E';
 
-               if (cfg.selmode)
-                       selmode[0] = 'Y';
-
                /* Get the file extension for regular files */
                if (S_ISREG(dents[cur].mode)) {
                        i = (int)strlen(dents[cur].name);
@@ -3295,14 +3350,24 @@ static void redraw(char *path)
                } else
                        ptr = "\b";
 
-               /* Get the unescaped file name */
-               base = unescape(dents[cur].name, NAME_MAX, NULL);
-
                /* We need to show filename as it may be truncated in directory listing */
-               if (!cfg.showdetail || !cfg.blkorder)
+               if (!cfg.showdetail && !cfg.blkorder) { /* light mode */
+                       /* Timestamp */
+                       strftime(buf, 18, "%F %R", localtime(&dents[cur].t));
+
+                       mvprintw(lastln, 0, "%d/%d (%d) %s%s%s %s %s\n",
+                                cur + 1, ndents, nselected, selmode, sort, buf,
+                                get_lsperms(dents[cur].mode), ptr);
+               } else if (!cfg.blkorder) { /* detail mode */
+                       /* Get the unescaped file name */
+                       base = unescape(dents[cur].name, NAME_MAX, NULL);
+
                        mvprintw(lastln, 0, "%d/%d (%d) %s%s%s [%s]\n",
                                 cur + 1, ndents, nselected, selmode, sort, ptr, base);
-               else {
+               } else { /* du mode */
+                       /* Get the unescaped file name */
+                       base = unescape(dents[cur].name, NAME_MAX, NULL);
+
                        xstrlcpy(buf, coolsize(dir_blocks << BLK_SHIFT), 12);
                        c = cfg.apparentsz ? 'a' : 'd';