From 5094aa37ce1f986b6c23e1c04c8fc1cea8304579 Mon Sep 17 00:00:00 2001
From: Zi Shen Lim
Date: Mon, 3 Feb 2020 03:34:51 +0000
Subject: [PATCH] Introduce 4-column CPU Meter option
Enable this option on Linux, when CPU count > 32 by default.
---
CPUMeter.c | 101 ++++++++++++++++++++++++++++++++++++++++++++++-
CPUMeter.h | 5 +++
Settings.c | 7 +++-
linux/Platform.c | 3 ++
4 files changed, 113 insertions(+), 3 deletions(-)
diff --git a/CPUMeter.c b/CPUMeter.c
index de5490df1..6cadf435f 100644
--- a/CPUMeter.c
+++ b/CPUMeter.c
@@ -152,7 +152,9 @@ static void AllCPUsMeter_init(Meter* this) {
if (this->mode == 0)
this->mode = BAR_METERMODE;
int h = Meter_modes[this->mode]->h;
- if (strchr(Meter_name(this), '2'))
+ if (strchr(Meter_name(this), '4'))
+ this->h = h * ((count+1) / 4);
+ else if (strchr(Meter_name(this), '2'))
this->h = h * ((count+1) / 2);
else
this->h = h * count;
@@ -175,12 +177,51 @@ static void AllCPUsMeter_updateMode(Meter* this, int mode) {
for (int i = 0; i < count; i++) {
Meter_setMode(meters[i], mode);
}
- if (strchr(Meter_name(this), '2'))
+ if (strchr(Meter_name(this), '4'))
+ this->h = h * ((count+1) / 4);
+ else if (strchr(Meter_name(this), '2'))
this->h = h * ((count+1) / 2);
else
this->h = h * count;
}
+static void QuadColCPUsMeter_draw(Meter* this, int x, int y, int w) {
+ Meter** meters = (Meter**) this->drawData;
+ int start, count;
+ int pad = this->pl->settings->headerMargin ? 2 : 0;
+ AllCPUsMeter_getRange(this, &start, &count);
+ int height = (count+1)/4;
+ int startY = y;
+ for (int i = 0; i < height; i++) {
+ meters[i]->draw(meters[i], x, y, (w-pad)/4);
+ y += meters[i]->h;
+ }
+ int startI = height;
+ int endI = MIN(count, 2*height);
+ int X = (w-1)/4+1+(pad/2);
+ y = startY;
+ for (int i = startI; i < endI; i++) {
+ meters[i]->draw(meters[i], x+X, y, (w-pad)/4);
+ y += meters[i]->h;
+ }
+ startI = 2*height;
+ endI = MIN(count, 3*height);
+ X = (w-1)/2+1+(pad/2);
+ y = startY;
+ for (int i = startI; i < endI; i++) {
+ meters[i]->draw(meters[i], x+X, y, (w-pad)/4);
+ y += meters[i]->h;
+ }
+ startI = 3*height;
+ endI = count;
+ X = (w-1)/4*3+1+(pad/2);
+ y = startY;
+ for (int i = startI; i < endI; i++) {
+ meters[i]->draw(meters[i], x+X, y, (w-pad)/4);
+ y += meters[i]->h;
+ }
+}
+
static void DualColCPUsMeter_draw(Meter* this, int x, int y, int w) {
Meter** meters = (Meter**) this->drawData;
int start, count;
@@ -264,6 +305,25 @@ MeterClass AllCPUs2Meter_class = {
.done = AllCPUsMeter_done
};
+MeterClass AllCPUs4Meter_class = {
+ .super = {
+ .extends = Class(Meter),
+ .delete = Meter_delete,
+ .display = CPUMeter_display
+ },
+ .defaultMode = CUSTOM_METERMODE,
+ .total = 100.0,
+ .attributes = CPUMeter_attributes,
+ .name = "AllCPUs4",
+ .uiName = "CPUs (1&2&3&4/4)",
+ .description = "CPUs (1&2&3&4/4): all CPUs in 4 shorter columns",
+ .caption = "CPU",
+ .draw = QuadColCPUsMeter_draw,
+ .init = AllCPUsMeter_init,
+ .updateMode = AllCPUsMeter_updateMode,
+ .done = AllCPUsMeter_done
+};
+
MeterClass LeftCPUsMeter_class = {
.super = {
.extends = Class(Meter),
@@ -340,3 +400,40 @@ MeterClass RightCPUs2Meter_class = {
.done = AllCPUsMeter_done
};
+MeterClass LeftCPUs4Meter_class = {
+ .super = {
+ .extends = Class(Meter),
+ .delete = Meter_delete,
+ .display = CPUMeter_display
+ },
+ .defaultMode = CUSTOM_METERMODE,
+ .total = 100.0,
+ .attributes = CPUMeter_attributes,
+ .name = "LeftCPUs4",
+ .uiName = "CPUs (1&2&3&4/8)",
+ .description = "CPUs (1&2&3&4/8): first half in 4 shorter columns",
+ .caption = "CPU",
+ .draw = QuadColCPUsMeter_draw,
+ .init = AllCPUsMeter_init,
+ .updateMode = AllCPUsMeter_updateMode,
+ .done = AllCPUsMeter_done
+};
+
+MeterClass RightCPUs4Meter_class = {
+ .super = {
+ .extends = Class(Meter),
+ .delete = Meter_delete,
+ .display = CPUMeter_display
+ },
+ .defaultMode = CUSTOM_METERMODE,
+ .total = 100.0,
+ .attributes = CPUMeter_attributes,
+ .name = "RightCPUs4",
+ .uiName = "CPUs (5&6&7&8/8)",
+ .description = "CPUs (5&6&7&8/8): second half in 4 shorter columns",
+ .caption = "CPU",
+ .draw = QuadColCPUsMeter_draw,
+ .init = AllCPUsMeter_init,
+ .updateMode = AllCPUsMeter_updateMode,
+ .done = AllCPUsMeter_done
+};
diff --git a/CPUMeter.h b/CPUMeter.h
index 2f1639680..8319962a2 100644
--- a/CPUMeter.h
+++ b/CPUMeter.h
@@ -39,6 +39,8 @@ extern MeterClass AllCPUsMeter_class;
extern MeterClass AllCPUs2Meter_class;
+extern MeterClass AllCPUs4Meter_class;
+
extern MeterClass LeftCPUsMeter_class;
extern MeterClass RightCPUsMeter_class;
@@ -47,5 +49,8 @@ extern MeterClass LeftCPUs2Meter_class;
extern MeterClass RightCPUs2Meter_class;
+extern MeterClass LeftCPUs4Meter_class;
+
+extern MeterClass RightCPUs4Meter_class;
#endif
diff --git a/Settings.c b/Settings.c
index db2fa0668..3f9a60597 100644
--- a/Settings.c
+++ b/Settings.c
@@ -116,7 +116,12 @@ static void Settings_defaultMeters(Settings* this) {
}
int r = 0;
- if (this->cpuCount > 8) {
+ if (this->cpuCount > 32) {
+ this->columns[0].names[0] = xStrdup("LeftCPUs4");
+ this->columns[0].modes[0] = BAR_METERMODE;
+ this->columns[1].names[r] = xStrdup("RightCPUs4");
+ this->columns[1].modes[r++] = BAR_METERMODE;
+ } else if (this->cpuCount > 8) {
this->columns[0].names[0] = xStrdup("LeftCPUs2");
this->columns[0].modes[0] = BAR_METERMODE;
this->columns[1].names[r] = xStrdup("RightCPUs2");
diff --git a/linux/Platform.c b/linux/Platform.c
index ab90ca74b..62222bc66 100644
--- a/linux/Platform.c
+++ b/linux/Platform.c
@@ -121,10 +121,13 @@ MeterClass* Platform_meterTypes[] = {
&HostnameMeter_class,
&AllCPUsMeter_class,
&AllCPUs2Meter_class,
+ &AllCPUs4Meter_class,
&LeftCPUsMeter_class,
&RightCPUsMeter_class,
&LeftCPUs2Meter_class,
&RightCPUs2Meter_class,
+ &LeftCPUs4Meter_class,
+ &RightCPUs4Meter_class,
&BlankMeter_class,
NULL
};