summaryrefslogtreecommitdiffstats
path: root/Header.c
diff options
context:
space:
mode:
authorHisham Muhammad <hisham@gobolinux.org>2015-01-21 23:27:31 -0200
committerHisham Muhammad <hisham@gobolinux.org>2015-01-21 23:27:31 -0200
commit3383d8e5561dfc6fb2b65e0a194df94ccb5e08af (patch)
treedafba704561386b31b6b8af6dafb5b9a2ba7453c /Header.c
parent36b78328843d0dae0d0fadbd0e814a8a1546327c (diff)
Sorry about the mega-patch.
This is a work-in-progress, code is currently broken. (Some actions, and notably, the header, are missing.)
Diffstat (limited to 'Header.c')
-rw-r--r--Header.c135
1 files changed, 64 insertions, 71 deletions
diff --git a/Header.c b/Header.c
index e3ab7f29..8b7cef6d 100644
--- a/Header.c
+++ b/Header.c
@@ -17,20 +17,15 @@ in the source distribution for its full text.
#include <stdlib.h>
/*{
-#include "ProcessList.h"
#include "Meter.h"
-
-typedef enum HeaderSide_ {
- LEFT_HEADER,
- RIGHT_HEADER
-} HeaderSide;
+#include "Vector.h"
typedef struct Header_ {
- Vector* leftMeters;
- Vector* rightMeters;
- ProcessList* pl;
+ Vector** columns;
+ struct ProcessList_* pl;
int height;
int pad;
+ int nrColumns;
bool margin;
} Header;
@@ -40,25 +35,32 @@ typedef struct Header_ {
#define MAX(a,b) ((a)>(b)?(a):(b))
#endif
-Header* Header_new(ProcessList* pl) {
+#ifndef Header_forEachColumn
+#define Header_forEachColumn(this_, i_) for (int i_=0; i_ < this->nrColumns; i_++)
+#endif
+
+Header* Header_new(struct ProcessList_* pl, int nrColumns) {
Header* this = calloc(1, sizeof(Header));
- this->leftMeters = Vector_new(Class(Meter), true, DEFAULT_SIZE);
- this->rightMeters = Vector_new(Class(Meter), true, DEFAULT_SIZE);
+ this->columns = calloc(nrColumns, sizeof(Vector*));
+ this->nrColumns = nrColumns;
+ Header_forEachColumn(this, i) {
+ this->columns[i] = Vector_new(Class(Meter), true, DEFAULT_SIZE);
+ }
this->margin = true;
this->pl = pl;
return this;
}
void Header_delete(Header* this) {
- Vector_delete(this->leftMeters);
- Vector_delete(this->rightMeters);
+ Header_forEachColumn(this, i) {
+ Vector_delete(this->columns[i]);
+ }
+ free(this->columns);
free(this);
}
-void Header_createMeter(Header* this, char* name, HeaderSide side) {
- Vector* meters = side == LEFT_HEADER
- ? this->leftMeters
- : this->rightMeters;
+MeterModeId Header_addMeterByName(Header* this, char* name, int column) {
+ Vector* meters = this->columns[column];
char* paren = strchr(name, '(');
int param = 0;
@@ -67,18 +69,20 @@ void Header_createMeter(Header* this, char* name, HeaderSide side) {
if (!ok) param = 0;
*paren = '\0';
}
+ MeterModeId mode = TEXT_METERMODE;
for (MeterClass** type = Platform_meterTypes; *type; type++) {
if (String_eq(name, (*type)->name)) {
- Vector_add(meters, Meter_new(this->pl, param, *type));
+ Meter* meter = Meter_new(this->pl, param, *type);
+ Vector_add(meters, meter);
+ mode = meter->mode;
break;
}
}
+ return mode;
}
-void Header_setMode(Header* this, int i, MeterModeId mode, HeaderSide side) {
- Vector* meters = side == LEFT_HEADER
- ? this->leftMeters
- : this->rightMeters;
+void Header_setMode(Header* this, int i, MeterModeId mode, int column) {
+ Vector* meters = this->columns[column];
if (i >= Vector_size(meters))
return;
@@ -86,28 +90,21 @@ void Header_setMode(Header* this, int i, MeterModeId mode, HeaderSide side) {
Meter_setMode(meter, mode);
}
-Meter* Header_addMeter(Header* this, MeterClass* type, int param, HeaderSide side) {
- Vector* meters = side == LEFT_HEADER
- ? this->leftMeters
- : this->rightMeters;
+Meter* Header_addMeterByClass(Header* this, MeterClass* type, int param, int column) {
+ Vector* meters = this->columns[column];
Meter* meter = Meter_new(this->pl, param, type);
Vector_add(meters, meter);
return meter;
}
-int Header_size(Header* this, HeaderSide side) {
- Vector* meters = side == LEFT_HEADER
- ? this->leftMeters
- : this->rightMeters;
-
+int Header_size(Header* this, int column) {
+ Vector* meters = this->columns[column];
return Vector_size(meters);
}
-char* Header_readMeterName(Header* this, int i, HeaderSide side) {
- Vector* meters = side == LEFT_HEADER
- ? this->leftMeters
- : this->rightMeters;
+char* Header_readMeterName(Header* this, int i, int column) {
+ Vector* meters = this->columns[column];
Meter* meter = (Meter*) Vector_get(meters, i);
int nameLen = strlen(Meter_name(meter));
@@ -121,25 +118,20 @@ char* Header_readMeterName(Header* this, int i, HeaderSide side) {
return name;
}
-MeterModeId Header_readMeterMode(Header* this, int i, HeaderSide side) {
- Vector* meters = side == LEFT_HEADER
- ? this->leftMeters
- : this->rightMeters;
+MeterModeId Header_readMeterMode(Header* this, int i, int column) {
+ Vector* meters = this->columns[column];
Meter* meter = (Meter*) Vector_get(meters, i);
return meter->mode;
}
void Header_reinit(Header* this) {
- for (int i = 0; i < Vector_size(this->leftMeters); i++) {
- Meter* meter = (Meter*) Vector_get(this->leftMeters, i);
- if (Meter_initFn(meter))
- Meter_init(meter);
- }
- for (int i = 0; i < Vector_size(this->rightMeters); i++) {
- Meter* meter = (Meter*) Vector_get(this->rightMeters, i);
- if (Meter_initFn(meter))
- Meter_init(meter);
+ Header_forEachColumn(this, col) {
+ for (int i = 0; i < Vector_size(this->columns[col]); i++) {
+ Meter* meter = (Meter*) Vector_get(this->columns[col], i);
+ if (Meter_initFn(meter))
+ Meter_init(meter);
+ }
}
}
@@ -150,32 +142,33 @@ void Header_draw(const Header* this) {
for (int y = 0; y < height; y++) {
mvhline(y, 0, ' ', COLS);
}
- for (int y = (pad / 2), i = 0; i < Vector_size(this->leftMeters); i++) {
- Meter* meter = (Meter*) Vector_get(this->leftMeters, i);
- meter->draw(meter, pad, y, COLS / 2 - (pad * 2 - 1) - 1);
- y += meter->h;
- }
- for (int y = (pad / 2), i = 0; i < Vector_size(this->rightMeters); i++) {
- Meter* meter = (Meter*) Vector_get(this->rightMeters, i);
- meter->draw(meter, COLS / 2 + pad, y, COLS / 2 - (pad * 2 - 1) - 1);
- y += meter->h;
+ int width = COLS / this->nrColumns - (pad * this->nrColumns - 1) - 1;
+ int x = pad;
+
+ Header_forEachColumn(this, col) {
+ Vector* meters = this->columns[col];
+ for (int y = (pad / 2), i = 0; i < Vector_size(meters); i++) {
+ Meter* meter = (Meter*) Vector_get(meters, i);
+ meter->draw(meter, x, y, width);
+ y += meter->h;
+ }
+ x += width + pad;
}
}
int Header_calculateHeight(Header* this) {
int pad = this->margin ? 2 : 0;
- int leftHeight = pad;
- int rightHeight = pad;
-
- for (int i = 0; i < Vector_size(this->leftMeters); i++) {
- Meter* meter = (Meter*) Vector_get(this->leftMeters, i);
- leftHeight += meter->h;
- }
- for (int i = 0; i < Vector_size(this->rightMeters); i++) {
- Meter* meter = (Meter*) Vector_get(this->rightMeters, i);
- rightHeight += meter->h;
+ int maxHeight = pad;
+
+ Header_forEachColumn(this, col) {
+ Vector* meters = this->columns[col];
+ int height = pad;
+ for (int i = 0; i < Vector_size(meters); i++) {
+ Meter* meter = (Meter*) Vector_get(meters, i);
+ height += meter->h;
+ }
+ maxHeight = MAX(maxHeight, height);
}
- this->pad = pad;
- this->height = MAX(leftHeight, rightHeight);
- return this->height;
+ this->height = maxHeight;
+ return maxHeight;
}

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