3
(C) 2004 Hisham H. Muhammad
4
Released under the GNU GPL, see the COPYING file
5
in the source distribution for its full text.
10
#include "MemoryMeter.h"
11
#include "SwapMeter.h"
12
#include "LoadMeter.h"
13
#include "LoadAverageMeter.h"
14
#include "UptimeMeter.h"
15
#include "ClockMeter.h"
16
#include "TasksMeter.h"
23
typedef enum HeaderSide_ {
28
typedef struct Header_ {
29
TypedVector* leftMeters;
30
TypedVector* rightMeters;
39
Header* Header_new(ProcessList* pl) {
40
Header* this = malloc(sizeof(Header));
41
this->leftMeters = TypedVector_new(METER_CLASS, true, DEFAULT_SIZE);
42
this->rightMeters = TypedVector_new(METER_CLASS, true, DEFAULT_SIZE);
48
void Header_delete(Header* this) {
49
TypedVector_delete(this->leftMeters);
50
TypedVector_delete(this->rightMeters);
54
void Header_createMeter(Header* this, char* name, HeaderSide side) {
55
TypedVector* meters = side == LEFT_HEADER
59
if (String_eq(name, "Swap")) {
60
TypedVector_add(meters, SwapMeter_new(this->pl));
61
} else if (String_eq(name, "Memory")) {
62
TypedVector_add(meters, MemoryMeter_new(this->pl));
63
} else if (String_eq(name, "Clock")) {
64
TypedVector_add(meters, ClockMeter_new(this->pl));
65
} else if (String_eq(name, "Load")) {
66
TypedVector_add(meters, LoadMeter_new(this->pl));
67
} else if (String_eq(name, "LoadAverage")) {
68
TypedVector_add(meters, LoadAverageMeter_new(this->pl));
69
} else if (String_eq(name, "Uptime")) {
70
TypedVector_add(meters, UptimeMeter_new(this->pl));
71
} else if (String_eq(name, "Tasks")) {
72
TypedVector_add(meters, TasksMeter_new(this->pl));
73
} else if (String_startsWith(name, "CPUAverage")) {
74
TypedVector_add(meters, CPUMeter_new(this->pl, 0));
75
} else if (String_startsWith(name, "CPU")) {
77
sscanf(name, "CPU(%d)", &num);
78
TypedVector_add(meters, CPUMeter_new(this->pl, num));
82
void Header_setMode(Header* this, int i, MeterMode mode, HeaderSide side) {
83
TypedVector* meters = side == LEFT_HEADER
87
Meter* meter = (Meter*) TypedVector_get(meters, i);
88
Meter_setMode(meter, mode);
91
Meter* Header_getMeter(Header* this, int i, HeaderSide side) {
92
TypedVector* meters = side == LEFT_HEADER
96
return (Meter*) TypedVector_get(meters, i);
99
int Header_size(Header* this, HeaderSide side) {
100
TypedVector* meters = side == LEFT_HEADER
104
return TypedVector_size(meters);
107
char* Header_readMeterName(Header* this, int i, HeaderSide side) {
108
TypedVector* meters = side == LEFT_HEADER
112
Meter* meter = (Meter*) TypedVector_get(meters, i);
116
MeterMode Header_readMeterMode(Header* this, int i, HeaderSide side) {
117
TypedVector* meters = side == LEFT_HEADER
121
Meter* meter = (Meter*) TypedVector_get(meters, i);
125
void Header_defaultMeters(Header* this) {
126
for (int i = 1; i <= this->pl->processorCount; i++) {
127
TypedVector_add(this->leftMeters, CPUMeter_new(this->pl, i));
129
TypedVector_add(this->leftMeters, MemoryMeter_new(this->pl));
130
TypedVector_add(this->leftMeters, SwapMeter_new(this->pl));
131
TypedVector_add(this->rightMeters, TasksMeter_new(this->pl));
132
TypedVector_add(this->rightMeters, LoadAverageMeter_new(this->pl));
133
TypedVector_add(this->rightMeters, UptimeMeter_new(this->pl));
136
void Header_draw(Header* this) {
137
int height = this->height;
140
for (int y = 0; y < height; y++) {
141
mvhline(y, 0, ' ', COLS);
143
for (int y = (pad / 2), i = 0; i < TypedVector_size(this->leftMeters); i++) {
144
Meter* meter = (Meter*) TypedVector_get(this->leftMeters, i);
145
meter->draw(meter, pad, y, COLS / 2 - (pad * 2 - 1) - 1);
148
for (int y = (pad / 2), i = 0; i < TypedVector_size(this->rightMeters); i++) {
149
Meter* meter = (Meter*) TypedVector_get(this->rightMeters, i);
150
meter->draw(meter, COLS / 2 + pad, y, COLS / 2 - (pad * 2 - 1) - 1);
155
int Header_calculateHeight(Header* this) {
156
int pad = this->margin ? 2 : 0;
157
int leftHeight = pad;
158
int rightHeight = pad;
160
for (int i = 0; i < TypedVector_size(this->leftMeters); i++) {
161
Meter* meter = (Meter*) TypedVector_get(this->leftMeters, i);
162
leftHeight += meter->h;
164
for (int i = 0; i < TypedVector_size(this->rightMeters); i++) {
165
Meter* meter = (Meter*) TypedVector_get(this->rightMeters, i);
166
rightHeight += meter->h;
169
this->height = MAX(leftHeight, rightHeight);