summaryrefslogtreecommitdiffstats
path: root/MemorySwapMeter.c
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-15 19:58:07 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-15 19:58:07 +0000
commit10eea2ab1bae2a8ec159d81c0446fd8061b33e2b (patch)
treee8270dd60ec096bee8157dbadf029e15ed584592 /MemorySwapMeter.c
parentInitial commit. (diff)
downloadhtop-10eea2ab1bae2a8ec159d81c0446fd8061b33e2b.tar.xz
htop-10eea2ab1bae2a8ec159d81c0446fd8061b33e2b.zip
Adding upstream version 3.3.0.upstream/3.3.0upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'MemorySwapMeter.c')
-rw-r--r--MemorySwapMeter.c110
1 files changed, 110 insertions, 0 deletions
diff --git a/MemorySwapMeter.c b/MemorySwapMeter.c
new file mode 100644
index 0000000..82eddee
--- /dev/null
+++ b/MemorySwapMeter.c
@@ -0,0 +1,110 @@
+/*
+htop - MemorySwapMeter.c
+(C) 2021 htop dev team
+Released under the GNU GPLv2+, see the COPYING file
+in the source distribution for its full text.
+*/
+
+#include "config.h" // IWYU pragma: keep
+
+#include "MemorySwapMeter.h"
+
+#include <assert.h>
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdlib.h>
+
+#include "Macros.h"
+#include "MemoryMeter.h"
+#include "Object.h"
+#include "SwapMeter.h"
+#include "XUtils.h"
+
+
+typedef struct MemorySwapMeterData_ {
+ Meter* memoryMeter;
+ Meter* swapMeter;
+} MemorySwapMeterData;
+
+static void MemorySwapMeter_updateValues(Meter* this) {
+ MemorySwapMeterData* data = this->meterData;
+
+ Meter_updateValues(data->memoryMeter);
+ Meter_updateValues(data->swapMeter);
+}
+
+static void MemorySwapMeter_draw(Meter* this, int x, int y, int w) {
+ MemorySwapMeterData* data = this->meterData;
+
+ /* Use the same width for each sub meter to align with CPU meter */
+ const int colwidth = w / 2;
+ const int diff = w - colwidth * 2;
+
+ assert(data->memoryMeter->draw);
+ data->memoryMeter->draw(data->memoryMeter, x, y, colwidth);
+ assert(data->swapMeter->draw);
+ data->swapMeter->draw(data->swapMeter, x + colwidth + diff, y, colwidth);
+}
+
+static void MemorySwapMeter_init(Meter* this) {
+ MemorySwapMeterData* data = this->meterData;
+
+ if (!data) {
+ data = this->meterData = xMalloc(sizeof(MemorySwapMeterData));
+ data->memoryMeter = NULL;
+ data->swapMeter = NULL;
+ }
+
+ if (!data->memoryMeter)
+ data->memoryMeter = Meter_new(this->host, 0, (const MeterClass*) Class(MemoryMeter));
+ if (!data->swapMeter)
+ data->swapMeter = Meter_new(this->host, 0, (const MeterClass*) Class(SwapMeter));
+
+ if (Meter_initFn(data->memoryMeter))
+ Meter_init(data->memoryMeter);
+ if (Meter_initFn(data->swapMeter))
+ Meter_init(data->swapMeter);
+
+ if (this->mode == 0)
+ this->mode = BAR_METERMODE;
+
+ this->h = MAXIMUM(Meter_modes[data->memoryMeter->mode]->h, Meter_modes[data->swapMeter->mode]->h);
+}
+
+static void MemorySwapMeter_updateMode(Meter* this, int mode) {
+ MemorySwapMeterData* data = this->meterData;
+
+ this->mode = mode;
+
+ Meter_setMode(data->memoryMeter, mode);
+ Meter_setMode(data->swapMeter, mode);
+
+ this->h = MAXIMUM(Meter_modes[data->memoryMeter->mode]->h, Meter_modes[data->swapMeter->mode]->h);
+}
+
+static void MemorySwapMeter_done(Meter* this) {
+ MemorySwapMeterData* data = this->meterData;
+
+ Meter_delete((Object*)data->swapMeter);
+ Meter_delete((Object*)data->memoryMeter);
+
+ free(data);
+}
+
+const MeterClass MemorySwapMeter_class = {
+ .super = {
+ .extends = Class(Meter),
+ .delete = Meter_delete,
+ },
+ .updateValues = MemorySwapMeter_updateValues,
+ .defaultMode = CUSTOM_METERMODE,
+ .isMultiColumn = true,
+ .name = "MemorySwap",
+ .uiName = "Memory & Swap",
+ .description = "Combined memory and swap usage",
+ .caption = "M&S",
+ .draw = MemorySwapMeter_draw,
+ .init = MemorySwapMeter_init,
+ .updateMode = MemorySwapMeter_updateMode,
+ .done = MemorySwapMeter_done
+};