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 --- AvailableMetersPanel.c | 102 ++++++++++++++++++++++++++++++++++--------------- 1 file changed, 72 insertions(+), 30 deletions(-) (limited to 'AvailableMetersPanel.c') diff --git a/AvailableMetersPanel.c b/AvailableMetersPanel.c index 7c82229..c00aec1 100644 --- a/AvailableMetersPanel.c +++ b/AvailableMetersPanel.c @@ -12,9 +12,12 @@ in the source distribution for its full text. #include #include "CPUMeter.h" +#include "DynamicMeter.h" #include "FunctionBar.h" +#include "Hashtable.h" #include "Header.h" #include "ListItem.h" +#include "Macros.h" #include "Meter.h" #include "MetersPanel.h" #include "Object.h" @@ -27,14 +30,15 @@ static void AvailableMetersPanel_delete(Object* object) { Panel* super = (Panel*) object; AvailableMetersPanel* this = (AvailableMetersPanel*) object; Panel_done(super); + free(this->meterPanels); free(this); } -static inline void AvailableMetersPanel_addMeter(Header* header, Panel* panel, const MeterClass* type, int param, int column) { - Meter* meter = Header_addMeterByClass(header, type, param, column); - Panel_add(panel, (Object*) Meter_toListItem(meter, false)); - Panel_setSelected(panel, Panel_size(panel) - 1); - MetersPanel_setMoving((MetersPanel*)panel, true); +static inline void AvailableMetersPanel_addMeter(Header* header, MetersPanel* panel, const MeterClass* type, unsigned int param, size_t column) { + const Meter* meter = Header_addMeterByClass(header, type, param, column); + Panel_add((Panel*)panel, (Object*) Meter_toListItem(meter, false)); + Panel_setSelected((Panel*)panel, Panel_size((Panel*)panel) - 1); + MetersPanel_setMoving(panel, true); } static HandlerResult AvailableMetersPanel_eventHandler(Panel* super, int ch) { @@ -45,7 +49,7 @@ static HandlerResult AvailableMetersPanel_eventHandler(Panel* super, int ch) { if (!selected) return IGNORED; - int param = selected->key & 0xff; + unsigned int param = selected->key & 0xffff; int type = selected->key >> 16; HandlerResult result = IGNORED; bool update = false; @@ -55,7 +59,7 @@ static HandlerResult AvailableMetersPanel_eventHandler(Panel* super, int ch) { case 'l': case 'L': { - AvailableMetersPanel_addMeter(header, this->leftPanel, Platform_meterTypes[type], param, 0); + AvailableMetersPanel_addMeter(header, this->meterPanels[0], Platform_meterTypes[type], param, 0); result = HANDLED; update = true; break; @@ -67,7 +71,7 @@ static HandlerResult AvailableMetersPanel_eventHandler(Panel* super, int ch) { case 'r': case 'R': { - AvailableMetersPanel_addMeter(header, this->rightPanel, Platform_meterTypes[type], param, 1); + AvailableMetersPanel_addMeter(header, this->meterPanels[this->columns - 1], Platform_meterTypes[type], param, this->columns - 1); result = (KEY_LEFT << 16) | SYNTH_KEY; update = true; break; @@ -76,8 +80,9 @@ static HandlerResult AvailableMetersPanel_eventHandler(Panel* super, int ch) { if (update) { this->settings->changed = true; Header_calculateHeight(header); + Header_updateData(header); Header_draw(header); - ScreenManager_resize(this->scr, this->scr->x1, header->height, this->scr->x2, this->scr->y2); + ScreenManager_resize(this->scr); } return result; } @@ -90,7 +95,51 @@ const PanelClass AvailableMetersPanel_class = { .eventHandler = AvailableMetersPanel_eventHandler }; -AvailableMetersPanel* AvailableMetersPanel_new(Settings* settings, Header* header, Panel* leftMeters, Panel* rightMeters, ScreenManager* scr, ProcessList* pl) { +// Handle (&CPUMeter_class) entries in the AvailableMetersPanel +static void AvailableMetersPanel_addCPUMeters(Panel* super, const MeterClass* type, const ProcessList* pl) { + if (pl->existingCPUs > 1) { + Panel_add(super, (Object*) ListItem_new("CPU average", 0)); + for (unsigned int i = 1; i <= pl->existingCPUs; i++) { + char buffer[50]; + xSnprintf(buffer, sizeof(buffer), "%s %d", type->uiName, Settings_cpuId(pl->settings, i - 1)); + Panel_add(super, (Object*) ListItem_new(buffer, i)); + } + } else { + Panel_add(super, (Object*) ListItem_new(type->uiName, 1)); + } +} + +typedef struct { + Panel* super; + unsigned int id; + unsigned int offset; +} DynamicIterator; + +static void AvailableMetersPanel_addDynamicMeter(ATTR_UNUSED ht_key_t key, void* value, void* data) { + const DynamicMeter* meter = (const DynamicMeter*)value; + DynamicIterator* iter = (DynamicIterator*)data; + unsigned int identifier = (iter->offset << 16) | iter->id; + const char* label = meter->description ? meter->description : meter->caption; + if (!label) + label = meter->name; /* last fallback to name, guaranteed set */ + Panel_add(iter->super, (Object*) ListItem_new(label, identifier)); + iter->id++; +} + +// Handle (&DynamicMeter_class) entries in the AvailableMetersPanel +static void AvailableMetersPanel_addDynamicMeters(Panel* super, const ProcessList* pl, unsigned int offset) { + DynamicIterator iter = { .super = super, .id = 1, .offset = offset }; + assert(pl->dynamicMeters != NULL); + Hashtable_foreach(pl->dynamicMeters, AvailableMetersPanel_addDynamicMeter, &iter); +} + +// Handle remaining Platform Meter entries in the AvailableMetersPanel +static void AvailableMetersPanel_addPlatformMeter(Panel* super, const MeterClass* type, unsigned int offset) { + const char* label = type->description ? type->description : type->uiName; + Panel_add(super, (Object*) ListItem_new(label, offset << 16)); +} + +AvailableMetersPanel* AvailableMetersPanel_new(Settings* settings, Header* header, size_t columns, MetersPanel** meterPanels, ScreenManager* scr, const ProcessList* pl) { AvailableMetersPanel* this = AllocThis(AvailableMetersPanel); Panel* super = (Panel*) this; FunctionBar* fuBar = FunctionBar_newEnterEsc("Add ", "Done "); @@ -98,31 +147,24 @@ AvailableMetersPanel* AvailableMetersPanel_new(Settings* settings, Header* heade this->settings = settings; this->header = header; - this->leftPanel = leftMeters; - this->rightPanel = rightMeters; + this->columns = columns; + this->meterPanels = meterPanels; this->scr = scr; Panel_setHeader(super, "Available meters"); - // Platform_meterTypes[0] should be always (&CPUMeter_class), which we will - // handle separately in the code below. - for (int i = 1; Platform_meterTypes[i]; i++) { + // Platform_meterTypes[0] should be always (&CPUMeter_class) which we will + // handle separately in the code below. Likewise, identifiers for Dynamic + // Meters are handled separately - similar to CPUs, this allows generation + // of multiple different Meters (also using 'param' to distinguish them). + for (unsigned int i = 1; Platform_meterTypes[i]; i++) { const MeterClass* type = Platform_meterTypes[i]; assert(type != &CPUMeter_class); - const char* label = type->description ? type->description : type->uiName; - Panel_add(super, (Object*) ListItem_new(label, i << 16)); - } - // Handle (&CPUMeter_class) - const MeterClass* type = &CPUMeter_class; - int cpus = pl->cpuCount; - if (cpus > 1) { - Panel_add(super, (Object*) ListItem_new("CPU average", 0)); - for (int i = 1; i <= cpus; i++) { - char buffer[50]; - xSnprintf(buffer, sizeof(buffer), "%s %d", type->uiName, Settings_cpuId(this->settings, i - 1)); - Panel_add(super, (Object*) ListItem_new(buffer, i)); - } - } else { - Panel_add(super, (Object*) ListItem_new("CPU", 1)); + if (type == &DynamicMeter_class) + AvailableMetersPanel_addDynamicMeters(super, pl, i); + else + AvailableMetersPanel_addPlatformMeter(super, type, i); } + AvailableMetersPanel_addCPUMeters(super, &CPUMeter_class, pl); + return this; } -- cgit v1.2.3