aboutsummaryrefslogtreecommitdiffstats
path: root/AvailableMetersPanel.c
diff options
context:
space:
mode:
Diffstat (limited to 'AvailableMetersPanel.c')
-rw-r--r--AvailableMetersPanel.c102
1 files changed, 72 insertions, 30 deletions
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 <stdlib.h>
#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;
}

© 2014-2024 Faster IT GmbH | imprint | privacy policy