Header.c 5.89 KB
Newer Older
Hisham Muhammad's avatar
Hisham Muhammad committed
1
2
/*
htop - Header.c
Hisham Muhammad's avatar
Hisham Muhammad committed
3
(C) 2004-2011 Hisham H. Muhammad
Hisham Muhammad's avatar
Hisham Muhammad committed
4
5
6
7
8
9
Released under the GNU GPL, see the COPYING file
in the source distribution for its full text.
*/

#include "Header.h"

Hisham Muhammad's avatar
Hisham Muhammad committed
10
11
12
13
14
15
16
17
18
19
20
#include "CRT.h"
#include "CPUMeter.h"
#include "MemoryMeter.h"
#include "SwapMeter.h"
#include "TasksMeter.h"
#include "LoadAverageMeter.h"
#include "UptimeMeter.h"
#include "BatteryMeter.h"
#include "ClockMeter.h"
#include "HostnameMeter.h"
#include "String.h"
Hisham Muhammad's avatar
Hisham Muhammad committed
21
#include "debug.h"
Hisham Muhammad's avatar
Hisham Muhammad committed
22

Hisham Muhammad's avatar
Hisham Muhammad committed
23
#include <assert.h>
24
#include <time.h>
Hisham Muhammad's avatar
Hisham Muhammad committed
25
26
#include <string.h>
#include <stdlib.h>
Hisham Muhammad's avatar
Hisham Muhammad committed
27
28

/*{
Hisham Muhammad's avatar
Hisham Muhammad committed
29
30
#include "ProcessList.h"
#include "Meter.h"
Hisham Muhammad's avatar
Hisham Muhammad committed
31
32
33
34
35
36
37

typedef enum HeaderSide_ {
   LEFT_HEADER,
   RIGHT_HEADER
} HeaderSide;

typedef struct Header_ {
38
39
   Vector* leftMeters;
   Vector* rightMeters;
Hisham Muhammad's avatar
Hisham Muhammad committed
40
41
42
43
44
45
46
47
48
49
50
51
52
   ProcessList* pl;
   bool margin;
   int height;
   int pad;
} Header;

}*/

#ifndef MAX
#define MAX(a,b) ((a)>(b)?(a):(b))
#endif

Header* Header_new(ProcessList* pl) {
53
   Header* this = calloc(sizeof(Header), 1);
54
55
   this->leftMeters = Vector_new(METER_CLASS, true, DEFAULT_SIZE, NULL);
   this->rightMeters = Vector_new(METER_CLASS, true, DEFAULT_SIZE, NULL);
Hisham Muhammad's avatar
Hisham Muhammad committed
56
57
58
59
60
61
   this->margin = true;
   this->pl = pl;
   return this;
}

void Header_delete(Header* this) {
62
63
   Vector_delete(this->leftMeters);
   Vector_delete(this->rightMeters);
Hisham Muhammad's avatar
Hisham Muhammad committed
64
65
66
67
   free(this);
}

void Header_createMeter(Header* this, char* name, HeaderSide side) {
68
   Vector* meters = side == LEFT_HEADER
Hisham Muhammad's avatar
Hisham Muhammad committed
69
70
71
                       ? this->leftMeters
                       : this->rightMeters;

72
73
74
75
76
77
78
79
80
   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)) {
81
         Vector_add(meters, Meter_new(this->pl, param, *type));
82
83
         break;
      }
Hisham Muhammad's avatar
Hisham Muhammad committed
84
85
86
   }
}

87
void Header_setMode(Header* this, int i, MeterModeId mode, HeaderSide side) {
88
   Vector* meters = side == LEFT_HEADER
Hisham Muhammad's avatar
Hisham Muhammad committed
89
90
91
                       ? this->leftMeters
                       : this->rightMeters;

92
93
   if (i >= Vector_size(meters))
      return;
94
   Meter* meter = (Meter*) Vector_get(meters, i);
Hisham Muhammad's avatar
Hisham Muhammad committed
95
96
97
   Meter_setMode(meter, mode);
}

98
Meter* Header_addMeter(Header* this, MeterType* type, int param, HeaderSide side) {
99
   Vector* meters = side == LEFT_HEADER
Hisham Muhammad's avatar
Hisham Muhammad committed
100
101
102
                       ? this->leftMeters
                       : this->rightMeters;

103
   Meter* meter = Meter_new(this->pl, param, type);
104
   Vector_add(meters, meter);
105
   return meter;
Hisham Muhammad's avatar
Hisham Muhammad committed
106
107
108
}

int Header_size(Header* this, HeaderSide side) {
109
   Vector* meters = side == LEFT_HEADER
Hisham Muhammad's avatar
Hisham Muhammad committed
110
111
112
                       ? this->leftMeters
                       : this->rightMeters;

113
   return Vector_size(meters);
Hisham Muhammad's avatar
Hisham Muhammad committed
114
115
116
}

char* Header_readMeterName(Header* this, int i, HeaderSide side) {
117
   Vector* meters = side == LEFT_HEADER
Hisham Muhammad's avatar
Hisham Muhammad committed
118
119
                       ? this->leftMeters
                       : this->rightMeters;
120
   Meter* meter = (Meter*) Vector_get(meters, i);
121
122
123
124
125
126
127
128
129
130

   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;
Hisham Muhammad's avatar
Hisham Muhammad committed
131
132
}

133
MeterModeId Header_readMeterMode(Header* this, int i, HeaderSide side) {
134
   Vector* meters = side == LEFT_HEADER
Hisham Muhammad's avatar
Hisham Muhammad committed
135
136
137
                       ? this->leftMeters
                       : this->rightMeters;

138
   Meter* meter = (Meter*) Vector_get(meters, i);
Hisham Muhammad's avatar
Hisham Muhammad committed
139
140
141
   return meter->mode;
}

142
143
144
145
146
147
148
149
150
151
void Header_defaultMeters(Header* this, int cpuCount) {
   if (cpuCount > 8) {
      Vector_add(this->leftMeters, Meter_new(this->pl, 0, &LeftCPUs2Meter));
      Vector_add(this->rightMeters, Meter_new(this->pl, 0, &RightCPUs2Meter));
   } else if (cpuCount > 4) {
      Vector_add(this->leftMeters, Meter_new(this->pl, 0, &LeftCPUsMeter));
      Vector_add(this->rightMeters, Meter_new(this->pl, 0, &RightCPUsMeter));
   } else {
      Vector_add(this->leftMeters, Meter_new(this->pl, 0, &AllCPUsMeter));
   }
152
153
154
155
156
   Vector_add(this->leftMeters, Meter_new(this->pl, 0, &MemoryMeter));
   Vector_add(this->leftMeters, Meter_new(this->pl, 0, &SwapMeter));
   Vector_add(this->rightMeters, Meter_new(this->pl, 0, &TasksMeter));
   Vector_add(this->rightMeters, Meter_new(this->pl, 0, &LoadAverageMeter));
   Vector_add(this->rightMeters, Meter_new(this->pl, 0, &UptimeMeter));
Hisham Muhammad's avatar
Hisham Muhammad committed
157
158
}

159
160
161
void Header_reinit(Header* this) {
   for (int i = 0; i < Vector_size(this->leftMeters); i++) {
      Meter* meter = (Meter*) Vector_get(this->leftMeters, i);
162
163
      if (meter->type->init)
         meter->type->init(meter);
164
165
166
   }
   for (int i = 0; i < Vector_size(this->rightMeters); i++) {
      Meter* meter = (Meter*) Vector_get(this->rightMeters, i);
167
168
      if (meter->type->init)
         meter->type->init(meter);
169
170
171
172
   }
}

void Header_draw(const Header* this) {
Hisham Muhammad's avatar
Hisham Muhammad committed
173
174
175
176
177
178
179
   int height = this->height;
   int pad = this->pad;
   
   attrset(CRT_colors[RESET_COLOR]);
   for (int y = 0; y < height; y++) {
      mvhline(y, 0, ' ', COLS);
   }
180
181
   for (int y = (pad / 2), i = 0; i < Vector_size(this->leftMeters); i++) {
      Meter* meter = (Meter*) Vector_get(this->leftMeters, i);
Hisham Muhammad's avatar
Hisham Muhammad committed
182
183
184
      meter->draw(meter, pad, y, COLS / 2 - (pad * 2 - 1) - 1);
      y += meter->h;
   }
185
186
   for (int y = (pad / 2), i = 0; i < Vector_size(this->rightMeters); i++) {
      Meter* meter = (Meter*) Vector_get(this->rightMeters, i);
Hisham Muhammad's avatar
Hisham Muhammad committed
187
188
189
190
191
192
193
194
195
196
      meter->draw(meter, COLS / 2 + pad, y, COLS / 2 - (pad * 2 - 1) - 1);
      y += meter->h;
   }
}

int Header_calculateHeight(Header* this) {
   int pad = this->margin ? 2 : 0;
   int leftHeight = pad;
   int rightHeight = pad;

197
198
   for (int i = 0; i < Vector_size(this->leftMeters); i++) {
      Meter* meter = (Meter*) Vector_get(this->leftMeters, i);
Hisham Muhammad's avatar
Hisham Muhammad committed
199
200
      leftHeight += meter->h;
   }
201
202
   for (int i = 0; i < Vector_size(this->rightMeters); i++) {
      Meter* meter = (Meter*) Vector_get(this->rightMeters, i);
Hisham Muhammad's avatar
Hisham Muhammad committed
203
204
205
206
207
208
      rightHeight += meter->h;
   }
   this->pad = pad;
   this->height = MAX(leftHeight, rightHeight);
   return this->height;
}