mirror of https://github.com/xzeldon/htop.git
Update generic process field display
- sort cases by identifier - use check snprintf - color nice value of 0 as gray - color cpu and memory percentages of 0.0 as gray - color number of threads of 1 as gray - color idle and sleeping state as gray - color tgid matching pid (indicating main thread) as gray
This commit is contained in:
parent
d5de1bc23d
commit
fee744abd2
112
Process.c
112
Process.c
|
@ -119,16 +119,10 @@ void Process_humanNumber(RichString* str, unsigned long long number, bool colori
|
||||||
void Process_colorNumber(RichString* str, unsigned long long number, bool coloring) {
|
void Process_colorNumber(RichString* str, unsigned long long number, bool coloring) {
|
||||||
char buffer[13];
|
char buffer[13];
|
||||||
|
|
||||||
int largeNumberColor = CRT_colors[LARGE_NUMBER];
|
int largeNumberColor = coloring ? CRT_colors[LARGE_NUMBER] : CRT_colors[PROCESS];
|
||||||
int processMegabytesColor = CRT_colors[PROCESS_MEGABYTES];
|
int processMegabytesColor = coloring ? CRT_colors[PROCESS_MEGABYTES] : CRT_colors[PROCESS];
|
||||||
int processColor = CRT_colors[PROCESS];
|
int processColor = CRT_colors[PROCESS];
|
||||||
int processShadowColor = CRT_colors[PROCESS_SHADOW];
|
int processShadowColor = coloring ? CRT_colors[PROCESS_SHADOW] : CRT_colors[PROCESS];
|
||||||
|
|
||||||
if (!coloring) {
|
|
||||||
largeNumberColor = CRT_colors[PROCESS];
|
|
||||||
processMegabytesColor = CRT_colors[PROCESS];
|
|
||||||
processShadowColor = CRT_colors[PROCESS];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (number == ULLONG_MAX) {
|
if (number == ULLONG_MAX) {
|
||||||
RichString_appendAscii(str, CRT_colors[PROCESS_SHADOW], " N/A ");
|
RichString_appendAscii(str, CRT_colors[PROCESS_SHADOW], " N/A ");
|
||||||
|
@ -251,37 +245,14 @@ void Process_printLeftAlignedField(RichString* str, int attr, const char* conten
|
||||||
}
|
}
|
||||||
|
|
||||||
void Process_writeField(const Process* this, RichString* str, ProcessField field) {
|
void Process_writeField(const Process* this, RichString* str, ProcessField field) {
|
||||||
char buffer[256]; buffer[255] = '\0';
|
char buffer[256];
|
||||||
|
size_t n = sizeof(buffer);
|
||||||
int attr = CRT_colors[DEFAULT_COLOR];
|
int attr = CRT_colors[DEFAULT_COLOR];
|
||||||
int baseattr = CRT_colors[PROCESS_BASENAME];
|
|
||||||
size_t n = sizeof(buffer) - 1;
|
|
||||||
bool coloring = this->settings->highlightMegabytes;
|
bool coloring = this->settings->highlightMegabytes;
|
||||||
|
|
||||||
switch (field) {
|
switch (field) {
|
||||||
case PERCENT_CPU:
|
|
||||||
case PERCENT_NORM_CPU: {
|
|
||||||
float cpuPercentage = this->percent_cpu;
|
|
||||||
if (field == PERCENT_NORM_CPU) {
|
|
||||||
cpuPercentage /= this->processList->cpuCount;
|
|
||||||
}
|
|
||||||
if (cpuPercentage > 999.9) {
|
|
||||||
xSnprintf(buffer, n, "%4u ", (unsigned int)cpuPercentage);
|
|
||||||
} else if (cpuPercentage > 99.9) {
|
|
||||||
xSnprintf(buffer, n, "%3u. ", (unsigned int)cpuPercentage);
|
|
||||||
} else {
|
|
||||||
xSnprintf(buffer, n, "%4.1f ", cpuPercentage);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case PERCENT_MEM: {
|
|
||||||
if (this->percent_mem > 99.9) {
|
|
||||||
xSnprintf(buffer, n, "100. ");
|
|
||||||
} else {
|
|
||||||
xSnprintf(buffer, n, "%4.1f ", this->percent_mem);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case COMM: {
|
case COMM: {
|
||||||
|
int baseattr = CRT_colors[PROCESS_BASENAME];
|
||||||
if (this->settings->highlightThreads && Process_isThread(this)) {
|
if (this->settings->highlightThreads && Process_isThread(this)) {
|
||||||
attr = CRT_colors[PROCESS_THREAD];
|
attr = CRT_colors[PROCESS_THREAD];
|
||||||
baseattr = CRT_colors[PROCESS_THREAD_BASENAME];
|
baseattr = CRT_colors[PROCESS_THREAD_BASENAME];
|
||||||
|
@ -289,7 +260,8 @@ void Process_writeField(const Process* this, RichString* str, ProcessField field
|
||||||
if (!this->settings->treeView || this->indent == 0) {
|
if (!this->settings->treeView || this->indent == 0) {
|
||||||
Process_writeCommand(this, attr, baseattr, str);
|
Process_writeCommand(this, attr, baseattr, str);
|
||||||
return;
|
return;
|
||||||
} else {
|
}
|
||||||
|
|
||||||
char* buf = buffer;
|
char* buf = buffer;
|
||||||
int maxIndent = 0;
|
int maxIndent = 0;
|
||||||
bool lastItem = (this->indent < 0);
|
bool lastItem = (this->indent < 0);
|
||||||
|
@ -304,9 +276,9 @@ void Process_writeField(const Process* this, RichString* str, ProcessField field
|
||||||
for (int i = 0; i < maxIndent - 1; i++) {
|
for (int i = 0; i < maxIndent - 1; i++) {
|
||||||
int written, ret;
|
int written, ret;
|
||||||
if (indent & (1 << i)) {
|
if (indent & (1 << i)) {
|
||||||
ret = snprintf(buf, n, "%s ", CRT_treeStr[TREE_STR_VERT]);
|
ret = xSnprintf(buf, n, "%s ", CRT_treeStr[TREE_STR_VERT]);
|
||||||
} else {
|
} else {
|
||||||
ret = snprintf(buf, n, " ");
|
ret = xSnprintf(buf, n, " ");
|
||||||
}
|
}
|
||||||
if (ret < 0 || (size_t)ret >= n) {
|
if (ret < 0 || (size_t)ret >= n) {
|
||||||
written = n;
|
written = n;
|
||||||
|
@ -323,47 +295,85 @@ void Process_writeField(const Process* this, RichString* str, ProcessField field
|
||||||
Process_writeCommand(this, attr, baseattr, str);
|
Process_writeCommand(this, attr, baseattr, str);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
case MAJFLT: Process_colorNumber(str, this->majflt, coloring); return;
|
case MAJFLT: Process_colorNumber(str, this->majflt, coloring); return;
|
||||||
case MINFLT: Process_colorNumber(str, this->minflt, coloring); return;
|
case MINFLT: Process_colorNumber(str, this->minflt, coloring); return;
|
||||||
case M_RESIDENT: Process_humanNumber(str, this->m_resident, coloring); return;
|
case M_RESIDENT: Process_humanNumber(str, this->m_resident, coloring); return;
|
||||||
case M_VIRT: Process_humanNumber(str, this->m_virt, coloring); return;
|
case M_VIRT: Process_humanNumber(str, this->m_virt, coloring); return;
|
||||||
case NICE: {
|
case NICE:
|
||||||
xSnprintf(buffer, n, "%3ld ", this->nice);
|
xSnprintf(buffer, n, "%3ld ", this->nice);
|
||||||
attr = this->nice < 0 ? CRT_colors[PROCESS_HIGH_PRIORITY]
|
attr = this->nice < 0 ? CRT_colors[PROCESS_HIGH_PRIORITY]
|
||||||
: this->nice > 0 ? CRT_colors[PROCESS_LOW_PRIORITY]
|
: this->nice > 0 ? CRT_colors[PROCESS_LOW_PRIORITY]
|
||||||
: attr;
|
: CRT_colors[PROCESS_SHADOW];
|
||||||
|
break;
|
||||||
|
case NLWP:
|
||||||
|
if (this->nlwp == 1)
|
||||||
|
attr = CRT_colors[PROCESS_SHADOW];
|
||||||
|
|
||||||
|
xSnprintf(buffer, n, "%4ld ", this->nlwp);
|
||||||
|
break;
|
||||||
|
case PERCENT_CPU:
|
||||||
|
case PERCENT_NORM_CPU: {
|
||||||
|
float cpuPercentage = this->percent_cpu;
|
||||||
|
if (field == PERCENT_NORM_CPU) {
|
||||||
|
cpuPercentage /= this->processList->cpuCount;
|
||||||
|
}
|
||||||
|
if (cpuPercentage > 999.9f) {
|
||||||
|
xSnprintf(buffer, n, "%4u ", (unsigned int)cpuPercentage);
|
||||||
|
} else if (cpuPercentage > 99.9f) {
|
||||||
|
xSnprintf(buffer, n, "%3u. ", (unsigned int)cpuPercentage);
|
||||||
|
} else {
|
||||||
|
if (cpuPercentage < 0.05f)
|
||||||
|
attr = CRT_colors[PROCESS_SHADOW];
|
||||||
|
|
||||||
|
xSnprintf(buffer, n, "%4.1f ", cpuPercentage);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case NLWP: xSnprintf(buffer, n, "%4ld ", this->nlwp); break;
|
case PERCENT_MEM:
|
||||||
|
if (this->percent_mem > 99.9f) {
|
||||||
|
xSnprintf(buffer, n, "100. ");
|
||||||
|
} else {
|
||||||
|
if (this->percent_mem < 0.05f)
|
||||||
|
attr = CRT_colors[PROCESS_SHADOW];
|
||||||
|
|
||||||
|
xSnprintf(buffer, n, "%4.1f ", this->percent_mem);
|
||||||
|
}
|
||||||
|
break;
|
||||||
case PGRP: xSnprintf(buffer, n, "%*d ", Process_pidDigits, this->pgrp); break;
|
case PGRP: xSnprintf(buffer, n, "%*d ", Process_pidDigits, this->pgrp); break;
|
||||||
case PID: xSnprintf(buffer, n, "%*d ", Process_pidDigits, this->pid); break;
|
case PID: xSnprintf(buffer, n, "%*d ", Process_pidDigits, this->pid); break;
|
||||||
case PPID: xSnprintf(buffer, n, "%*d ", Process_pidDigits, this->ppid); break;
|
case PPID: xSnprintf(buffer, n, "%*d ", Process_pidDigits, this->ppid); break;
|
||||||
case PRIORITY: {
|
case PRIORITY:
|
||||||
if(this->priority <= -100)
|
if (this->priority <= -100)
|
||||||
xSnprintf(buffer, n, " RT ");
|
xSnprintf(buffer, n, " RT ");
|
||||||
else
|
else
|
||||||
xSnprintf(buffer, n, "%3ld ", this->priority);
|
xSnprintf(buffer, n, "%3ld ", this->priority);
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
case PROCESSOR: xSnprintf(buffer, n, "%3d ", Settings_cpuId(this->settings, this->processor)); break;
|
case PROCESSOR: xSnprintf(buffer, n, "%3d ", Settings_cpuId(this->settings, this->processor)); break;
|
||||||
case SESSION: xSnprintf(buffer, n, "%*d ", Process_pidDigits, this->session); break;
|
case SESSION: xSnprintf(buffer, n, "%*d ", Process_pidDigits, this->session); break;
|
||||||
case STARTTIME: xSnprintf(buffer, n, "%s", this->starttime_show); break;
|
case STARTTIME: xSnprintf(buffer, n, "%s", this->starttime_show); break;
|
||||||
case STATE: {
|
case STATE:
|
||||||
xSnprintf(buffer, n, "%c ", this->state);
|
xSnprintf(buffer, n, "%c ", this->state);
|
||||||
switch(this->state) {
|
switch (this->state) {
|
||||||
case 'R':
|
case 'R':
|
||||||
attr = CRT_colors[PROCESS_R_STATE];
|
attr = CRT_colors[PROCESS_R_STATE];
|
||||||
break;
|
break;
|
||||||
case 'D':
|
case 'D':
|
||||||
attr = CRT_colors[PROCESS_D_STATE];
|
attr = CRT_colors[PROCESS_D_STATE];
|
||||||
break;
|
break;
|
||||||
}
|
case 'I':
|
||||||
|
case 'S':
|
||||||
|
attr = CRT_colors[PROCESS_SHADOW];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
case ST_UID: xSnprintf(buffer, n, "%5d ", this->st_uid); break;
|
case ST_UID: xSnprintf(buffer, n, "%5d ", this->st_uid); break;
|
||||||
case TIME: Process_printTime(str, this->time); return;
|
case TIME: Process_printTime(str, this->time); return;
|
||||||
case TGID: xSnprintf(buffer, n, "%*d ", Process_pidDigits, this->tgid); break;
|
case TGID:
|
||||||
|
if (this->tgid == this->pid)
|
||||||
|
attr = CRT_colors[PROCESS_SHADOW];
|
||||||
|
|
||||||
|
xSnprintf(buffer, n, "%*d ", Process_pidDigits, this->tgid);
|
||||||
|
break;
|
||||||
case TPGID: xSnprintf(buffer, n, "%*d ", Process_pidDigits, this->tpgid); break;
|
case TPGID: xSnprintf(buffer, n, "%*d ", Process_pidDigits, this->tpgid); break;
|
||||||
case TTY_NR: {
|
case TTY_NR: {
|
||||||
unsigned int major = major(this->tty_nr);
|
unsigned int major = major(this->tty_nr);
|
||||||
|
@ -376,7 +386,7 @@ void Process_writeField(const Process* this, RichString* str, ProcessField field
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case USER: {
|
case USER:
|
||||||
if (Process_getuid != this->st_uid)
|
if (Process_getuid != this->st_uid)
|
||||||
attr = CRT_colors[PROCESS_SHADOW];
|
attr = CRT_colors[PROCESS_SHADOW];
|
||||||
|
|
||||||
|
@ -387,8 +397,8 @@ void Process_writeField(const Process* this, RichString* str, ProcessField field
|
||||||
|
|
||||||
xSnprintf(buffer, n, "%-9d ", this->st_uid);
|
xSnprintf(buffer, n, "%-9d ", this->st_uid);
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
default:
|
default:
|
||||||
|
assert(0); /* should never be reached */
|
||||||
xSnprintf(buffer, n, "- ");
|
xSnprintf(buffer, n, "- ");
|
||||||
}
|
}
|
||||||
RichString_appendWide(str, attr, buffer);
|
RichString_appendWide(str, attr, buffer);
|
||||||
|
|
Loading…
Reference in New Issue