Process: Display single digit precision for CPU% greater than 99.9%

Since commit edf319e[1], we're dynamically adjusting column width of
"CPU%", showing single digit precision also for values greater than
"99.9%" makes "CPU%" column consistent with all other values.

[1]: edf319e53d

Change "Process_printPercentage()" function's logic to always display
value (i.e. "val") with single precision. Except when value is greater
than "99.9%" for columns like "MEM%", whose width is fixed to "4" and
value cannot go beyond "100%".

Credits: @Explorer09, thanks for the patch[2] to fix title alignment
         issue.

[2]: https://github.com/htop-dev/htop/pull/959#issuecomment-1092480951

Closes: #957
This commit is contained in:
Kumar 2022-04-14 16:35:02 +05:30 committed by BenBE
parent e053446cbd
commit 0af08bcfc9
11 changed files with 28 additions and 21 deletions

View File

@ -739,17 +739,20 @@ void Process_printLeftAlignedField(RichString* str, int attr, const char* conten
void Process_printPercentage(float val, char* buffer, int n, uint8_t width, int* attr) { void Process_printPercentage(float val, char* buffer, int n, uint8_t width, int* attr) {
if (val >= 0) { if (val >= 0) {
if (val < 99.9F) { if (val < 0.05F)
if (val < 0.05F) {
*attr = CRT_colors[PROCESS_SHADOW]; *attr = CRT_colors[PROCESS_SHADOW];
} else if (val >= 99.9F)
xSnprintf(buffer, n, "%*.1f ", width, val);
} else {
*attr = CRT_colors[PROCESS_MEGABYTES]; *attr = CRT_colors[PROCESS_MEGABYTES];
if (val < 100.0F)
val = 100.0F; // Don't round down and display "val" as "99". int precision = 1;
xSnprintf(buffer, n, "%*.0f ", width, val);
// Display "val" as "100" for columns like "MEM%".
if (width == 4 && val > 99.9F) {
precision = 0;
val = 100.0F;
} }
xSnprintf(buffer, n, "%*.*f ", width, precision, val);
} else { } else {
*attr = CRT_colors[PROCESS_SHADOW]; *attr = CRT_colors[PROCESS_SHADOW];
xSnprintf(buffer, n, "%*.*s ", width, width, "N/A"); xSnprintf(buffer, n, "%*.*s ", width, width, "N/A");
@ -1280,13 +1283,14 @@ void Process_updateFieldWidth(ProcessField key, size_t width) {
} }
void Process_updateCPUFieldWidths(float percentage) { void Process_updateCPUFieldWidths(float percentage) {
if (percentage < 99.9) { if (percentage < 99.9F) {
Process_updateFieldWidth(PERCENT_CPU, 4); Process_updateFieldWidth(PERCENT_CPU, 4);
Process_updateFieldWidth(PERCENT_NORM_CPU, 4); Process_updateFieldWidth(PERCENT_NORM_CPU, 4);
return; return;
} }
uint8_t width = ceil(log10(percentage + .2)); // Add additional two characters, one for "." and another for precision.
uint8_t width = ceil(log10(percentage + 0.1)) + 2;
Process_updateFieldWidth(PERCENT_CPU, width); Process_updateFieldWidth(PERCENT_CPU, width);
Process_updateFieldWidth(PERCENT_NORM_CPU, width); Process_updateFieldWidth(PERCENT_NORM_CPU, width);

View File

@ -116,6 +116,9 @@ static const char* alignedProcessFieldTitle(const ProcessList* this, ProcessFiel
if (Process_fields[field].autoWidth) { if (Process_fields[field].autoWidth) {
static char titleBuffer[UINT8_MAX + 1]; static char titleBuffer[UINT8_MAX + 1];
if (field == PERCENT_CPU)
xSnprintf(titleBuffer, sizeof(titleBuffer), "%*s ", Process_fieldWidths[field], title);
else
xSnprintf(titleBuffer, sizeof(titleBuffer), "%-*.*s ", Process_fieldWidths[field], Process_fieldWidths[field], title); xSnprintf(titleBuffer, sizeof(titleBuffer), "%-*.*s ", Process_fieldWidths[field], Process_fieldWidths[field], title);
return titleBuffer; return titleBuffer;
} }