Commit 00b324bf authored by Hisham Muhammad's avatar Hisham Muhammad
Browse files

Changes in object model: separate class objects to store vtable. Also, nicer...

Changes in object model: separate class objects to store vtable. Also, nicer UTF-8 display of big numbers.
parent 2a73405c
...@@ -27,6 +27,8 @@ typedef struct ColorsPanel_ { ...@@ -27,6 +27,8 @@ typedef struct ColorsPanel_ {
} ColorsPanel; } ColorsPanel;
extern PanelClass ColorsPanel_class;
ColorsPanel* ColorsPanel_new(Settings* settings, ScreenManager* scr); ColorsPanel* ColorsPanel_new(Settings* settings, ScreenManager* scr);
#endif #endif
...@@ -82,15 +82,21 @@ static HandlerResult ColumnsPanel_eventHandler(Panel* super, int ch) { ...@@ -82,15 +82,21 @@ static HandlerResult ColumnsPanel_eventHandler(Panel* super, int ch) {
return result; return result;
} }
PanelClass ColumnsPanel_class = {
.super = {
.extends = Class(Panel),
.delete = ColumnsPanel_delete
},
.eventHandler = ColumnsPanel_eventHandler
};
ColumnsPanel* ColumnsPanel_new(Settings* settings, ScreenManager* scr) { ColumnsPanel* ColumnsPanel_new(Settings* settings, ScreenManager* scr) {
ColumnsPanel* this = (ColumnsPanel*) malloc(sizeof(ColumnsPanel)); ColumnsPanel* this = AllocThis(ColumnsPanel);
Panel* super = (Panel*) this; Panel* super = (Panel*) this;
Panel_init(super, 1, 1, 1, 1, LISTITEM_CLASS, true); Panel_init(super, 1, 1, 1, 1, Class(ListItem), true);
((Object*)this)->delete = ColumnsPanel_delete;
this->settings = settings; this->settings = settings;
this->scr = scr; this->scr = scr;
super->eventHandler = ColumnsPanel_eventHandler;
Panel_setHeader(super, "Active Columns"); Panel_setHeader(super, "Active Columns");
ProcessField* fields = this->settings->pl->fields; ProcessField* fields = this->settings->pl->fields;
......
...@@ -21,6 +21,8 @@ typedef struct ColumnsPanel_ { ...@@ -21,6 +21,8 @@ typedef struct ColumnsPanel_ {
} ColumnsPanel; } ColumnsPanel;
extern PanelClass ColumnsPanel_class;
ColumnsPanel* ColumnsPanel_new(Settings* settings, ScreenManager* scr); ColumnsPanel* ColumnsPanel_new(Settings* settings, ScreenManager* scr);
int ColumnsPanel_fieldNameToIndex(const char* name); int ColumnsPanel_fieldNameToIndex(const char* name);
......
...@@ -61,15 +61,21 @@ static HandlerResult DisplayOptionsPanel_eventHandler(Panel* super, int ch) { ...@@ -61,15 +61,21 @@ static HandlerResult DisplayOptionsPanel_eventHandler(Panel* super, int ch) {
return result; return result;
} }
PanelClass DisplayOptionsPanel_class = {
.super = {
.extends = Class(Panel),
.delete = DisplayOptionsPanel_delete
},
.eventHandler = DisplayOptionsPanel_eventHandler
};
DisplayOptionsPanel* DisplayOptionsPanel_new(Settings* settings, ScreenManager* scr) { DisplayOptionsPanel* DisplayOptionsPanel_new(Settings* settings, ScreenManager* scr) {
DisplayOptionsPanel* this = (DisplayOptionsPanel*) malloc(sizeof(DisplayOptionsPanel)); DisplayOptionsPanel* this = AllocThis(DisplayOptionsPanel);
Panel* super = (Panel*) this; Panel* super = (Panel*) this;
Panel_init(super, 1, 1, 1, 1, CHECKITEM_CLASS, true); Panel_init(super, 1, 1, 1, 1, Class(CheckItem), true);
((Object*)this)->delete = DisplayOptionsPanel_delete;
this->settings = settings; this->settings = settings;
this->scr = scr; this->scr = scr;
super->eventHandler = DisplayOptionsPanel_eventHandler;
Panel_setHeader(super, "Display options"); Panel_setHeader(super, "Display options");
Panel_add(super, (Object*) CheckItem_new(strdup("Tree view"), &(settings->pl->treeView), false)); Panel_add(super, (Object*) CheckItem_new(strdup("Tree view"), &(settings->pl->treeView), false));
......
...@@ -21,6 +21,8 @@ typedef struct DisplayOptionsPanel_ { ...@@ -21,6 +21,8 @@ typedef struct DisplayOptionsPanel_ {
} DisplayOptionsPanel; } DisplayOptionsPanel;
extern PanelClass DisplayOptionsPanel_class;
DisplayOptionsPanel* DisplayOptionsPanel_new(Settings* settings, ScreenManager* scr); DisplayOptionsPanel* DisplayOptionsPanel_new(Settings* settings, ScreenManager* scr);
#endif #endif
...@@ -29,22 +29,18 @@ typedef struct FunctionBar_ { ...@@ -29,22 +29,18 @@ typedef struct FunctionBar_ {
}*/ }*/
#ifdef DEBUG
char* FUNCTIONBAR_CLASS = "FunctionBar";
#else
#define FUNCTIONBAR_CLASS NULL
#endif
static const char* FunctionBar_FKeys[] = {"F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", NULL}; static const char* FunctionBar_FKeys[] = {"F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", NULL};
static const char* FunctionBar_FLabels[] = {" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", NULL}; static const char* FunctionBar_FLabels[] = {" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", NULL};
static int FunctionBar_FEvents[] = {KEY_F(1), KEY_F(2), KEY_F(3), KEY_F(4), KEY_F(5), KEY_F(6), KEY_F(7), KEY_F(8), KEY_F(9), KEY_F(10)}; static int FunctionBar_FEvents[] = {KEY_F(1), KEY_F(2), KEY_F(3), KEY_F(4), KEY_F(5), KEY_F(6), KEY_F(7), KEY_F(8), KEY_F(9), KEY_F(10)};
ObjectClass FunctionBar_class = {
.delete = FunctionBar_delete
};
FunctionBar* FunctionBar_new(const char** functions, const char** keys, int* events) { FunctionBar* FunctionBar_new(const char** functions, const char** keys, int* events) {
FunctionBar* this = malloc(sizeof(FunctionBar)); FunctionBar* this = AllocThis(FunctionBar);
Object_setClass(this, FUNCTIONBAR_CLASS);
((Object*) this)->delete = FunctionBar_delete;
this->functions = (char**) functions; this->functions = (char**) functions;
if (keys && events) { if (keys && events) {
this->staticData = false; this->staticData = false;
......
...@@ -21,11 +21,7 @@ typedef struct FunctionBar_ { ...@@ -21,11 +21,7 @@ typedef struct FunctionBar_ {
} FunctionBar; } FunctionBar;
#ifdef DEBUG extern ObjectClass FunctionBar_class;
extern char* FUNCTIONBAR_CLASS;
#else
#define FUNCTIONBAR_CLASS NULL
#endif
FunctionBar* FunctionBar_new(const char** functions, const char** keys, int* events); FunctionBar* FunctionBar_new(const char** functions, const char** keys, int* events);
......
...@@ -50,8 +50,8 @@ typedef struct Header_ { ...@@ -50,8 +50,8 @@ typedef struct Header_ {
Header* Header_new(ProcessList* pl) { Header* Header_new(ProcessList* pl) {
Header* this = calloc(sizeof(Header), 1); Header* this = calloc(sizeof(Header), 1);
this->leftMeters = Vector_new(METER_CLASS, true, DEFAULT_SIZE, NULL); this->leftMeters = Vector_new(Class(Meter), true, DEFAULT_SIZE);
this->rightMeters = Vector_new(METER_CLASS, true, DEFAULT_SIZE, NULL); this->rightMeters = Vector_new(Class(Meter), true, DEFAULT_SIZE);
this->margin = true; this->margin = true;
this->pl = pl; this->pl = pl;
return this; return this;
...@@ -75,7 +75,7 @@ void Header_createMeter(Header* this, char* name, HeaderSide side) { ...@@ -75,7 +75,7 @@ void Header_createMeter(Header* this, char* name, HeaderSide side) {
if (!ok) param = 0; if (!ok) param = 0;
*paren = '\0'; *paren = '\0';
} }
for (MeterType** type = Meter_types; *type; type++) { for (MeterClass** type = Meter_types; *type; type++) {
if (String_eq(name, (*type)->name)) { if (String_eq(name, (*type)->name)) {
Vector_add(meters, Meter_new(this->pl, param, *type)); Vector_add(meters, Meter_new(this->pl, param, *type));
break; break;
...@@ -94,7 +94,7 @@ void Header_setMode(Header* this, int i, MeterModeId mode, HeaderSide side) { ...@@ -94,7 +94,7 @@ void Header_setMode(Header* this, int i, MeterModeId mode, HeaderSide side) {
Meter_setMode(meter, mode); Meter_setMode(meter, mode);
} }
Meter* Header_addMeter(Header* this, MeterType* type, int param, HeaderSide side) { Meter* Header_addMeter(Header* this, MeterClass* type, int param, HeaderSide side) {
Vector* meters = side == LEFT_HEADER Vector* meters = side == LEFT_HEADER
? this->leftMeters ? this->leftMeters
: this->rightMeters; : this->rightMeters;
...@@ -118,10 +118,10 @@ char* Header_readMeterName(Header* this, int i, HeaderSide side) { ...@@ -118,10 +118,10 @@ char* Header_readMeterName(Header* this, int i, HeaderSide side) {
: this->rightMeters; : this->rightMeters;
Meter* meter = (Meter*) Vector_get(meters, i); Meter* meter = (Meter*) Vector_get(meters, i);
int nameLen = strlen(meter->type->name); int nameLen = strlen(Meter_name(meter));
int len = nameLen + 100; int len = nameLen + 100;
char* name = malloc(len); char* name = malloc(len);
strncpy(name, meter->type->name, nameLen); strncpy(name, Meter_name(meter), nameLen);
name[nameLen] = '\0'; name[nameLen] = '\0';
if (meter->param) if (meter->param)
snprintf(name + nameLen, len - nameLen, "(%d)", meter->param); snprintf(name + nameLen, len - nameLen, "(%d)", meter->param);
...@@ -140,38 +140,37 @@ MeterModeId Header_readMeterMode(Header* this, int i, HeaderSide side) { ...@@ -140,38 +140,37 @@ MeterModeId Header_readMeterMode(Header* this, int i, HeaderSide side) {
void Header_defaultMeters(Header* this, int cpuCount) { void Header_defaultMeters(Header* this, int cpuCount) {
if (cpuCount > 8) { if (cpuCount > 8) {
Vector_add(this->leftMeters, Meter_new(this->pl, 0, &LeftCPUs2Meter)); Vector_add(this->leftMeters, Meter_new(this->pl, 0, (MeterClass*) Class(LeftCPUs2Meter)));
Vector_add(this->rightMeters, Meter_new(this->pl, 0, &RightCPUs2Meter)); Vector_add(this->rightMeters, Meter_new(this->pl, 0, (MeterClass*) Class(RightCPUs2Meter)));
} else if (cpuCount > 4) { } else if (cpuCount > 4) {
Vector_add(this->leftMeters, Meter_new(this->pl, 0, &LeftCPUsMeter)); Vector_add(this->leftMeters, Meter_new(this->pl, 0, (MeterClass*) Class(LeftCPUsMeter)));
Vector_add(this->rightMeters, Meter_new(this->pl, 0, &RightCPUsMeter)); Vector_add(this->rightMeters, Meter_new(this->pl, 0, (MeterClass*) Class(RightCPUsMeter)));
} else { } else {
Vector_add(this->leftMeters, Meter_new(this->pl, 0, &AllCPUsMeter)); Vector_add(this->leftMeters, Meter_new(this->pl, 0, (MeterClass*) Class(AllCPUsMeter)));
} }
Vector_add(this->leftMeters, Meter_new(this->pl, 0, &MemoryMeter)); Vector_add(this->leftMeters, Meter_new(this->pl, 0, (MeterClass*) Class(MemoryMeter)));
Vector_add(this->leftMeters, Meter_new(this->pl, 0, &SwapMeter)); Vector_add(this->leftMeters, Meter_new(this->pl, 0, (MeterClass*) Class(SwapMeter)));
Vector_add(this->rightMeters, Meter_new(this->pl, 0, &TasksMeter)); Vector_add(this->rightMeters, Meter_new(this->pl, 0, (MeterClass*) Class(TasksMeter)));
Vector_add(this->rightMeters, Meter_new(this->pl, 0, &LoadAverageMeter)); Vector_add(this->rightMeters, Meter_new(this->pl, 0, (MeterClass*) Class(LoadAverageMeter)));
Vector_add(this->rightMeters, Meter_new(this->pl, 0, &UptimeMeter)); Vector_add(this->rightMeters, Meter_new(this->pl, 0, (MeterClass*) Class(UptimeMeter)));
} }
void Header_reinit(Header* this) { void Header_reinit(Header* this) {
for (int i = 0; i < Vector_size(this->leftMeters); i++) { for (int i = 0; i < Vector_size(this->leftMeters); i++) {
Meter* meter = (Meter*) Vector_get(this->leftMeters, i); Meter* meter = (Meter*) Vector_get(this->leftMeters, i);
if (meter->type->init) if (Meter_initFn(meter))
meter->type->init(meter); Meter_init(meter);
} }
for (int i = 0; i < Vector_size(this->rightMeters); i++) { for (int i = 0; i < Vector_size(this->rightMeters); i++) {
Meter* meter = (Meter*) Vector_get(this->rightMeters, i); Meter* meter = (Meter*) Vector_get(this->rightMeters, i);
if (meter->type->init) if (Meter_initFn(meter))
meter->type->init(meter); Meter_init(meter);
} }
} }
void Header_draw(const Header* this) { void Header_draw(const Header* this) {
int height = this->height; int height = this->height;
int pad = this->pad; int pad = this->pad;
attrset(CRT_colors[RESET_COLOR]); attrset(CRT_colors[RESET_COLOR]);
for (int y = 0; y < height; y++) { for (int y = 0; y < height; y++) {
mvhline(y, 0, ' ', COLS); mvhline(y, 0, ' ', COLS);
......
...@@ -39,7 +39,7 @@ void Header_createMeter(Header* this, char* name, HeaderSide side); ...@@ -39,7 +39,7 @@ void Header_createMeter(Header* this, char* name, HeaderSide side);
void Header_setMode(Header* this, int i, MeterModeId mode, HeaderSide side); void Header_setMode(Header* this, int i, MeterModeId mode, HeaderSide side);
Meter* Header_addMeter(Header* this, MeterType* type, int param, HeaderSide side); Meter* Header_addMeter(Header* this, MeterClass* type, int param, HeaderSide side);
int Header_size(Header* this, HeaderSide side); int Header_size(Header* this, HeaderSide side);
......
...@@ -24,10 +24,13 @@ static void HostnameMeter_setValues(Meter* this, char* buffer, int size) { ...@@ -24,10 +24,13 @@ static void HostnameMeter_setValues(Meter* this, char* buffer, int size) {
gethostname(buffer, size-1); gethostname(buffer, size-1);
} }
MeterType HostnameMeter = { MeterClass HostnameMeter_class = {
.super = {
.extends = Class(Meter),
.delete = Meter_delete
},
.setValues = HostnameMeter_setValues, .setValues = HostnameMeter_setValues,
.display = NULL, .defaultMode = TEXT_METERMODE,
.mode = TEXT_METERMODE,
.total = 100.0, .total = 100.0,
.items = 1, .items = 1,
.attributes = HostnameMeter_attributes, .attributes = HostnameMeter_attributes,
......
...@@ -13,6 +13,6 @@ in the source distribution for its full text. ...@@ -13,6 +13,6 @@ in the source distribution for its full text.
extern int HostnameMeter_attributes[]; extern int HostnameMeter_attributes[];
extern MeterType HostnameMeter; extern MeterClass HostnameMeter_class;
#endif #endif
...@@ -14,7 +14,7 @@ in the source distribution for its full text. ...@@ -14,7 +14,7 @@ in the source distribution for its full text.
}*/ }*/
Panel* IOPriorityPanel_new(IOPriority currPrio) { Panel* IOPriorityPanel_new(IOPriority currPrio) {
Panel* this = Panel_new(1, 1, 1, 1, LISTITEM_CLASS, true, ListItem_compare); Panel* this = Panel_new(1, 1, 1, 1, true, Class(ListItem));
Panel_setHeader(this, "IO Priority:"); Panel_setHeader(this, "IO Priority:");
Panel_add(this, (Object*) ListItem_new("None (based on nice)", IOPriority_None)); Panel_add(this, (Object*) ListItem_new("None (based on nice)", IOPriority_None));
......
...@@ -26,12 +26,6 @@ typedef struct ListItem_ { ...@@ -26,12 +26,6 @@ typedef struct ListItem_ {
}*/ }*/
#ifdef DEBUG
char* LISTITEM_CLASS = "ListItem";
#else
#define LISTITEM_CLASS NULL
#endif
static void ListItem_delete(Object* cast) { static void ListItem_delete(Object* cast) {
ListItem* this = (ListItem*)cast; ListItem* this = (ListItem*)cast;
free(this->value); free(this->value);
...@@ -49,11 +43,13 @@ static void ListItem_display(Object* cast, RichString* out) { ...@@ -49,11 +43,13 @@ static void ListItem_display(Object* cast, RichString* out) {
RichString_write(out, CRT_colors[DEFAULT_COLOR], this->value/*buffer*/); RichString_write(out, CRT_colors[DEFAULT_COLOR], this->value/*buffer*/);
} }
ObjectClass ListItem_class = {
.display = ListItem_display,
.delete = ListItem_delete
};
ListItem* ListItem_new(const char* value, int key) { ListItem* ListItem_new(const char* value, int key) {
ListItem* this = malloc(sizeof(ListItem)); ListItem* this = AllocThis(ListItem);
Object_setClass(this, LISTITEM_CLASS);
((Object*)this)->display = ListItem_display;
((Object*)this)->delete = ListItem_delete;
this->value = strdup(value); this->value = strdup(value);
this->key = key; this->key = key;
return this; return this;
......
...@@ -18,11 +18,7 @@ typedef struct ListItem_ { ...@@ -18,11 +18,7 @@ typedef struct ListItem_ {
} ListItem; } ListItem;
#ifdef DEBUG extern ObjectClass ListItem_class;
extern char* LISTITEM_CLASS;
#else
#define LISTITEM_CLASS NULL
#endif
ListItem* ListItem_new(const char* value, int key); ListItem* ListItem_new(const char* value, int key);
......
...@@ -67,10 +67,14 @@ static void LoadMeter_display(Object* cast, RichString* out) { ...@@ -67,10 +67,14 @@ static void LoadMeter_display(Object* cast, RichString* out) {
RichString_write(out, CRT_colors[LOAD], buffer); RichString_write(out, CRT_colors[LOAD], buffer);
} }
MeterType LoadAverageMeter = { MeterClass LoadAverageMeter_class = {
.super = {
.extends = Class(Meter),
.delete = Meter_delete,
.display = LoadAverageMeter_display,
},
.setValues = LoadAverageMeter_setValues, .setValues = LoadAverageMeter_setValues,
.display = LoadAverageMeter_display, .defaultMode = TEXT_METERMODE,
.mode = TEXT_METERMODE,
.items = 3, .items = 3,
.total = 100.0, .total = 100.0,
.attributes = LoadAverageMeter_attributes, .attributes = LoadAverageMeter_attributes,
...@@ -79,10 +83,14 @@ MeterType LoadAverageMeter = { ...@@ -79,10 +83,14 @@ MeterType LoadAverageMeter = {
.caption = "Load average: " .caption = "Load average: "
}; };
MeterType LoadMeter = { MeterClass LoadMeter_class = {
.super = {
.extends = Class(Meter),
.delete = Meter_delete,
.display = LoadMeter_display,
},
.setValues = LoadMeter_setValues, .setValues = LoadMeter_setValues,
.display = LoadMeter_display, .defaultMode = TEXT_METERMODE,
.mode = TEXT_METERMODE,
.items = 1, .items = 1,
.total = 100.0, .total = 100.0,
.attributes = LoadMeter_attributes, .attributes = LoadMeter_attributes,
......
...@@ -15,8 +15,8 @@ extern int LoadAverageMeter_attributes[]; ...@@ -15,8 +15,8 @@ extern int LoadAverageMeter_attributes[];
extern int LoadMeter_attributes[]; extern int LoadMeter_attributes[];
extern MeterType LoadAverageMeter; extern MeterClass LoadAverageMeter_class;
extern MeterType LoadMeter; extern MeterClass LoadMeter_class;
#endif #endif
...@@ -59,10 +59,14 @@ static void MemoryMeter_display(Object* cast, RichString* out) { ...@@ -59,10 +59,14 @@ static void MemoryMeter_display(Object* cast, RichString* out) {
RichString_append(out, CRT_colors[MEMORY_CACHE], buffer); RichString_append(out, CRT_colors[MEMORY_CACHE], buffer);
} }
MeterType MemoryMeter = { MeterClass MemoryMeter_class = {
.super = {
.extends = Class(Meter),
.delete = Meter_delete,
.display = MemoryMeter_display,
},
.setValues = MemoryMeter_setValues, .setValues = MemoryMeter_setValues,
.display = MemoryMeter_display, .defaultMode = BAR_METERMODE,
.mode = BAR_METERMODE,
.items = 3, .items = 3,
.total = 100.0, .total = 100.0,
.attributes = MemoryMeter_attributes, .attributes = MemoryMeter_attributes,
......
...@@ -13,6 +13,6 @@ in the source distribution for its full text. ...@@ -13,6 +13,6 @@ in the source distribution for its full text.
extern int MemoryMeter_attributes[]; extern int MemoryMeter_attributes[];
extern MeterType MemoryMeter; extern MeterClass MemoryMeter_class;
#endif #endif
...@@ -21,17 +21,14 @@ in the source distribution for its full text. ...@@ -21,17 +21,14 @@ in the source distribution for its full text.
#include "CRT.h" #include "CRT.h"
#include "String.h" #include "String.h"
#include "ListItem.h" #include "ListItem.h"
#include "Settings.h"
#include <math.h> #include <math.h>
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdarg.h> #include <stdarg.h>
#include <assert.h> #include <assert.h>
#include <time.h> #include <sys/time.h>
#ifndef USE_FUNKY_MODES
#define USE_FUNKY_MODES 1
#endif
#define METER_BUFFER_LEN 128 #define METER_BUFFER_LEN 128
...@@ -40,44 +37,52 @@ in the source distribution for its full text. ...@@ -40,44 +37,52 @@ in the source distribution for its full text.
#include "ProcessList.h" #include "ProcessList.h"
typedef struct Meter_ Meter; typedef struct Meter_ Meter;
typedef struct MeterType_ MeterType;
typedef struct MeterMode_ MeterMode;
typedef void(*MeterType_Init)(Meter*); typedef void(*Meter_Init)(Meter*);
typedef void(*MeterType_Done)(Meter*); typedef void(*Meter_Done)(Meter*);
typedef void(*MeterType_SetMode)(Meter*, int); typedef void(*Meter_UpdateMode)(Meter*, int);
typedef void(*Meter_SetValues)(Meter*, char*, int); typedef void(*Meter_SetValues)(Meter*, char*, int);
typedef void(*Meter_Draw)(Meter*, int, int, int); typedef void(*Meter_Draw)(Meter*, int, int, int);
struct MeterMode_ { typedef struct MeterClass_ {
Meter_Draw draw; ObjectClass super;
const char* uiName; const Meter_Init init;
int h; const Meter_Done done;
}; const Meter_UpdateMode updateMode;
const Meter_Draw draw;
struct MeterType_ { const Meter_SetValues setValues;
Meter_SetValues setValues; const int defaultMode;
Object_Display display;
int mode;
int items; int items;
double total; const double total;
int* attributes; const int* attributes;
const char* name; const char* name;
const char* uiName; const char* uiName;
const char* caption; const char* caption;
MeterType_Init init; } MeterClass;
MeterType_Done done;
MeterType_SetMode setMode; #define As_Meter(this_) ((MeterClass*)((this_)->super.klass))
Meter_Draw draw; #define Meter_initFn(this_) As_Meter(this_)->init
}; #define Meter_init(this_) As_Meter(this_)->init((Meter*)(this_))
#define Meter_done(this_) As_Meter(this_)->done((Meter*)(this_))
#define Meter_updateModeFn(this_) As_Meter(this_)->updateMode
#define Meter_updateMode(this_, m_) As_Meter(this_)->updateMode((Meter*)(this_), m_)
#define Meter_drawFn(this_) As_Meter(this_)->draw
#define Meter_doneFn(this_) As_Meter(this_)->done
#define Meter_setValues(this_, c_, i_) As_Meter(this_)->setValues((Meter*)(this_), c_, i_)
#define Meter_defaultMode(this_) As_Meter(this_)->defaultMode
#define Meter_getItems(this_) As_Meter(this_)->items
#define Meter_setItems(this_, n_) As_Meter(this_)->items = (n_)
#define Meter_attributes(this_) As_Meter(this_)->attributes
#define Meter_name(this_) As_Meter(this_)->name
#define Meter_uiName(this_) As_Meter(this_)->uiName
struct Meter_ { struct Meter_ {
Object super; Object super;
Meter_Draw draw;
char* caption; char* caption;
MeterType* type;
int mode; int mode;
int param; int param;
Meter_Draw draw;
void* drawData; void* drawData;
int h; int h;
ProcessList* pl; ProcessList* pl;
...@@ -85,24 +90,26 @@ struct Meter_ { ...@@ -85,24 +90,26 @@ struct Meter_ {
double total; double total;
}; };
#ifdef USE_FUNKY_MODES typedef struct MeterMode_ {
typedef struct GraphData_ { Meter_Draw draw;
time_t time; const char* uiName;
double values[METER_BUFFER_LEN]; int h;
} GraphData; } MeterMode;
#endif
typedef enum { typedef enum {
CUSTOM_METERMODE = 0, CUSTOM_METERMODE = 0,
BAR_METERMODE, BAR_METERMODE,
TEXT_METERMODE, TEXT_METERMODE,
#ifdef USE_FUNKY_MODES
GRAPH_METERMODE, GRAPH_METERMODE,
LED_METERMODE, LED_METERMODE,
#endif
LAST_METERMODE LAST_METERMODE
} MeterModeId; } MeterModeId;
typedef struct GraphData_ {
struct timeval time;
double values[METER_BUFFER_LEN];
} GraphData;
}*/ }*/
#ifndef MIN #ifndef MIN
...@@ -112,47 +119,44 @@ typedef enum { ...@@ -112,47 +119,44 @@ typedef enum {
#define MAX(a,b) ((a)>(b)?(a):(b)) #define MAX(a,b) ((a)>(b)?(a):(b))
#endif #endif
#ifdef DEBUG MeterClass Meter_class = {
char* METER_CLASS = "Meter"; .super = {
#else .extends = Class(Object)
#define METER_CLASS NULL }
#endif };
MeterType* Meter_types[] = { MeterClass* Meter_types[] = {
&CPUMeter, &CPUMeter_class,
&ClockMeter, &ClockMeter_class,
&LoadAverageMeter, &LoadAverageMeter_class,
&LoadMeter, &LoadMeter_class,
&MemoryMeter, &MemoryMeter_class,
&SwapMeter, &SwapMeter_class,
&TasksMeter, &TasksMeter_class,
&UptimeMeter, &UptimeMeter_class,
&BatteryMeter, &BatteryMeter_class,
&HostnameMeter, &HostnameMeter_class,
&AllCPUsMeter, &AllCPUsMeter_class,
&AllCPUs2Meter, &AllCPUs2Meter_class,
&LeftCPUsMeter, &LeftCPUsMeter_class,
&RightCPUsMeter, &RightCPUsMeter_class,
&LeftCPUs2Meter, &LeftCPUs2Meter_class,
&RightCPUs2Meter, &RightCPUs2Meter_class,
NULL NULL
}; };
Meter* Meter_new(ProcessList* pl, int param, MeterType* type) { Meter* Meter_new(ProcessList* pl, int param, MeterClass* type) {
Meter* this = calloc(sizeof(Meter), 1); Meter* this = calloc(sizeof(Meter), 1);
Object_setClass(this, METER_CLASS); Object_setClass(this, type);
((Object*)this)->delete = Meter_delete;
((Object*)this)->display = type->display;
this->h = 1; this->h = 1;
this->type = type;
this->param = param; this->param = param;
this->pl = pl; this->pl = pl;
this->values = calloc(sizeof(double), type->items); this->values = calloc(sizeof(double), type->items);
this->total = type->total; this->total = type->total;
this->caption = strdup(type->caption); this->caption = strdup(type->caption);
if (this->type->init) if (Meter_initFn(this))
this->type->init(this); Meter_init(this);
Meter_setMode(this, type->mode); Meter_setMode(this, type->defaultMode);
return this; return this;
} }
...@@ -160,8 +164,8 @@ void Meter_delete(Object* cast) { ...@@ -160,8 +164,8 @@ void Meter_delete(Object* cast) {
if (!cast) if (!cast)
return; return;
Meter* this = (Meter*) cast; Meter* this = (Meter*) cast;
if (this->type->done) { if (Meter_doneFn(this)) {
this->type->done(this); Meter_done(this);
} }
if (this->drawData) if (this->drawData)
free(this->drawData); free(this->drawData);
...@@ -176,12 +180,10 @@ void Meter_setCaption(Meter* this, const char* caption) { ...@@ -176,12 +180,10 @@ void Meter_setCaption(Meter* this, const char* caption) {
} }
static inline void Meter_displayBuffer(Meter* this, char* buffer, RichString* out) { static inline void Meter_displayBuffer(Meter* this, char* buffer, RichString* out) {
MeterType* type = this->type; if (Object_displayFn(this)) {
Object_Display display = ((Object*)this)->display; Object_display(this, out);
if (display) {
display((Object*)this, out);
} else { } else {
RichString_write(out, CRT_colors[type->attributes[0]], buffer); RichString_write(out, CRT_colors[Meter_attributes(this)[0]], buffer);
} }
} }
...@@ -191,10 +193,10 @@ void Meter_setMode(Meter* this, int modeIndex) { ...@@ -191,10 +193,10 @@ void Meter_setMode(Meter* this, int modeIndex) {
if (!modeIndex) if (!modeIndex)
modeIndex = 1; modeIndex = 1;
assert(modeIndex < LAST_METERMODE); assert(modeIndex < LAST_METERMODE);
if (this->type->mode == 0) { if (Meter_defaultMode(this) == CUSTOM_METERMODE) {
this->draw = this->type->draw; this->draw = Meter_drawFn(this);
if (this->type->setMode) if (Meter_updateModeFn(this))
this->type->setMode(this, modeIndex); Meter_updateMode(this, modeIndex);
} else { } else {
assert(modeIndex >= 1); assert(modeIndex >= 1);
if (this->drawData) if (this->drawData)
...@@ -209,7 +211,6 @@ void Meter_setMode(Meter* this, int modeIndex) { ...@@ -209,7 +211,6 @@ void Meter_setMode(Meter* this, int modeIndex) {
} }
ListItem* Meter_toListItem(Meter* this) { ListItem* Meter_toListItem(Meter* this) {
MeterType* type = this->type;
char mode[21]; char mode[21];
if (this->mode) if (this->mode)
snprintf(mode, 20, " [%s]", Meter_modes[this->mode]->uiName); snprintf(mode, 20, " [%s]", Meter_modes[this->mode]->uiName);
...@@ -221,16 +222,15 @@ ListItem* Meter_toListItem(Meter* this) { ...@@ -221,16 +222,15 @@ ListItem* Meter_toListItem(Meter* this) {
else else
number[0] = '\0'; number[0] = '\0';
char buffer[51]; char buffer[51];
snprintf(buffer, 50, "%s%s%s", type->uiName, number, mode); snprintf(buffer, 50, "%s%s%s", Meter_uiName(this), number, mode);
return ListItem_new(buffer, 0); return ListItem_new(buffer, 0);
} }
/* ---------- TextMeterMode ---------- */ /* ---------- TextMeterMode ---------- */
static void TextMeterMode_draw(Meter* this, int x, int y, int w) { static void TextMeterMode_draw(Meter* this, int x, int y, int w) {
MeterType* type = this->type;
char buffer[METER_BUFFER_LEN]; char buffer[METER_BUFFER_LEN];
type->setValues(this, buffer, METER_BUFFER_LEN - 1); Meter_setValues(this, buffer, METER_BUFFER_LEN - 1);
attrset(CRT_colors[METER_TEXT]); attrset(CRT_colors[METER_TEXT]);
mvaddstr(y, x, this->caption); mvaddstr(y, x, this->caption);
...@@ -250,9 +250,8 @@ static void TextMeterMode_draw(Meter* this, int x, int y, int w) { ...@@ -250,9 +250,8 @@ static void TextMeterMode_draw(Meter* this, int x, int y, int w) {
static char BarMeterMode_characters[] = "|#*@$%&"; static char BarMeterMode_characters[] = "|#*@$%&";
static void BarMeterMode_draw(Meter* this, int x, int y, int w) { static void BarMeterMode_draw(Meter* this, int x, int y, int w) {
MeterType* type = this->type;
char buffer[METER_BUFFER_LEN]; char buffer[METER_BUFFER_LEN];
type->setValues(this, buffer, METER_BUFFER_LEN - 1); Meter_setValues(this, buffer, METER_BUFFER_LEN - 1);
w -= 2; w -= 2;
attrset(CRT_colors[METER_TEXT]); attrset(CRT_colors[METER_TEXT]);
...@@ -282,7 +281,8 @@ static void BarMeterMode_draw(Meter* this, int x, int y, int w) { ...@@ -282,7 +281,8 @@ static void BarMeterMode_draw(Meter* this, int x, int y, int w) {
// First draw in the bar[] buffer... // First draw in the bar[] buffer...
int offset = 0; int offset = 0;
for (int i = 0; i < type->items; i++) { int items = Meter_getItems(this);
for (int i = 0; i < items; i++) {
double value = this->values[i]; double value = this->values[i];
value = MAX(value, 0); value = MAX(value, 0);
value = MIN(value, this->total); value = MIN(value, this->total);
...@@ -307,8 +307,8 @@ static void BarMeterMode_draw(Meter* this, int x, int y, int w) { ...@@ -307,8 +307,8 @@ static void BarMeterMode_draw(Meter* this, int x, int y, int w) {
// ...then print the buffer. // ...then print the buffer.
offset = 0; offset = 0;
for (int i = 0; i < type->items; i++) { for (int i = 0; i < items; i++) {
attrset(CRT_colors[type->attributes[i]]); attrset(CRT_colors[Meter_attributes(this)[i]]);
mvaddnstr(y, x + offset, bar + offset, blockSizes[i]); mvaddnstr(y, x + offset, bar + offset, blockSizes[i]);
offset += blockSizes[i]; offset += blockSizes[i];
offset = MAX(offset, 0); offset = MAX(offset, 0);
...@@ -323,8 +323,6 @@ static void BarMeterMode_draw(Meter* this, int x, int y, int w) { ...@@ -323,8 +323,6 @@ static void BarMeterMode_draw(Meter* this, int x, int y, int w) {
attrset(CRT_colors[RESET_COLOR]); attrset(CRT_colors[RESET_COLOR]);
} }
#ifdef USE_FUNKY_MODES
/* ---------- GraphMeterMode ---------- */ /* ---------- GraphMeterMode ---------- */
#define DrawDot(a,y,c) do { attrset(a); mvaddch(y, x+k, c); } while(0) #define DrawDot(a,y,c) do { attrset(a); mvaddch(y, x+k, c); } while(0)
...@@ -347,19 +345,21 @@ static void GraphMeterMode_draw(Meter* this, int x, int y, int w) { ...@@ -347,19 +345,21 @@ static void GraphMeterMode_draw(Meter* this, int x, int y, int w) {
GraphData* data = (GraphData*) this->drawData; GraphData* data = (GraphData*) this->drawData;
const int nValues = METER_BUFFER_LEN; const int nValues = METER_BUFFER_LEN;
time_t now = time(NULL); struct timeval now;
if (now > data->time) { gettimeofday(&now, NULL);
data->time = now; if (!timercmp(&now, &(data->time), <)) {
struct timeval delay = { .tv_sec = (int)(DEFAULT_DELAY/10), .tv_usec = (DEFAULT_DELAY-((int)(DEFAULT_DELAY/10)*10)) * 100000 };
timeradd(&now, &delay, &(data->time));
for (int i = 0; i < nValues - 1; i++) for (int i = 0; i < nValues - 1; i++)
data->values[i] = data->values[i+1]; data->values[i] = data->values[i+1];
MeterType* type = this->type;
char buffer[nValues]; char buffer[nValues];
type->setValues(this, buffer, nValues - 1); Meter_setValues(this, buffer, nValues - 1);
double value = 0.0; double value = 0.0;
for (int i = 0; i < type->items; i++) int items = Meter_getItems(this);
for (int i = 0; i < items; i++)
value += this->values[i]; value += this->values[i];
value /= this->total; value /= this->total;
data->values[nValues - 1] = value; data->values[nValues - 1] = value;
...@@ -383,28 +383,39 @@ static void GraphMeterMode_draw(Meter* this, int x, int y, int w) { ...@@ -383,28 +383,39 @@ static void GraphMeterMode_draw(Meter* this, int x, int y, int w) {
/* ---------- LEDMeterMode ---------- */ /* ---------- LEDMeterMode ---------- */
static const char* LEDMeterMode_digits[3][10] = { static const char* LEDMeterMode_digitsAscii[3][10] = {
{ " __ "," "," __ "," __ "," "," __ "," __ "," __ "," __ "," __ "}, { " __ "," "," __ "," __ "," "," __ "," __ "," __ "," __ "," __ "},
{ "| |"," |"," __|"," __|","|__|","|__ ","|__ "," |","|__|","|__|"}, { "| |"," |"," __|"," __|","|__|","|__ ","|__ "," |","|__|","|__|"},
{ "|__|"," |","|__ "," __|"," |"," __|","|__|"," |","|__|"," __|"}, { "|__|"," |","|__ "," __|"," |"," __|","|__|"," |","|__|"," __|"},
}; };
static const char* LEDMeterMode_digitsUtf8[3][10] = {
{ "┌──┐"," ┐ ","╶──┐","╶──┐","╷ ╷","┌──╴","┌──╴","╶──┐","┌──┐","┌──┐"},
{ "│ │"," │ ","┌──┘"," ──┤","└──┤","└──┐","├──┐"," │","├──┤","└──┤"},
{ "└──┘"," ╵ ","└──╴","╶──┘"," ╵","╶──┘","└──┘"," ╵","└──┘"," ──┘"},
};
static void LEDMeterMode_drawDigit(int x, int y, int n) { static void LEDMeterMode_drawDigit(int x, int y, int n) {
for (int i = 0; i < 3; i++) if (CRT_utf8) {
mvaddstr(y+i, x, LEDMeterMode_digits[i][n]); for (int i = 0; i < 3; i++)
mvaddstr(y+i, x, LEDMeterMode_digitsUtf8[i][n]);
} else {
for (int i = 0; i < 3; i++)
mvaddstr(y+i, x, LEDMeterMode_digitsAscii[i][n]);
}
} }
static void LEDMeterMode_draw(Meter* this, int x, int y, int w) { static void LEDMeterMode_draw(Meter* this, int x, int y, int w) {
(void) w; (void) w;
MeterType* type = this->type;
char buffer[METER_BUFFER_LEN]; char buffer[METER_BUFFER_LEN];
type->setValues(this, buffer, METER_BUFFER_LEN - 1); Meter_setValues(this, buffer, METER_BUFFER_LEN - 1);
RichString_begin(out); RichString_begin(out);
Meter_displayBuffer(this, buffer, &out); Meter_displayBuffer(this, buffer, &out);
int yText = CRT_utf8 ? y+1 : y+2;
attrset(CRT_colors[LED_COLOR]); attrset(CRT_colors[LED_COLOR]);
mvaddstr(y+2, x, this->caption); mvaddstr(yText, x, this->caption);
int xx = x + strlen(this->caption); int xx = x + strlen(this->caption);
int len = RichString_sizeVal(out); int len = RichString_sizeVal(out);
for (int i = 0; i < len; i++) { for (int i = 0; i < len; i++) {
...@@ -413,7 +424,7 @@ static void LEDMeterMode_draw(Meter* this, int x, int y, int w) { ...@@ -413,7 +424,7 @@ static void LEDMeterMode_draw(Meter* this, int x, int y, int w) {
LEDMeterMode_drawDigit(xx, y, c-48); LEDMeterMode_drawDigit(xx, y, c-48);
xx += 4; xx += 4;
} else { } else {
mvaddch(y+2, xx, c); mvaddch(yText, xx, c);
xx += 1; xx += 1;
} }
} }
...@@ -421,8 +432,6 @@ static void LEDMeterMode_draw(Meter* this, int x, int y, int w) { ...@@ -421,8 +432,6 @@ static void LEDMeterMode_draw(Meter* this, int x, int y, int w) {
RichString_end(out); RichString_end(out);
} }
#endif
static MeterMode BarMeterMode = { static MeterMode BarMeterMode = {
.uiName = "Bar", .uiName = "Bar",
.h = 1, .h = 1,
...@@ -435,8 +444,6 @@ static MeterMode TextMeterMode = { ...@@ -435,8 +444,6 @@ static MeterMode TextMeterMode = {
.draw = TextMeterMode_draw, .draw = TextMeterMode_draw,
}; };
#ifdef USE_FUNKY_MODES
static MeterMode GraphMeterMode = { static MeterMode GraphMeterMode = {
.uiName = "Graph", .uiName = "Graph",
.h = 3, .h = 3,
...@@ -449,15 +456,11 @@ static MeterMode LEDMeterMode = { ...@@ -449,15 +456,11 @@ static MeterMode LEDMeterMode = {
.draw = LEDMeterMode_draw, .draw = LEDMeterMode_draw,
}; };
#endif
MeterMode* Meter_modes[] = { MeterMode* Meter_modes[] = {
NULL, NULL,
&BarMeterMode, &BarMeterMode,
&TextMeterMode, &TextMeterMode,
#ifdef USE_FUNKY_MODES
&GraphMeterMode, &GraphMeterMode,
&LEDMeterMode, &LEDMeterMode,
#endif
NULL NULL
}; };
...@@ -9,54 +9,58 @@ Released under the GNU GPL, see the COPYING file ...@@ -9,54 +9,58 @@ Released under the GNU GPL, see the COPYING file
in the source distribution for its full text. in the source distribution for its full text.
*/ */
#ifndef USE_FUNKY_MODES
#define USE_FUNKY_MODES 1
#endif
#define METER_BUFFER_LEN 128 #define METER_BUFFER_LEN 128
#include "ListItem.h" #include "ListItem.h"
#include "ProcessList.h" #include "ProcessList.h"
typedef struct Meter_ Meter; typedef struct Meter_ Meter;
typedef struct MeterType_ MeterType;
typedef struct MeterMode_ MeterMode;
typedef void(*MeterType_Init)(Meter*); typedef void(*Meter_Init)(Meter*);
typedef void(*MeterType_Done)(Meter*); typedef void(*Meter_Done)(Meter*);
typedef void(*MeterType_SetMode)(Meter*, int); typedef void(*Meter_UpdateMode)(Meter*, int);
typedef void(*Meter_SetValues)(Meter*, char*, int); typedef void(*Meter_SetValues)(Meter*, char*, int);
typedef void(*Meter_Draw)(Meter*, int, int, int); typedef void(*Meter_Draw)(Meter*, int, int, int);
struct MeterMode_ { typedef struct MeterClass_ {
Meter_Draw draw; ObjectClass super;
const char* uiName; const Meter_Init init;
int h; const Meter_Done done;
}; const Meter_UpdateMode updateMode;
const Meter_Draw draw;
struct MeterType_ { const Meter_SetValues setValues;
Meter_SetValues setValues; const int defaultMode;
Object_Display display;
int mode;
int items; int items;
double total; const double total;
int* attributes; const int* attributes;
const char* name; const char* name;
const char* uiName; const char* uiName;
const char* caption; const char* caption;
MeterType_Init init; } MeterClass;
MeterType_Done done;
MeterType_SetMode setMode; #define As_Meter(this_) ((MeterClass*)((this_)->super.klass))
Meter_Draw draw; #define Meter_initFn(this_) As_Meter(this_)->init
}; #define Meter_init(this_) As_Meter(this_)->init((Meter*)(this_))
#define Meter_done(this_) As_Meter(this_)->done((Meter*)(this_))
#define Meter_updateModeFn(this_) As_Meter(this_)->updateMode
#define Meter_updateMode(this_, m_) As_Meter(this_)->updateMode((Meter*)(this_), m_)
#define Meter_drawFn(this_) As_Meter(this_)->draw
#define Meter_doneFn(this_) As_Meter(this_)->done
#define Meter_setValues(this_, c_, i_) As_Meter(this_)->setValues((Meter*)(this_), c_, i_)
#define Meter_defaultMode(this_) As_Meter(this_)->defaultMode
#define Meter_getItems(this_) As_Meter(this_)->items
#define Meter_setItems(this_, n_) As_Meter(this_)->items = (n_)
#define Meter_attributes(this_) As_Meter(this_)->attributes
#define Meter_name(this_) As_Meter(this_)->name
#define Meter_uiName(this_) As_Meter(this_)->uiName
struct Meter_ { struct Meter_ {
Object super; Object super;
Meter_Draw draw;
char* caption; char* caption;
MeterType* type;
int mode; int mode;
int param; int param;
Meter_Draw draw;
void* drawData; void* drawData;
int h; int h;
ProcessList* pl; ProcessList* pl;
...@@ -64,24 +68,26 @@ struct Meter_ { ...@@ -64,24 +68,26 @@ struct Meter_ {
double total; double total;
}; };
#ifdef USE_FUNKY_MODES typedef struct MeterMode_ {
typedef struct GraphData_ { Meter_Draw draw;
time_t time; const char* uiName;
double values[METER_BUFFER_LEN]; int h;
} GraphData; } MeterMode;
#endif
typedef enum { typedef enum {
CUSTOM_METERMODE = 0, CUSTOM_METERMODE = 0,
BAR_METERMODE, BAR_METERMODE,
TEXT_METERMODE, TEXT_METERMODE,
#ifdef USE_FUNKY_MODES
GRAPH_METERMODE, GRAPH_METERMODE,
LED_METERMODE, LED_METERMODE,
#endif
LAST_METERMODE LAST_METERMODE
} MeterModeId; } MeterModeId;
typedef struct GraphData_ {
struct timeval time;
double values[METER_BUFFER_LEN];
} GraphData;
#ifndef MIN #ifndef MIN
#define MIN(a,b) ((a)<(b)?(a):(b)) #define MIN(a,b) ((a)<(b)?(a):(b))
...@@ -90,15 +96,11 @@ typedef enum { ...@@ -90,15 +96,11 @@ typedef enum {
#define MAX(a,b) ((a)>(b)?(a):(b)) #define MAX(a,b) ((a)>(b)?(a):(b))
#endif #endif
#ifdef DEBUG extern MeterClass Meter_class;
extern char* METER_CLASS;
#else
#define METER_CLASS NULL
#endif
extern MeterType* Meter_types[]; extern MeterClass* Meter_types[];
Meter* Meter_new(ProcessList* pl, int param, MeterType* type); Meter* Meter_new(ProcessList* pl, int param, MeterClass* type);
void Meter_delete(Object* cast); void Meter_delete(Object* cast);
...@@ -112,20 +114,12 @@ ListItem* Meter_toListItem(Meter* this); ...@@ -112,20 +114,12 @@ ListItem* Meter_toListItem(Meter* this);
/* ---------- BarMeterMode ---------- */ /* ---------- BarMeterMode ---------- */
#ifdef USE_FUNKY_MODES
/* ---------- GraphMeterMode ---------- */ /* ---------- GraphMeterMode ---------- */
#define DrawDot(a,y,c) do { attrset(a); mvaddch(y, x+k, c); } while(0) #define DrawDot(a,y,c) do { attrset(a); mvaddch(y, x+k, c); } while(0)
/* ---------- LEDMeterMode ---------- */ /* ---------- LEDMeterMode ---------- */
#endif
#ifdef USE_FUNKY_MODES
#endif
extern MeterMode* Meter_modes[]; extern MeterMode* Meter_modes[];
#endif #endif
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment