summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHisham Muhammad <hisham@gobolinux.org>2006-04-10 20:40:38 +0000
committerHisham Muhammad <hisham@gobolinux.org>2006-04-10 20:40:38 +0000
commit33113fe0d73ea3299843b483f108ef5bcfcc944f (patch)
tree4c6b50b3bc6fbe9e1a44dd3b9c56e63571c83d73
parent34bcf8050e56fc799efb1013cb92ba1b44bd6df1 (diff)
- Overhaul meters implementation;
- add AllCPUsMeter; - because of that, the new .htoprc is incompatible with previous released versions.
-rw-r--r--AvailableMetersListBox.c43
-rw-r--r--CPUMeter.c111
-rw-r--r--CPUMeter.h27
-rw-r--r--ClockMeter.c52
-rw-r--r--ClockMeter.h20
-rw-r--r--Header.c79
-rw-r--r--Header.h23
-rw-r--r--LoadAverageMeter.c79
-rw-r--r--LoadAverageMeter.h16
-rw-r--r--Makefile.am4
-rw-r--r--MemoryMeter.c67
-rw-r--r--MemoryMeter.h15
-rw-r--r--Meter.c504
-rw-r--r--Meter.h151
-rw-r--r--MetersListBox.c5
-rw-r--r--ProcessList.c2
-rw-r--r--Settings.c29
-rw-r--r--Settings.h8
-rw-r--r--SwapMeter.c51
-rw-r--r--SwapMeter.h13
-rw-r--r--TasksMeter.c43
-rw-r--r--TasksMeter.h13
-rw-r--r--UptimeMeter.c83
-rw-r--r--UptimeMeter.h19
24 files changed, 765 insertions, 692 deletions
diff --git a/AvailableMetersListBox.c b/AvailableMetersListBox.c
index 757cd59d..21c0eddb 100644
--- a/AvailableMetersListBox.c
+++ b/AvailableMetersListBox.c
@@ -35,19 +35,23 @@ AvailableMetersListBox* AvailableMetersListBox_new(Settings* settings, ListBox*
super->eventHandler = AvailableMetersListBox_EventHandler;
ListBox_setHeader(super, "Available meters");
- ListBox_add(super, (Object*) ListItem_new("Swap", 0));
- ListBox_add(super, (Object*) ListItem_new("Memory", 0));
- ListBox_add(super, (Object*) ListItem_new("Clock", 0));
- ListBox_add(super, (Object*) ListItem_new("Load", 0));
- ListBox_add(super, (Object*) ListItem_new("LoadAverage", 0));
- ListBox_add(super, (Object*) ListItem_new("Uptime", 0));
- ListBox_add(super, (Object*) ListItem_new("Tasks", 0));
- if (settings->pl->processorCount > 1)
- ListBox_add(super, (Object*) ListItem_new("CPUAverage", 0));
- for (int i = 1; i <= settings->pl->processorCount; i++) {
- char buffer[50];
- sprintf(buffer, "CPU(%d)", i);
- ListBox_add(super, (Object*) ListItem_new(buffer, 0));
+ for (int i = 1; Meter_types[i]; i++) {
+ MeterType* type = Meter_types[i];
+ if (type != &CPUMeter && type != &AllCPUsMeter) {
+ ListBox_add(super, (Object*) ListItem_new(type->uiName, i << 16));
+ }
+ }
+ MeterType* type = &CPUMeter;
+ int processors = settings->pl->processorCount;
+ if (processors > 1) {
+ ListBox_add(super, (Object*) ListItem_new("CPU average", 0));
+ for (int i = 1; i <= processors; i++) {
+ char buffer[50];
+ sprintf(buffer, "%s %d", type->uiName, i);
+ ListBox_add(super, (Object*) ListItem_new(buffer, i));
+ }
+ } else {
+ ListBox_add(super, (Object*) ListItem_new("CPU", 1));
}
return this;
}
@@ -60,10 +64,8 @@ void AvailableMetersListBox_delete(Object* object) {
}
/* private */
-inline void AvailableMetersListBox_addHeader(Header* header, ListBox* lb, char* name, HeaderSide side) {
- Header_createMeter(header, name, side);
- int i = Header_size(header, side) - 1;
- Meter* meter = (Meter*) Header_getMeter(header, i, side);
+inline void AvailableMetersListBox_addHeader(Header* header, ListBox* lb, MeterType* type, int param, HeaderSide side) {
+ Meter* meter = (Meter*) Header_addMeter(header, type, param, side);
ListBox_add(lb, (Object*) Meter_toListItem(meter));
}
@@ -72,7 +74,8 @@ HandlerResult AvailableMetersListBox_EventHandler(ListBox* super, int ch) {
Header* header = this->settings->header;
ListItem* selected = (ListItem*) ListBox_getSelected(super);
- char* name = selected->value;
+ int param = selected->key & 0xff;
+ int type = selected->key >> 16;
HandlerResult result = IGNORED;
switch(ch) {
@@ -80,7 +83,7 @@ HandlerResult AvailableMetersListBox_EventHandler(ListBox* super, int ch) {
case 'l':
case 'L':
{
- AvailableMetersListBox_addHeader(header, this->leftBox, name, LEFT_HEADER);
+ AvailableMetersListBox_addHeader(header, this->leftBox, Meter_types[type], param, LEFT_HEADER);
result = HANDLED;
break;
}
@@ -88,7 +91,7 @@ HandlerResult AvailableMetersListBox_EventHandler(ListBox* super, int ch) {
case 'r':
case 'R':
{
- AvailableMetersListBox_addHeader(header, this->rightBox, name, RIGHT_HEADER);
+ AvailableMetersListBox_addHeader(header, this->rightBox, Meter_types[type], param, RIGHT_HEADER);
result = HANDLED;
break;
}
diff --git a/CPUMeter.c b/CPUMeter.c
index 050f88d5..09bc909a 100644
--- a/CPUMeter.c
+++ b/CPUMeter.c
@@ -18,17 +18,36 @@ in the source distribution for its full text.
#include "debug.h"
#include <assert.h>
-/*{
+/* private property */
+static int CPUMeter_attributes[] = { CPU_NICE, CPU_NORMAL, CPU_KERNEL };
-typedef struct CPUMeter_ CPUMeter;
-
-struct CPUMeter_ {
- Meter super;
- ProcessList* pl;
- int processor;
+/* private */
+MeterType CPUMeter = {
+ .setValues = CPUMeter_setValues,
+ .display = CPUMeter_display,
+ .mode = BAR_METERMODE,
+ .items = 3,
+ .total = 100.0,
+ .attributes = CPUMeter_attributes,
+ .name = "CPU",
+ .uiName = "CPU",
+ .caption = "CPU",
+ .init = CPUMeter_init
};
-}*/
+/* private */
+MeterType AllCPUsMeter = {
+ .mode = 0,
+ .items = 1,
+ .total = 100.0,
+ .attributes = CPUMeter_attributes,
+ .name = "AllCPUs",
+ .uiName = "All CPUs",
+ .caption = "CPU",
+ .draw = AllCPUsMeter_draw,
+ .init = AllCPUsMeter_init,
+ .done = AllCPUsMeter_done
+};
#ifndef MIN
#define MIN(a,b) ((a)<(b)?(a):(b))
@@ -37,50 +56,66 @@ struct CPUMeter_ {
#define MAX(a,b) ((a)>(b)?(a):(b))
#endif
-CPUMeter* CPUMeter_new(ProcessList* pl, int processor) {
- CPUMeter* this = malloc(sizeof(CPUMeter));
- char* caption;
- if (pl->processorCount == 1 || processor == 0) {
- caption = String_copy("CPU");
- } else {
- caption = (char*) malloc(4);
+void CPUMeter_init(Meter* this) {
+ int processor = this->param;
+ if (this->pl->processorCount > 1) {
+ char caption[10];
sprintf(caption, "%-3d", processor);
+ Meter_setCaption(this, caption);
}
- Meter_init((Meter*)this, NULL, caption, 3);
- ((Meter*)this)->name = malloc(20);
- sprintf(((Meter*)this)->name, "CPU(%d)", processor);
- ((Meter*)this)->attributes[0] = CPU_NICE;
- ((Meter*)this)->attributes[1] = CPU_NORMAL;
- ((Meter*)this)->attributes[2] = CPU_KERNEL;
- ((Meter*)this)->setValues = CPUMeter_setValues;
- ((Object*)this)->display = CPUMeter_display;
- ((Meter*)this)->total = 1.0;
- Meter_setMode((Meter*)this, BAR);
- this->processor = processor;
- this->pl = pl;
- return this;
+ if (this->param == 0)
+ Meter_setCaption(this, "Avg");
}
-void CPUMeter_setValues(Meter* cast) {
- CPUMeter* this = (CPUMeter*)cast;
- cast->values[0] = this->pl->nicePeriod[this->processor] / (double)this->pl->totalPeriod[this->processor];
- cast->values[1] = this->pl->userPeriod[this->processor] / (double)this->pl->totalPeriod[this->processor];
- cast->values[2] = this->pl->systemPeriod[this->processor] / (double)this->pl->totalPeriod[this->processor];
- double cpu = MIN(100.0, MAX(0.0, (cast->values[0]+cast->values[1]+cast->values[2])*100.0 ));
- snprintf(cast->displayBuffer.c, 7, "%5.1f%%", cpu );
+void CPUMeter_setValues(Meter* this, char* buffer, int size) {
+ ProcessList* pl = this->pl;
+ int processor = this->param;
+ double total = (double) pl->totalPeriod[processor];
+ this->values[0] = pl->nicePeriod[processor] / total * 100.0;
+ this->values[1] = pl->userPeriod[processor] / total * 100.0;
+ this->values[2] = pl->systemPeriod[processor] / total * 100.0;
+ double cpu = MIN(100.0, MAX(0.0, (this->values[0]+this->values[1]+this->values[2])));
+ snprintf(buffer, size, "%5.1f%%", cpu );
}
void CPUMeter_display(Object* cast, RichString* out) {
char buffer[50];
Meter* this = (Meter*)cast;
RichString_prune(out);
- sprintf(buffer, "%5.1f%% ", this->values[1] * 100.0);
+ sprintf(buffer, "%5.1f%% ", this->values[1]);
RichString_append(out, CRT_colors[METER_TEXT], ":");
RichString_append(out, CRT_colors[CPU_NORMAL], buffer);
- sprintf(buffer, "%5.1f%% ", this->values[2] * 100.0);
+ sprintf(buffer, "%5.1f%% ", this->values[2]);
RichString_append(out, CRT_colors[METER_TEXT], "sys:");
RichString_append(out, CRT_colors[CPU_KERNEL], buffer);
- sprintf(buffer, "%5.1f%% ", this->values[0] * 100.0);
+ sprintf(buffer, "%5.1f%% ", this->values[0]);
RichString_append(out, CRT_colors[METER_TEXT], "low:");
RichString_append(out, CRT_colors[CPU_NICE], buffer);
}
+
+void AllCPUsMeter_init(Meter* this) {
+ int processors = this->pl->processorCount;
+ this->drawBuffer = malloc(sizeof(Meter*) * processors);
+ Meter** meters = (Meter**) this->drawBuffer;
+ for (int i = 0; i < processors; i++)
+ meters[i] = Meter_new(this->pl, i+1, &CPUMeter);
+ this->h = processors;
+ this->mode = BAR_METERMODE;
+}
+
+void AllCPUsMeter_done(Meter* this) {
+ int processors = this->pl->processorCount;
+ Meter** meters = (Meter**) this->drawBuffer;
+ for (int i = 0; i < processors; i++)
+ Meter_delete((Object*)meters[i]);
+}
+
+void AllCPUsMeter_draw(Meter* this, int x, int y, int w) {
+ int processors = this->pl->processorCount;
+ Meter** meters = (Meter**) this->drawBuffer;
+ this->h = Meter_modes[this->mode]->h * processors;
+ for (int i = 0; i < processors; i++) {
+ Meter_setMode(meters[i], this->mode);
+ meters[i]->draw(meters[i], x, y+i, w);
+ }
+}
diff --git a/CPUMeter.h b/CPUMeter.h
index 22589dc0..65ee37cb 100644
--- a/CPUMeter.h
+++ b/CPUMeter.h
@@ -1,9 +1,9 @@
-/* Do not edit this file. It was automatically genarated. */
+/* Do not edit this file. It was automatically generated. */
#ifndef HEADER_CPUMeter
#define HEADER_CPUMeter
/*
-htop
+htop - CPUMeter.c
(C) 2004-2006 Hisham H. Muhammad
Released under the GNU GPL, see the COPYING file
in the source distribution for its full text.
@@ -17,25 +17,30 @@ in the source distribution for its full text.
#include <curses.h>
#include <string.h>
#include <math.h>
-#include <sys/param.h>
#include "debug.h"
#include <assert.h>
-typedef struct CPUMeter_ CPUMeter;
-struct CPUMeter_ {
- Meter super;
- ProcessList* pl;
- int processor;
-};
+#ifndef MIN
+#define MIN(a,b) ((a)<(b)?(a):(b))
+#endif
+#ifndef MAX
+#define MAX(a,b) ((a)>(b)?(a):(b))
+#endif
-CPUMeter* CPUMeter_new(ProcessList* pl, int processor);
+void CPUMeter_init(Meter* this);
-void CPUMeter_setValues(Meter* cast);
+void CPUMeter_setValues(Meter* this, char* buffer, int size);
void CPUMeter_display(Object* cast, RichString* out);
+void AllCPUsMeter_init(Meter* this);
+
+void AllCPUsMeter_done(Meter* this);
+
+void AllCPUsMeter_draw(Meter* this, int x, int y, int w);
+
#endif
diff --git a/ClockMeter.c b/ClockMeter.c
index 699c037a..9e48c295 100644
--- a/ClockMeter.c
+++ b/ClockMeter.c
@@ -8,47 +8,29 @@ in the source distribution for its full text.
#include "ClockMeter.h"
#include "Meter.h"
-#include "ProcessList.h"
-
-#include <curses.h>
#include <time.h>
#include "debug.h"
-/*{
-
-typedef struct ClockMeter_ ClockMeter;
-
-struct ClockMeter_ {
- Meter super;
- ProcessList* pl;
- char clock[10];
+/* private */
+static int ClockMeter_attributes[] = { CLOCK };
+
+/* private */
+MeterType ClockMeter = {
+ .setValues = ClockMeter_setValues,
+ .display = NULL,
+ .mode = TEXT_METERMODE,
+ .total = 100.0,
+ .items = 1,
+ .attributes = ClockMeter_attributes,
+ .name = "Clock",
+ .uiName = "Clock",
+ .caption = "Time: ",
};
-}*/
-
-ClockMeter* ClockMeter_new() {
- ClockMeter* this = malloc(sizeof(ClockMeter));
- Meter_init((Meter*)this, String_copy("Clock"), String_copy("Time: "), 1);
- ((Meter*)this)->attributes[0] = CLOCK;
- ((Meter*)this)->setValues = ClockMeter_setValues;
- ((Object*)this)->display = ClockMeter_display;
- ((Meter*)this)->total = 24 * 60;
- Meter_setMode((Meter*)this, TEXT);
- return this;
-}
-
-void ClockMeter_setValues(Meter* cast) {
- ClockMeter* this = (ClockMeter*) cast;
+void ClockMeter_setValues(Meter* this, char* buffer, int size) {
time_t t = time(NULL);
struct tm *lt = localtime(&t);
- cast->values[0] = lt->tm_hour * 60 + lt->tm_min;
- strftime(this->clock, 9, "%H:%M:%S", lt);
- snprintf(cast->displayBuffer.c, 9, "%s", this->clock);
-}
-
-void ClockMeter_display(Object* cast, RichString* out) {
- Meter* super = (Meter*) cast;
- ClockMeter* this = (ClockMeter*) cast;
- RichString_write(out, CRT_colors[super->attributes[0]], this->clock);
+ this->values[0] = lt->tm_hour * 60 + lt->tm_min;
+ strftime(buffer, size, "%H:%M:%S", lt);
}
diff --git a/ClockMeter.h b/ClockMeter.h
index 2dd2440f..7ca276eb 100644
--- a/ClockMeter.h
+++ b/ClockMeter.h
@@ -1,4 +1,4 @@
-/* Do not edit this file. It was automatically genarated. */
+/* Do not edit this file. It was automatically generated. */
#ifndef HEADER_ClockMeter
#define HEADER_ClockMeter
@@ -11,27 +11,11 @@ in the source distribution for its full text.
#include "Meter.h"
-#include "ProcessList.h"
-
-#include <curses.h>
#include <time.h>
#include "debug.h"
-typedef struct ClockMeter_ ClockMeter;
-
-struct ClockMeter_ {
- Meter super;
- ProcessList* pl;
- char clock[10];
-};
-
-
-ClockMeter* ClockMeter_new();
-
-void ClockMeter_setValues(Meter* cast);
-
-void ClockMeter_display(Object* cast, RichString* out);
+void ClockMeter_setValues(Meter* this, char* buffer, int size);
#endif
diff --git a/Header.c b/Header.c
index 7812fd4e..74518d74 100644
--- a/Header.c
+++ b/Header.c
@@ -6,14 +6,7 @@ in the source distribution for its full text.
*/
#include "Header.h"
-#include "CPUMeter.h"
-#include "MemoryMeter.h"
-#include "SwapMeter.h"
-#include "LoadMeter.h"
-#include "LoadAverageMeter.h"
-#include "UptimeMeter.h"
-#include "ClockMeter.h"
-#include "TasksMeter.h"
+#include "Meter.h"
#include "debug.h"
#include <assert.h>
@@ -60,31 +53,22 @@ void Header_createMeter(Header* this, char* name, HeaderSide side) {
? this->leftMeters
: this->rightMeters;
- if (String_eq(name, "Swap")) {
- TypedVector_add(meters, SwapMeter_new(this->pl));
- } else if (String_eq(name, "Memory")) {
- TypedVector_add(meters, MemoryMeter_new(this->pl));
- } else if (String_eq(name, "Clock")) {
- TypedVector_add(meters, ClockMeter_new(this->pl));
- } else if (String_eq(name, "Load")) {
- TypedVector_add(meters, LoadMeter_new(this->pl));
- } else if (String_eq(name, "LoadAverage")) {
- TypedVector_add(meters, LoadAverageMeter_new(this->pl));
- } else if (String_eq(name, "Uptime")) {
- TypedVector_add(meters, UptimeMeter_new(this->pl));
- } else if (String_eq(name, "Tasks")) {
- TypedVector_add(meters, TasksMeter_new(this->pl));
- } else if (String_startsWith(name, "CPUAverage")) {
- TypedVector_add(meters, CPUMeter_new(this->pl, 0));
- } else if (String_startsWith(name, "CPU")) {
- int num;
- int ok = sscanf(name, "CPU(%d)", &num);
- if (ok)
- TypedVector_add(meters, CPUMeter_new(this->pl, num));
+ char* paren = strchr(name, '(');
+ int param = 0;
+ if (paren) {
+ int ok = sscanf(paren, "(%d)", &param);
+ if (!ok) param = 0;
+ *paren = '\0';
+ }
+ for (MeterType** type = Meter_types; *type; type++) {
+ if (String_eq(name, (*type)->name)) {
+ TypedVector_add(meters, Meter_new(this->pl, param, *type));
+ break;
+ }
}
}
-void Header_setMode(Header* this, int i, MeterMode mode, HeaderSide side) {
+void Header_setMode(Header* this, int i, MeterModeId mode, HeaderSide side) {
TypedVector* meters = side == LEFT_HEADER
? this->leftMeters
: this->rightMeters;
@@ -93,12 +77,14 @@ void Header_setMode(Header* this, int i, MeterMode mode, HeaderSide side) {
Meter_setMode(meter, mode);
}
-Meter* Header_getMeter(Header* this, int i, HeaderSide side) {
+Meter* Header_addMeter(Header* this, MeterType* type, int param, HeaderSide side) {
TypedVector* meters = side == LEFT_HEADER
? this->leftMeters
: this->rightMeters;
- return (Meter*) TypedVector_get(meters, i);
+ Meter* meter = Meter_new(this->pl, param, type);
+ TypedVector_add(meters, meter);
+ return meter;
}
int Header_size(Header* this, HeaderSide side) {
@@ -113,12 +99,20 @@ char* Header_readMeterName(Header* this, int i, HeaderSide side) {
TypedVector* meters = side == LEFT_HEADER
? this->leftMeters
: this->rightMeters;
-
Meter* meter = (Meter*) TypedVector_get(meters, i);
- return meter->name;
+
+ int nameLen = strlen(meter->type->name);
+ int len = nameLen + 100;
+ char* name = malloc(len);
+ strncpy(name, meter->type->name, nameLen);
+ name[nameLen] = '\0';
+ if (meter->param)
+ snprintf(name + nameLen, len - nameLen, "(%d)", meter->param);
+
+ return name;
}
-MeterMode Header_readMeterMode(Header* this, int i, HeaderSide side) {
+MeterModeId Header_readMeterMode(Header* this, int i, HeaderSide side) {
TypedVector* meters = side == LEFT_HEADER
? this->leftMeters
: this->rightMeters;
@@ -128,14 +122,13 @@ MeterMode Header_readMeterMode(Header* this, int i, HeaderSide side) {
}
void Header_defaultMeters(Header* this) {
- for (int i = 1; i <= this->pl->processorCount; i++) {
- TypedVector_add(this->leftMeters, CPUMeter_new(this->pl, i));
- }
- TypedVector_add(this->leftMeters, MemoryMeter_new(this->pl));
- TypedVector_add(this->leftMeters, SwapMeter_new(this->pl));
- TypedVector_add(this->rightMeters, TasksMeter_new(this->pl));
- TypedVector_add(this->rightMeters, LoadAverageMeter_new(this->pl));
- TypedVector_add(this->rightMeters, UptimeMeter_new(this->pl));
+ for (int i = 1; i <= this->pl->processorCount; i++)
+ TypedVector_add(this->leftMeters, Meter_new(this->pl, i, &CPUMeter));
+ TypedVector_add(this->leftMeters, Meter_new(this->pl, 0, &MemoryMeter));
+ TypedVector_add(this->leftMeters, Meter_new(this->pl, 0, &SwapMeter));
+ TypedVector_add(this->rightMeters, Meter_new(this->pl, 0, &TasksMeter));
+ TypedVector_add(this->rightMeters, Meter_new(this->pl, 0, &LoadAverageMeter));
+ TypedVector_add(this->rightMeters, Meter_new(this->pl, 0, &UptimeMeter));
}
void Header_draw(Header* this) {
diff --git a/Header.h b/Header.h
index 51160bb2..96cedb68 100644
--- a/Header.h
+++ b/Header.h
@@ -1,22 +1,15 @@
-/* Do not edit this file. It was automatically genarated. */
+/* Do not edit this file. It was automatically generated. */
#ifndef HEADER_Header
#define HEADER_Header
/*
-htop
+htop - Header.c
(C) 2004-2006 Hisham H. Muhammad
Released under the GNU GPL, see the COPYING file
in the source distribution for its full text.
*/
-#include "CPUMeter.h"
-#include "MemoryMeter.h"
-#include "SwapMeter.h"
-#include "LoadMeter.h"
-#include "LoadAverageMeter.h"
-#include "UptimeMeter.h"
-#include "ClockMeter.h"
-#include "TasksMeter.h"
+#include "Meter.h"
#include "debug.h"
#include <assert.h>
@@ -37,21 +30,25 @@ typedef struct Header_ {
} Header;
+#ifndef MAX
+#define MAX(a,b) ((a)>(b)?(a):(b))
+#endif
+
Header* Header_new(ProcessList* pl);
void Header_delete(Header* this);
void Header_createMeter(Header* this, char* name, HeaderSide side);
-void Header_setMode(Header* this, int i, MeterMode mode, HeaderSide side);
+void Header_setMode(Header* this, int i, MeterModeId mode, HeaderSide side);
-Meter* Header_getMeter(Header* this, int i, HeaderSide side);
+Meter* Header_addMeter(Header* this, MeterType* type, int param, HeaderSide side);
int Header_size(Header* this, HeaderSide side);
char* Header_readMeterName(Header* this, int i, HeaderSide side);
-MeterMode Header_readMeterMode(Header* this, int i, HeaderSide side);
+MeterModeId Header_readMeterMode(Header* this, int i, HeaderSide side);
void Header_defaultMeters(Header* this);
diff --git a/LoadAverageMeter.c b/LoadAverageMeter.c
index 7fcabe7b..4f62260e 100644
--- a/LoadAverageMeter.c
+++ b/LoadAverageMeter.c
@@ -8,42 +8,44 @@ in the source distribution for its full text.
#include "LoadAverageMeter.h"
#include "Meter.h"
-#include "ProcessList.h"
-
#include <curses.h>
#include "debug.h"
-/*{
-
-typedef struct LoadAverageMeter_ LoadAverageMeter;
+/* private property */
+int LoadAverageMeter_attributes[] = { LOAD_AVERAGE_FIFTEEN, LOAD_AVERAGE_FIVE, LOAD_AVERAGE_ONE };
-struct LoadAverageMeter_ {
- Meter super;
- ProcessList* pl;
+/* private */
+MeterType LoadAverageMeter = {
+ .setValues = LoadAverageMeter_setValues,
+ .display = LoadAverageMeter_display,
+ .mode = TEXT_METERMODE,
+ .items = 3,
+ .total = 100.0,
+ .attributes = LoadAverageMeter_attributes,
+ .name = "LoadAverage",
+ .uiName = "Load average",
+ .caption = "Load average: "
};
-}*/
-
/* private property */
-void LoadAverageMeter_scan(double* one, double* five, double* fifteen);
+int LoadMeter_attributes[] = { LOAD };
-LoadAverageMeter* LoadAverageMeter_new() {
- LoadAverageMeter* this = malloc(sizeof(LoadAverageMeter));
- Meter_init((Meter*)this, String_copy("LoadAverage"), String_copy("Load average: "), 3);
- ((Meter*)this)->attributes[0] = LOAD_AVERAGE_FIFTEEN;
- ((Meter*)this)->attributes[1] = LOAD_AVERAGE_FIVE;
- ((Meter*)this)->attributes[2] = LOAD_AVERAGE_ONE;
- ((Object*)this)->display = LoadAverageMeter_display;
- ((Meter*)this)->setValues = LoadAverageMeter_setValues;
- Meter_setMode((Meter*)this, TEXT);
- LoadAverageMeter_scan(&((Meter*)this)->values[0], &((Meter*)this)->values[1], &((Meter*)this)->values[2]);
- ((Meter*)this)->total = 100.0;
- return this;
-}
+/* private */
+MeterType LoadMeter = {
+ .setValues = LoadMeter_setValues,
+ .display = LoadMeter_display,
+ .mode = TEXT_METERMODE,
+ .items = 1,
+ .total = 100.0,
+ .attributes = LoadMeter_attributes,
+ .name = "Load",
+ .uiName = "Load",
+ .caption = "Load: "
+};
/* private */
-void LoadAverageMeter_scan(double* one, double* five, double* fifteen) {
+inline static void LoadAverageMeter_scan(double* one, double* five, double* fifteen) {
int activeProcs, totalProcs, lastProc;
FILE *fd = fopen(PROCDIR "/loadavg", "r");
int read = fscanf(fd, "%lf %lf %lf %d/%d %d", one, five, fifteen,
@@ -53,9 +55,9 @@ void LoadAverageMeter_scan(double* one, double* five, double* fifteen) {
fclose(fd);
}
-void LoadAverageMeter_setValues(Meter* cast) {
- LoadAverageMeter_scan(&cast->values[2], &cast->values[1], &cast->values[0]);
- snprintf(cast->displayBuffer.c, 25, "%.2f/%.2f/%.2f", cast->values[2], cast->values[1], cast->values[0]);
+void LoadAverageMeter_setValues(Meter* this, char* buffer, int size) {
+ LoadAverageMeter_scan(&this->values[2], &this->values[1], &this->values[0]);
+ snprintf(buffer, size, "%.2f/%.2f/%.2f", this->values[2], this->values[1], this->values[0]);
}
void LoadAverageMeter_display(Object* cast, RichString* out) {
@@ -63,9 +65,26 @@ void LoadAverageMeter_display(Object* cast, RichString* out) {
char buffer[20];
RichString_prune(out);
sprintf(buffer, "%.2f ", this->values[2]);
- RichString_append(out, CRT_colors[LOAD_AVERAGE_ONE], buffer);
+ RichString_append(out, CRT_colors[LOAD_AVERAGE_FIFTEEN], buffer);
sprintf(buffer, "%.2f ", this->values[1]);
RichString_append(out, CRT_colors[LOAD_AVERAGE_FIVE], buffer);
sprintf(buffer, "%.2f ", this->values[0]);
- RichString_append(out, CRT_colors[LOAD_AVERAGE_FIFTEEN], buffer);
+ RichString_append(out, CRT_colors[LOAD_AVERAGE_ONE], buffer);
+}
+
+void LoadMeter_setValues(Meter* this, char* buffer, int size) {
+ double five, fifteen;
+ LoadAverageMeter_scan(&this->values[0], &five, &fifteen);
+ if (this->values[0] > this->total) {
+ this->total = this->values[0];
+ }
+ snprintf(buffer, size, "%.2f", this->values[0]);
+}
+
+void LoadMeter_display(Object* cast, RichString* out) {
+ Meter* this = (Meter*)cast;
+ char buffer[20];
+ RichString_prune(out);
+ sprintf(buffer, "%.2f ", ((Meter*)this)->values[0]);
+ RichString_append(out, CRT_colors[LOAD], buffer);
}
diff --git a/LoadAverageMeter.h b/LoadAverageMeter.h
index 129a1f99..27e33a1a 100644
--- a/LoadAverageMeter.h
+++ b/LoadAverageMeter.h
@@ -1,4 +1,4 @@
-/* Do not edit this file. It was automatically genarated. */
+/* Do not edit this file. It was automatically generated. */
#ifndef HEADER_LoadAverageMeter
#define HEADER_LoadAverageMeter
@@ -11,27 +11,21 @@ in the source distribution for its full text.
#include "Meter.h"
-#include "ProcessList.h"
-
#include <curses.h>
#include "debug.h"
-typedef struct LoadAverageMeter_ LoadAverageMeter;
-struct LoadAverageMeter_ {
- Meter super;
- ProcessList* pl;
-};
-LoadAverageMeter* LoadAverageMeter_new();
+void LoadAverageMeter_setValues(Meter* this, char* buffer, int size);
+void LoadAverageMeter_display(Object* cast, RichString* out);
-void LoadAverageMeter_setValues(Meter* cast);
+void LoadMeter_setValues(Meter* this, char* buffer, int size);
-void LoadAverageMeter_display(Object* cast, RichString* out);
+void LoadMeter_display(Object* cast, RichString* out);
#endif
diff --git a/Makefile.am b/Makefile.am
index 7dc6d010..1a568f27 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -13,13 +13,13 @@ AM_CPPFLAGS = -DSYSCONFDIR=\"$(sysconfdir)\"
htop_SOURCES = AvailableMetersListBox.c CategoriesListBox.c ClockMeter.c \
CPUMeter.c CRT.c DebugMemory.c DisplayOptionsListBox.c FunctionBar.c \
Hashtable.c Header.c htop.c ListBox.c ListItem.c LoadAverageMeter.c \
-LoadMeter.c MemoryMeter.c Meter.c MetersListBox.c Object.c Process.c \
+MemoryMeter.c Meter.c MetersListBox.c Object.c Process.c \
ProcessList.c RichString.c ScreenManager.c Settings.c SignalItem.c \
SignalsListBox.c String.c SwapMeter.c TasksMeter.c TypedVector.c \
UptimeMeter.c UsersTable.c AvailableMetersListBox.h CategoriesListBox.h \
ClockMeter.h config.h CPUMeter.h CRT.h debug.h DebugMemory.h \
DisplayOptionsListBox.h FunctionBar.h Hashtable.h Header.h htop.h ListBox.h \
-ListItem.h LoadAverageMeter.h LoadMeter.h MemoryMeter.h Meter.h \
+ListItem.h LoadAverageMeter.h MemoryMeter.h Meter.h \
MetersListBox.h Object.h Process.h ProcessList.h RichString.h ScreenManager.h \
Settings.h SignalItem.h SignalsListBox.h String.h SwapMeter.h TasksMeter.h \
TypedVector.h UptimeMeter.h UsersTable.h CheckItem.c CheckItem.h \
diff --git a/MemoryMeter.c b/MemoryMeter.c
index 84039b0e..d4f67225 100644
--- a/MemoryMeter.c
+++ b/MemoryMeter.c
@@ -19,61 +19,42 @@ in the source distribution for its full text.
#include "debug.h"
#include <assert.h>
-/*{
+/* private property */
+static int MemoryMeter_attributes[] = { MEMORY_USED, MEMORY_BUFFERS, MEMORY_CACHE };
-typedef struct MemoryMeter_ MemoryMeter;
-
-struct MemoryMeter_ {
- Meter super;
- ProcessList* pl;
- char* wideFormat;
- int wideLimit;
+/* private */
+MeterType MemoryMeter = {
+ .setValues = MemoryMeter_setValues,
+ .display = MemoryMeter_display,
+ .mode = BAR_METERMODE,
+ .items = 3,
+ .total = 100.0,
+ .attributes = MemoryMeter_attributes,
+ "Memory",
+ "Memory",
+ "Mem"
};
-}*/
-
-MemoryMeter* MemoryMeter_new(ProcessList* pl) {
- MemoryMeter* this = malloc(sizeof(MemoryMeter));
- Meter_init((Meter*)this, String_copy("Memory"), String_copy("Mem"), 3);
- ((Meter*)this)->attributes[0] = MEMORY_USED;
- ((Meter*)this)->attributes[1] = MEMORY_BUFFERS;
- ((Meter*)this)->attributes[2] = MEMORY_CACHE;
- ((Meter*)this)->setValues = MemoryMeter_setValues;
- ((Object*)this)->display = MemoryMeter_display;
- this->pl = pl;
- Meter_setMode((Meter*)this, BAR);
- this->wideFormat = "%6ldk ";
- this->wideLimit = 22 + 8 * 4;
- return this;
-}
-
-void MemoryMeter_setValues(Meter* cast) {
- MemoryMeter* this = (MemoryMeter*)cast;
-
- double totalMem = (double)this->pl->totalMem;
+void MemoryMeter_setValues(Meter* this, char* buffer, int size) {
long int usedMem = this->pl->usedMem;
long int buffersMem = this->pl->buffersMem;
long int cachedMem = this->pl->cachedMem;
usedMem -= buffersMem + cachedMem;
- cast->total = totalMem;
- cast->values[0] = usedMem;
- cast->values[1] = buffersMem;
- cast->values[2] = cachedMem;
- snprintf(cast->displayBuffer.c, 14, "%ld/%ldMB", usedMem / 1024, this->pl->totalMem / 1024);
+ this->total = this->pl->totalMem;
+ this->values[0] = usedMem;
+ this->values[1] = buffersMem;
+ this->values[2] = cachedMem;
+ snprintf(buffer, size, "%ld/%ldMB", (long int) usedMem / 1024, (long int) this->total / 1024);
}
void MemoryMeter_display(Object* cast, RichString* out) {
char buffer[50];
- MemoryMeter* this = (MemoryMeter*)cast;
- Meter* meter = (Meter*)cast;
+ Meter* this = (Meter*)cast;
int div = 1024; char* format = "%ldM ";
- if (meter->w > this->wideLimit) {
- div = 1; format = this->wideFormat;
- }
- long int totalMem = meter->total / div;
- long int usedMem = meter->values[0] / div;
- long int buffersMem = meter->values[1] / div;
- long int cachedMem = meter->values[2] / div;
+ long int totalMem = this->total / div;
+ long int usedMem = this->values[0] / div;
+ long int buffersMem = this->values[1] / div;
+ long int cachedMem = this->values[2] / div;
RichString_prune(out);
RichString_append(out, CRT_colors[METER_TEXT], ":");
sprintf(buffer, format, totalMem);
diff --git a/MemoryMeter.h b/MemoryMeter.h
index fe4a91b9..e2f42e0d 100644
--- a/MemoryMeter.h
+++ b/MemoryMeter.h
@@ -1,4 +1,4 @@
-/* Do not edit this file. It was automatically genarated. */
+/* Do not edit this file. It was automatically generated. */