From 69f439eff387a6ecb52734e400b297a3c85f2285 Mon Sep 17 00:00:00 2001 From: Daniel Lange Date: Tue, 21 Sep 2021 08:35:19 +0200 Subject: New upstream version 3.1.0 --- MemorySwapMeter.c | 107 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 MemorySwapMeter.c (limited to 'MemorySwapMeter.c') diff --git a/MemorySwapMeter.c b/MemorySwapMeter.c new file mode 100644 index 0000000..612549d --- /dev/null +++ b/MemorySwapMeter.c @@ -0,0 +1,107 @@ +/* +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 "MemorySwapMeter.h" + +#include +#include +#include + +#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->pl, 0, (const MeterClass*) Class(MemoryMeter)); + if (!data->swapMeter) + data->swapMeter = Meter_new(this->pl, 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 +}; -- cgit v1.2.3