diff options
author | Hisham Muhammad <hisham@gobolinux.org> | 2006-04-10 20:40:38 +0000 |
---|---|---|
committer | Hisham Muhammad <hisham@gobolinux.org> | 2006-04-10 20:40:38 +0000 |
commit | 33113fe0d73ea3299843b483f108ef5bcfcc944f (patch) | |
tree | 4c6b50b3bc6fbe9e1a44dd3b9c56e63571c83d73 | |
parent | 34bcf8050e56fc799efb1013cb92ba1b44bd6df1 (diff) |
- Overhaul meters implementation;
- add AllCPUsMeter;
- because of that, the new .htoprc is incompatible with previous released versions.
-rw-r--r-- | AvailableMetersListBox.c | 43 | ||||
-rw-r--r-- | CPUMeter.c | 111 | ||||
-rw-r--r-- | CPUMeter.h | 27 | ||||
-rw-r--r-- | ClockMeter.c | 52 | ||||
-rw-r--r-- | ClockMeter.h | 20 | ||||
-rw-r--r-- | Header.c | 79 | ||||
-rw-r--r-- | Header.h | 23 | ||||
-rw-r--r-- | LoadAverageMeter.c | 79 | ||||
-rw-r--r-- | LoadAverageMeter.h | 16 | ||||
-rw-r--r-- | Makefile.am | 4 | ||||
-rw-r--r-- | MemoryMeter.c | 67 | ||||
-rw-r--r-- | MemoryMeter.h | 15 | ||||
-rw-r--r-- | Meter.c | 504 | ||||
-rw-r--r-- | Meter.h | 151 | ||||
-rw-r--r-- | MetersListBox.c | 5 | ||||
-rw-r--r-- | ProcessList.c | 2 | ||||
-rw-r--r-- | Settings.c | 29 | ||||
-rw-r--r-- | Settings.h | 8 | ||||
-rw-r--r-- | SwapMeter.c | 51 | ||||
-rw-r--r-- | SwapMeter.h | 13 | ||||
-rw-r--r-- | TasksMeter.c | 43 | ||||
-rw-r--r-- | TasksMeter.h | 13 | ||||
-rw-r--r-- | UptimeMeter.c | 83 | ||||
-rw-r--r-- | UptimeMeter.h | 19 |
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; } @@ -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); + } +} @@ -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 @@ -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)", ¶m); + 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) { @@ -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. */ |