mirror of
https://github.com/jarun/nnn.git
synced 2025-01-26 02:36:36 +00:00
Refactor printent/printent_long (DRY) (#934)
* Refactor printent/printent_long (DRY) * Extend selection gap for icons, fix device names.
This commit is contained in:
parent
a6a09338a2
commit
98a0f7484a
304
src/nnn.c
304
src/nnn.c
|
@ -3598,84 +3598,111 @@ static void print_time(const time_t *timep)
|
||||||
t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min);
|
t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void printent(const struct entry *ent, uint_t namecols, bool sel)
|
static char get_detail_ind(const struct entry *ent)
|
||||||
{
|
{
|
||||||
uchar_t pair = 0;
|
switch (ent->mode & S_IFMT) {
|
||||||
char ind = '\0';
|
case S_IFDIR:
|
||||||
int attrs = 0;
|
case S_IFREG:
|
||||||
|
return ' ';
|
||||||
|
case S_IFLNK:
|
||||||
|
return '@';
|
||||||
|
case S_IFSOCK:
|
||||||
|
return '=';
|
||||||
|
case S_IFIFO:
|
||||||
|
return '|';
|
||||||
|
case S_IFBLK:
|
||||||
|
return 'b';
|
||||||
|
case S_IFCHR:
|
||||||
|
return 'c';
|
||||||
|
}
|
||||||
|
return '?';
|
||||||
|
}
|
||||||
|
|
||||||
|
static char get_name_ind(const struct entry *ent)
|
||||||
|
{
|
||||||
switch (ent->mode & S_IFMT) {
|
switch (ent->mode & S_IFMT) {
|
||||||
case S_IFREG:
|
case S_IFREG:
|
||||||
if (ent->mode & 0100) {
|
return (ent->mode & 0100) ? '*' : '\0';
|
||||||
pair = C_EXE;
|
|
||||||
ind = '*';
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!ent->size)
|
|
||||||
pair = C_UND;
|
|
||||||
else if (ent->flags & HARD_LINK)
|
|
||||||
pair = C_HRD;
|
|
||||||
else if (!pair)
|
|
||||||
pair = C_FIL;
|
|
||||||
break;
|
|
||||||
case S_IFDIR:
|
case S_IFDIR:
|
||||||
pair = C_DIR;
|
return '/';
|
||||||
if (!g_state.oldcolor) {
|
case S_IFLNK:
|
||||||
|
return (ent->flags & DIR_OR_LINK_TO_DIR) ? '/' : '@';
|
||||||
|
case S_IFSOCK:
|
||||||
|
return '=';
|
||||||
|
case S_IFIFO:
|
||||||
|
return '|';
|
||||||
|
case S_IFBLK:
|
||||||
|
case S_IFCHR:
|
||||||
|
return '\0';
|
||||||
|
}
|
||||||
|
return '?';
|
||||||
|
}
|
||||||
|
|
||||||
|
static uchar_t get_color_pair(const struct entry *ent, bool detailed)
|
||||||
|
{
|
||||||
|
switch (ent->mode & S_IFMT) {
|
||||||
|
case S_IFREG:
|
||||||
|
if (!ent->size)
|
||||||
|
return C_UND;
|
||||||
|
if (ent->flags & HARD_LINK)
|
||||||
|
return C_HRD;
|
||||||
|
if (ent->mode & 0100)
|
||||||
|
return C_EXE;
|
||||||
|
return C_FIL;
|
||||||
|
case S_IFLNK:
|
||||||
|
if (!g_state.oldcolor || detailed)
|
||||||
|
return (ent->flags & SYM_ORPHAN) ? C_ORP : C_LNK;
|
||||||
|
return 0;
|
||||||
|
case S_IFDIR:
|
||||||
|
return (!g_state.oldcolor && g_state.dirctx) ? cfg.curctx + 1 : C_DIR;
|
||||||
|
case S_IFSOCK:
|
||||||
|
return C_SOC;
|
||||||
|
case S_IFIFO:
|
||||||
|
return C_PIP;
|
||||||
|
case S_IFBLK:
|
||||||
|
return C_BLK;
|
||||||
|
case S_IFCHR:
|
||||||
|
return C_CHR;
|
||||||
|
}
|
||||||
|
return C_UND;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void (*printptr)(const struct entry *ent, uint_t namecols, bool sel);
|
||||||
|
static void printent_long(const struct entry *ent, uint_t namecols, bool sel);
|
||||||
|
|
||||||
|
static void printent(const struct entry *ent, uint_t namecols, bool sel)
|
||||||
|
{
|
||||||
|
bool detailed = (printptr == &printent_long);
|
||||||
|
uchar_t color_pair = get_color_pair(ent, detailed);
|
||||||
|
char ind = get_name_ind(ent);
|
||||||
|
int attrs = 0;
|
||||||
|
|
||||||
|
if (!detailed)
|
||||||
|
addch((ent->flags & FILE_SELECTED) ? '+' : ' ');
|
||||||
|
|
||||||
|
/* Directories are always shown on top */
|
||||||
|
resetdircolor(ent->flags);
|
||||||
|
|
||||||
|
switch (ent->mode & S_IFMT) {
|
||||||
|
case S_IFDIR:
|
||||||
|
if (!g_state.oldcolor)
|
||||||
attrs |= A_BOLD;
|
attrs |= A_BOLD;
|
||||||
if (g_state.dirctx)
|
|
||||||
pair = cfg.curctx + 1;
|
|
||||||
}
|
|
||||||
ind = '/';
|
|
||||||
break;
|
break;
|
||||||
case S_IFLNK:
|
case S_IFLNK:
|
||||||
if (ent->flags & DIR_OR_LINK_TO_DIR) {
|
if (ent->flags & DIR_OR_LINK_TO_DIR && !g_state.oldcolor)
|
||||||
if (!g_state.oldcolor)
|
attrs |= A_BOLD;
|
||||||
attrs |= A_BOLD;
|
|
||||||
ind = '/';
|
|
||||||
} else
|
|
||||||
ind = '@';
|
|
||||||
|
|
||||||
if (g_state.oldcolor)
|
if (g_state.oldcolor)
|
||||||
attrs |= A_DIM;
|
attrs |= A_DIM;
|
||||||
else
|
|
||||||
pair = (ent->flags & SYM_ORPHAN) ? C_ORP : C_LNK;
|
|
||||||
break;
|
|
||||||
case S_IFSOCK:
|
|
||||||
pair = C_SOC;
|
|
||||||
ind = '=';
|
|
||||||
break;
|
|
||||||
case S_IFIFO:
|
|
||||||
pair = C_PIP;
|
|
||||||
ind = '|';
|
|
||||||
break;
|
|
||||||
case S_IFBLK:
|
|
||||||
pair = C_BLK;
|
|
||||||
break;
|
|
||||||
case S_IFCHR:
|
|
||||||
pair = C_CHR;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
pair = C_UND;
|
|
||||||
ind = '?';
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!g_state.oldcolor) {
|
if (!g_state.oldcolor) {
|
||||||
if (ent->flags & FILE_MISSING)
|
if (ent->flags & FILE_MISSING)
|
||||||
pair = C_MIS;
|
color_pair = C_MIS;
|
||||||
|
if (color_pair && fcolors[color_pair])
|
||||||
if (pair && fcolors[pair])
|
attrs |= COLOR_PAIR(color_pair);
|
||||||
attrs |= COLOR_PAIR(pair);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ind)
|
|
||||||
++namecols;
|
|
||||||
|
|
||||||
/* Directories are always shown on top */
|
|
||||||
resetdircolor(ent->flags);
|
|
||||||
|
|
||||||
addch((ent->flags & FILE_SELECTED) ? '+' : ' ');
|
|
||||||
|
|
||||||
#ifdef ICONS_ENABLED
|
#ifdef ICONS_ENABLED
|
||||||
if (!g_state.oldcolor)
|
if (!g_state.oldcolor)
|
||||||
print_icon(ent, attrs);
|
print_icon(ent, attrs);
|
||||||
|
@ -3686,6 +3713,9 @@ static void printent(const struct entry *ent, uint_t namecols, bool sel)
|
||||||
if (attrs)
|
if (attrs)
|
||||||
attron(attrs);
|
attron(attrs);
|
||||||
|
|
||||||
|
if (!ind)
|
||||||
|
++namecols;
|
||||||
|
|
||||||
#ifndef NOLOCALE
|
#ifndef NOLOCALE
|
||||||
addwstr(unescape(ent->name, namecols));
|
addwstr(unescape(ent->name, namecols));
|
||||||
#else
|
#else
|
||||||
|
@ -3694,37 +3724,21 @@ static void printent(const struct entry *ent, uint_t namecols, bool sel)
|
||||||
|
|
||||||
if (attrs)
|
if (attrs)
|
||||||
attroff(attrs);
|
attroff(attrs);
|
||||||
|
|
||||||
if (ind)
|
if (ind)
|
||||||
addch(ind);
|
addch(ind);
|
||||||
addch('\n');
|
addch('\n');
|
||||||
}
|
}
|
||||||
|
|
||||||
static void printent_long(const struct entry *ent, uint_t namecols, bool sel)
|
static void print_details(const struct entry *ent)
|
||||||
{
|
{
|
||||||
bool ln = FALSE;
|
int entry_type = ent->mode & S_IFMT;
|
||||||
char ind1 = '\0', ind2 = '\0';
|
|
||||||
uchar_t pair = 0;
|
|
||||||
int attrs = sel ? (A_REVERSE | (g_state.oldcolor ? A_DIM : COLOR_PAIR(C_MIS)))
|
|
||||||
: (g_state.oldcolor ? A_DIM : COLOR_PAIR(C_MIS));
|
|
||||||
uint_t len;
|
|
||||||
char *size;
|
char *size;
|
||||||
char selgap[] = " ";
|
uint_t len;
|
||||||
|
|
||||||
if (ent->flags & FILE_SELECTED)
|
|
||||||
selgap[1] = '+';
|
|
||||||
|
|
||||||
/* Directories are always shown on top */
|
/* Directories are always shown on top */
|
||||||
resetdircolor(ent->flags);
|
resetdircolor(ent->flags);
|
||||||
|
|
||||||
addch(' ');
|
|
||||||
|
|
||||||
if (attrs)
|
|
||||||
attron(attrs);
|
|
||||||
|
|
||||||
/* Timestamp */
|
|
||||||
print_time(&ent->t);
|
print_time(&ent->t);
|
||||||
|
|
||||||
addstr(" ");
|
addstr(" ");
|
||||||
|
|
||||||
/* Permissions */
|
/* Permissions */
|
||||||
|
@ -3732,125 +3746,37 @@ static void printent_long(const struct entry *ent, uint_t namecols, bool sel)
|
||||||
addch('0' + ((ent->mode >> 3) & 7));
|
addch('0' + ((ent->mode >> 3) & 7));
|
||||||
addch('0' + (ent->mode & 7));
|
addch('0' + (ent->mode & 7));
|
||||||
|
|
||||||
switch (ent->mode & S_IFMT) {
|
if (entry_type == S_IFREG || entry_type == S_IFDIR) {
|
||||||
case S_IFDIR:
|
|
||||||
pair = C_DIR;
|
|
||||||
if (!g_state.oldcolor) {
|
|
||||||
attrs |= A_BOLD;
|
|
||||||
if (g_state.dirctx)
|
|
||||||
pair = cfg.curctx + 1;
|
|
||||||
}
|
|
||||||
ind2 = '/'; // fallthrough
|
|
||||||
case S_IFREG:
|
|
||||||
if (!ind2) {
|
|
||||||
if (ent->mode & 0100) {
|
|
||||||
pair = C_EXE;
|
|
||||||
ind2 = '*';
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ent->flags & HARD_LINK) {
|
|
||||||
pair = C_HRD;
|
|
||||||
ln = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!ent->size)
|
|
||||||
pair = C_UND;
|
|
||||||
else if (!pair)
|
|
||||||
pair = C_FIL;
|
|
||||||
|
|
||||||
if (!ind2) /* Add a column if end indicator is not needed */
|
|
||||||
++namecols;
|
|
||||||
}
|
|
||||||
|
|
||||||
size = coolsize(cfg.blkorder ? ent->blocks << blk_shift : ent->size);
|
size = coolsize(cfg.blkorder ? ent->blocks << blk_shift : ent->size);
|
||||||
len = 10 - (uint_t)xstrlen(size);
|
len = 10 - (uint_t)xstrlen(size);
|
||||||
while (--len)
|
while (--len)
|
||||||
addch(' ');
|
addch(' ');
|
||||||
addstr(size);
|
addstr(size);
|
||||||
break;
|
|
||||||
case S_IFLNK:
|
|
||||||
ln = TRUE;
|
|
||||||
pair = (ent->flags & SYM_ORPHAN) ? C_ORP : C_LNK;
|
|
||||||
ind1 = '@';
|
|
||||||
ind2 = (ent->flags & DIR_OR_LINK_TO_DIR) ? '/' : '@';
|
|
||||||
if (ind2 == '/' && !g_state.oldcolor)
|
|
||||||
attrs |= A_BOLD; // fallthrough
|
|
||||||
case S_IFSOCK:
|
|
||||||
if (!ind1) {
|
|
||||||
pair = C_SOC;
|
|
||||||
ind1 = ind2 = '=';
|
|
||||||
} // fallthrough
|
|
||||||
case S_IFIFO:
|
|
||||||
if (!ind1) {
|
|
||||||
pair = C_PIP;
|
|
||||||
ind1 = ind2 = '|';
|
|
||||||
} // fallthrough
|
|
||||||
case S_IFBLK:
|
|
||||||
if (!ind1) {
|
|
||||||
pair = C_BLK;
|
|
||||||
ind1 = 'b';
|
|
||||||
} // fallthrough
|
|
||||||
case S_IFCHR:
|
|
||||||
if (!ind1) {
|
|
||||||
pair = C_CHR;
|
|
||||||
ind1 = 'c';
|
|
||||||
} // fallthrough
|
|
||||||
default:
|
|
||||||
if (!ind1) {
|
|
||||||
pair = C_UND;
|
|
||||||
ind1 = ind2 = '?';
|
|
||||||
}
|
|
||||||
addstr(" ");
|
|
||||||
addch(ind1);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (g_state.oldcolor) {
|
|
||||||
if (!sel)
|
|
||||||
attroff(A_DIM);
|
|
||||||
addstr(selgap);
|
|
||||||
if (!ln) {
|
|
||||||
attroff(A_DIM);
|
|
||||||
attrs ^= A_DIM;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
if (!sel)
|
addstr(" ");
|
||||||
attroff(COLOR_PAIR(C_MIS));
|
addch(get_detail_ind(ent));
|
||||||
#ifndef ICONS_ENABLED
|
|
||||||
addstr(selgap);
|
|
||||||
#endif
|
|
||||||
if (ent->flags & FILE_MISSING)
|
|
||||||
pair = C_MIS;
|
|
||||||
else {
|
|
||||||
attroff(COLOR_PAIR(C_MIS));
|
|
||||||
attrs ^= (COLOR_PAIR(C_MIS));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pair && fcolors[pair])
|
|
||||||
attrs |= COLOR_PAIR(pair);
|
|
||||||
#ifdef ICONS_ENABLED
|
|
||||||
attroff(attrs);
|
|
||||||
addstr(selgap);
|
|
||||||
if (sel)
|
|
||||||
attrs &= ~A_REVERSE;
|
|
||||||
print_icon(ent, attrs);
|
|
||||||
if (sel)
|
|
||||||
attrs |= A_REVERSE;
|
|
||||||
#endif
|
|
||||||
attron(attrs);
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef NOLOCALE
|
static void printent_long(const struct entry *ent, uint_t namecols, bool sel)
|
||||||
addwstr(unescape(ent->name, namecols));
|
{
|
||||||
#else
|
int attrs1 = g_state.oldcolor ? A_DIM : COLOR_PAIR(C_MIS);
|
||||||
addstr(unescape(ent->name, MIN(namecols, ent->nlen) + 1));
|
int attrs2 = sel ? A_REVERSE : 0;
|
||||||
|
|
||||||
|
addch(' ');
|
||||||
|
attron(attrs1 | attrs2);
|
||||||
|
print_details(ent);
|
||||||
|
|
||||||
|
#ifdef ICONS_ENABLED
|
||||||
|
attroff(attrs2);
|
||||||
#endif
|
#endif
|
||||||
|
addch(' ');
|
||||||
|
if (!sel)
|
||||||
|
attroff(attrs1);
|
||||||
|
addch((ent->flags & FILE_SELECTED) ? '+' : ' ');
|
||||||
|
|
||||||
if (attrs)
|
attroff(attrs1 | attrs2);
|
||||||
attroff(attrs);
|
printent(ent, namecols, sel);
|
||||||
if (ind2)
|
|
||||||
addch(ind2);
|
|
||||||
addch('\n');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void (*printptr)(const struct entry *ent, uint_t namecols, bool sel) = &printent;
|
static void (*printptr)(const struct entry *ent, uint_t namecols, bool sel) = &printent;
|
||||||
|
|
Loading…
Reference in a new issue