mirror of
https://github.com/xzeldon/htop.git
synced 2024-12-23 22:55:46 +00:00
* Option for counting CPUs from zero
(thanks to Sean Noonan) * Meters update in every screen (no longer halting while on Setup, etc.)
This commit is contained in:
parent
b561956637
commit
a9c0ea3753
@ -3,6 +3,7 @@
|
||||
|
||||
#include "Panel.h"
|
||||
#include "CheckItem.h"
|
||||
#include "ProcessList.h"
|
||||
|
||||
#include "debug.h"
|
||||
#include <assert.h>
|
||||
@ -25,14 +26,14 @@ static HandlerResult AffinityPanel_eventHandler(Panel* this, int ch) {
|
||||
return result;
|
||||
}
|
||||
|
||||
Panel* AffinityPanel_new(int processorCount, unsigned long mask) {
|
||||
Panel* AffinityPanel_new(ProcessList* pl, unsigned long mask) {
|
||||
Panel* this = Panel_new(1, 1, 1, 1, CHECKITEM_CLASS, true, ListItem_compare);
|
||||
this->eventHandler = AffinityPanel_eventHandler;
|
||||
|
||||
Panel_setHeader(this, "Use CPUs:");
|
||||
for (int i = 0; i < processorCount; i++) {
|
||||
for (int i = 0; i < pl->cpuCount; i++) {
|
||||
char number[10];
|
||||
snprintf(number, 9, "%d", i+1);
|
||||
snprintf(number, 9, "%d", ProcessList_cpuId(pl, i) + 1);
|
||||
Panel_add(this, (Object*) CheckItem_new(String_copy(number), NULL, mask & (1 << i)));
|
||||
}
|
||||
return this;
|
||||
|
@ -6,11 +6,12 @@
|
||||
|
||||
#include "Panel.h"
|
||||
#include "CheckItem.h"
|
||||
#include "ProcessList.h"
|
||||
|
||||
#include "debug.h"
|
||||
#include <assert.h>
|
||||
|
||||
Panel* AffinityPanel_new(int processorCount, unsigned long mask);
|
||||
Panel* AffinityPanel_new(ProcessList* pl, unsigned long mask);
|
||||
|
||||
unsigned long AffinityPanel_getAffinity(Panel* this);
|
||||
|
||||
|
10
CPUMeter.c
10
CPUMeter.c
@ -33,7 +33,7 @@ static void CPUMeter_init(Meter* this) {
|
||||
int cpu = this->param;
|
||||
if (this->pl->cpuCount > 1) {
|
||||
char caption[10];
|
||||
sprintf(caption, "%-3d", cpu);
|
||||
sprintf(caption, "%-3d ", ProcessList_cpuId(this->pl, cpu));
|
||||
Meter_setCaption(this, caption);
|
||||
}
|
||||
if (this->param == 0)
|
||||
@ -124,8 +124,8 @@ static void CPUMeter_display(Object* cast, RichString* out) {
|
||||
|
||||
static void AllCPUsMeter_init(Meter* this) {
|
||||
int cpus = this->pl->cpuCount;
|
||||
this->drawBuffer = malloc(sizeof(Meter*) * cpus);
|
||||
Meter** meters = (Meter**) this->drawBuffer;
|
||||
this->drawData = malloc(sizeof(Meter*) * cpus);
|
||||
Meter** meters = (Meter**) this->drawData;
|
||||
for (int i = 0; i < cpus; i++)
|
||||
meters[i] = Meter_new(this->pl, i+1, &CPUMeter);
|
||||
this->h = cpus;
|
||||
@ -134,7 +134,7 @@ static void AllCPUsMeter_init(Meter* this) {
|
||||
|
||||
static void AllCPUsMeter_done(Meter* this) {
|
||||
int cpus = this->pl->cpuCount;
|
||||
Meter** meters = (Meter**) this->drawBuffer;
|
||||
Meter** meters = (Meter**) this->drawData;
|
||||
for (int i = 0; i < cpus; i++)
|
||||
Meter_delete((Object*)meters[i]);
|
||||
}
|
||||
@ -148,7 +148,7 @@ static void AllCPUsMeter_setMode(Meter* this, int mode) {
|
||||
|
||||
static void AllCPUsMeter_draw(Meter* this, int x, int y, int w) {
|
||||
int cpus = this->pl->cpuCount;
|
||||
Meter** meters = (Meter**) this->drawBuffer;
|
||||
Meter** meters = (Meter**) this->drawData;
|
||||
for (int i = 0; i < cpus; i++) {
|
||||
Meter_setMode(meters[i], this->mode);
|
||||
meters[i]->draw(meters[i], x, y, w);
|
||||
|
@ -1,4 +1,10 @@
|
||||
|
||||
What's new in version 0.9.1
|
||||
|
||||
* Option for counting CPUs from zero
|
||||
(thanks to Sean Noonan)
|
||||
* Meters update in every screen (no longer halting while on Setup, etc.)
|
||||
|
||||
What's new in version 0.9
|
||||
|
||||
* Add support for "steal"/guest CPU time measurement
|
||||
|
@ -90,7 +90,7 @@ void* DebugMemory_realloc(void* ptr, int size, char* file, int line, char* str)
|
||||
return data;
|
||||
}
|
||||
|
||||
void* DebugMemory_strdup(char* str, char* file, int line) {
|
||||
void* DebugMemory_strdup(const char* str, char* file, int line) {
|
||||
assert(str);
|
||||
char* data = strdup(str);
|
||||
DebugMemory_registerAllocation(data, file, line);
|
||||
@ -102,7 +102,7 @@ void* DebugMemory_strdup(char* str, char* file, int line) {
|
||||
}
|
||||
|
||||
void DebugMemory_free(void* data, char* file, int line) {
|
||||
assert(data);
|
||||
if (!data) return;
|
||||
DebugMemory_registerDeallocation(data, file, line);
|
||||
if (singleton->file) {
|
||||
if (singleton->totals) fprintf(singleton->file, "%d\t", singleton->size);
|
||||
|
@ -48,7 +48,7 @@ void* DebugMemory_calloc(int a, int b, char* file, int line);
|
||||
|
||||
void* DebugMemory_realloc(void* ptr, int size, char* file, int line, char* str);
|
||||
|
||||
void* DebugMemory_strdup(char* str, char* file, int line);
|
||||
void* DebugMemory_strdup(const char* str, char* file, int line);
|
||||
|
||||
void DebugMemory_free(void* data, char* file, int line);
|
||||
|
||||
|
@ -47,6 +47,7 @@ static HandlerResult DisplayOptionsPanel_eventHandler(Panel* super, int ch) {
|
||||
this->settings->changed = true;
|
||||
Header* header = this->settings->header;
|
||||
Header_calculateHeight(header);
|
||||
Header_reinit(header);
|
||||
Header_draw(header);
|
||||
ScreenManager_resize(this->scr, this->scr->x1, header->height, this->scr->x2, this->scr->y2);
|
||||
}
|
||||
@ -74,5 +75,6 @@ DisplayOptionsPanel* DisplayOptionsPanel_new(Settings* settings, ScreenManager*
|
||||
Panel_add(super, (Object*) CheckItem_new(String_copy("Highlight large numbers in memory counters"), &(settings->pl->highlightMegabytes), false));
|
||||
Panel_add(super, (Object*) CheckItem_new(String_copy("Leave a margin around header"), &(settings->header->margin), false));
|
||||
Panel_add(super, (Object*) CheckItem_new(String_copy("Detailed CPU time (System/IO-Wait/Hard-IRQ/Soft-IRQ/Steal/Guest)"), &(settings->pl->detailedCPUTime), false));
|
||||
Panel_add(super, (Object*) CheckItem_new(String_copy("Count CPUs from 0 instead of 1"), &(settings->pl->countCPUsFromZero), false));
|
||||
return this;
|
||||
}
|
||||
|
@ -95,11 +95,11 @@ void FunctionBar_setLabel(FunctionBar* this, int event, const char* text) {
|
||||
}
|
||||
}
|
||||
|
||||
void FunctionBar_draw(FunctionBar* this, char* buffer) {
|
||||
void FunctionBar_draw(const FunctionBar* this, char* buffer) {
|
||||
FunctionBar_drawAttr(this, buffer, CRT_colors[FUNCTION_BAR]);
|
||||
}
|
||||
|
||||
void FunctionBar_drawAttr(FunctionBar* this, char* buffer, int attr) {
|
||||
void FunctionBar_drawAttr(const FunctionBar* this, char* buffer, int attr) {
|
||||
attrset(CRT_colors[FUNCTION_BAR]);
|
||||
mvhline(LINES-1, 0, ' ', COLS);
|
||||
int x = 0;
|
||||
@ -118,7 +118,7 @@ void FunctionBar_drawAttr(FunctionBar* this, char* buffer, int attr) {
|
||||
attrset(CRT_colors[RESET_COLOR]);
|
||||
}
|
||||
|
||||
int FunctionBar_synthesizeEvent(FunctionBar* this, int pos) {
|
||||
int FunctionBar_synthesizeEvent(const FunctionBar* this, int pos) {
|
||||
int x = 0;
|
||||
for (int i = 0; i < this->size; i++) {
|
||||
x += strlen(this->keys[i]);
|
||||
|
@ -43,10 +43,10 @@ void FunctionBar_delete(Object* cast);
|
||||
|
||||
void FunctionBar_setLabel(FunctionBar* this, int event, const char* text);
|
||||
|
||||
void FunctionBar_draw(FunctionBar* this, char* buffer);
|
||||
void FunctionBar_draw(const FunctionBar* this, char* buffer);
|
||||
|
||||
void FunctionBar_drawAttr(FunctionBar* this, char* buffer, int attr);
|
||||
void FunctionBar_drawAttr(const FunctionBar* this, char* buffer, int attr);
|
||||
|
||||
int FunctionBar_synthesizeEvent(FunctionBar* this, int pos);
|
||||
int FunctionBar_synthesizeEvent(const FunctionBar* this, int pos);
|
||||
|
||||
#endif
|
||||
|
16
Header.c
16
Header.c
@ -10,6 +10,7 @@ in the source distribution for its full text.
|
||||
|
||||
#include "debug.h"
|
||||
#include <assert.h>
|
||||
#include <time.h>
|
||||
|
||||
/*{
|
||||
|
||||
@ -34,7 +35,7 @@ typedef struct Header_ {
|
||||
#endif
|
||||
|
||||
Header* Header_new(ProcessList* pl) {
|
||||
Header* this = malloc(sizeof(Header));
|
||||
Header* this = calloc(sizeof(Header), 1);
|
||||
this->leftMeters = Vector_new(METER_CLASS, true, DEFAULT_SIZE, NULL);
|
||||
this->rightMeters = Vector_new(METER_CLASS, true, DEFAULT_SIZE, NULL);
|
||||
this->margin = true;
|
||||
@ -132,7 +133,18 @@ void Header_defaultMeters(Header* this) {
|
||||
Vector_add(this->rightMeters, Meter_new(this->pl, 0, &UptimeMeter));
|
||||
}
|
||||
|
||||
void Header_draw(Header* this) {
|
||||
void Header_reinit(Header* this) {
|
||||
for (int i = 0; i < Vector_size(this->leftMeters); i++) {
|
||||
Meter* meter = (Meter*) Vector_get(this->leftMeters, i);
|
||||
meter->type->init(meter);
|
||||
}
|
||||
for (int i = 0; i < Vector_size(this->rightMeters); i++) {
|
||||
Meter* meter = (Meter*) Vector_get(this->rightMeters, i);
|
||||
meter->type->init(meter);
|
||||
}
|
||||
}
|
||||
|
||||
void Header_draw(const Header* this) {
|
||||
int height = this->height;
|
||||
int pad = this->pad;
|
||||
|
||||
|
5
Header.h
5
Header.h
@ -13,6 +13,7 @@ in the source distribution for its full text.
|
||||
|
||||
#include "debug.h"
|
||||
#include <assert.h>
|
||||
#include <time.h>
|
||||
|
||||
|
||||
typedef enum HeaderSide_ {
|
||||
@ -52,7 +53,9 @@ MeterModeId Header_readMeterMode(Header* this, int i, HeaderSide side);
|
||||
|
||||
void Header_defaultMeters(Header* this);
|
||||
|
||||
void Header_draw(Header* this);
|
||||
void Header_reinit(Header* this);
|
||||
|
||||
void Header_draw(const Header* this);
|
||||
|
||||
int Header_calculateHeight(Header* this);
|
||||
|
||||
|
59
Meter.c
59
Meter.c
@ -23,6 +23,7 @@ in the source distribution for its full text.
|
||||
#include <assert.h>
|
||||
|
||||
#ifndef USE_FUNKY_MODES
|
||||
#include <time.h>
|
||||
#define USE_FUNKY_MODES 1
|
||||
#endif
|
||||
|
||||
@ -69,13 +70,20 @@ struct Meter_ {
|
||||
int mode;
|
||||
int param;
|
||||
Meter_Draw draw;
|
||||
void* drawBuffer;
|
||||
void* drawData;
|
||||
int h;
|
||||
ProcessList* pl;
|
||||
double* values;
|
||||
double total;
|
||||
};
|
||||
|
||||
#ifdef USE_FUNKY_MODES
|
||||
typedef struct GraphData_ {
|
||||
time_t time;
|
||||
double values[METER_BUFFER_LEN];
|
||||
} GraphData;
|
||||
#endif
|
||||
|
||||
typedef enum {
|
||||
CUSTOM_METERMODE = 0,
|
||||
BAR_METERMODE,
|
||||
@ -152,8 +160,8 @@ void Meter_delete(Object* cast) {
|
||||
if (this->type->done) {
|
||||
this->type->done(this);
|
||||
}
|
||||
if (this->drawBuffer)
|
||||
free(this->drawBuffer);
|
||||
if (this->drawData)
|
||||
free(this->drawData);
|
||||
free(this->caption);
|
||||
free(this->values);
|
||||
free(this);
|
||||
@ -186,9 +194,9 @@ void Meter_setMode(Meter* this, int modeIndex) {
|
||||
this->type->setMode(this, modeIndex);
|
||||
} else {
|
||||
assert(modeIndex >= 1);
|
||||
if (this->drawBuffer)
|
||||
free(this->drawBuffer);
|
||||
this->drawBuffer = NULL;
|
||||
if (this->drawData)
|
||||
free(this->drawData);
|
||||
this->drawData = NULL;
|
||||
|
||||
MeterMode* mode = Meter_modes[modeIndex];
|
||||
this->draw = mode->draw;
|
||||
@ -328,23 +336,30 @@ static const char* GraphMeterMode_characters = "^`'-.,_~'`-.,_~'`-.,_";
|
||||
|
||||
static void GraphMeterMode_draw(Meter* this, int x, int y, int w) {
|
||||
|
||||
if (!this->drawBuffer) this->drawBuffer = calloc(sizeof(double), METER_BUFFER_LEN);
|
||||
double* drawBuffer = (double*) this->drawBuffer;
|
||||
if (!this->drawData) this->drawData = calloc(sizeof(GraphData), 1);
|
||||
GraphData* data = (GraphData*) this->drawData;
|
||||
const int nValues = METER_BUFFER_LEN;
|
||||
|
||||
time_t now = time(NULL);
|
||||
if (now > data->time) {
|
||||
data->time = now;
|
||||
|
||||
for (int i = 0; i < METER_BUFFER_LEN - 1; i++)
|
||||
drawBuffer[i] = drawBuffer[i+1];
|
||||
|
||||
MeterType* type = this->type;
|
||||
char buffer[METER_BUFFER_LEN];
|
||||
type->setValues(this, buffer, METER_BUFFER_LEN - 1);
|
||||
|
||||
double value = 0.0;
|
||||
for (int i = 0; i < type->items; i++)
|
||||
value += this->values[i];
|
||||
value /= this->total;
|
||||
drawBuffer[METER_BUFFER_LEN - 1] = value;
|
||||
for (int i = METER_BUFFER_LEN - w, k = 0; i < METER_BUFFER_LEN; i++, k++) {
|
||||
value = drawBuffer[i];
|
||||
for (int i = 0; i < nValues - 1; i++)
|
||||
data->values[i] = data->values[i+1];
|
||||
|
||||
MeterType* type = this->type;
|
||||
char buffer[nValues];
|
||||
type->setValues(this, buffer, nValues - 1);
|
||||
|
||||
double value = 0.0;
|
||||
for (int i = 0; i < type->items; i++)
|
||||
value += this->values[i];
|
||||
value /= this->total;
|
||||
data->values[nValues - 1] = value;
|
||||
}
|
||||
|
||||
for (int i = nValues - w, k = 0; i < nValues; i++, k++) {
|
||||
double value = data->values[i];
|
||||
DrawDot( CRT_colors[DEFAULT_COLOR], y, ' ' );
|
||||
DrawDot( CRT_colors[DEFAULT_COLOR], y+1, ' ' );
|
||||
DrawDot( CRT_colors[DEFAULT_COLOR], y+2, ' ' );
|
||||
|
10
Meter.h
10
Meter.h
@ -26,6 +26,7 @@ in the source distribution for its full text.
|
||||
#include <assert.h>
|
||||
|
||||
#ifndef USE_FUNKY_MODES
|
||||
#include <time.h>
|
||||
#define USE_FUNKY_MODES 1
|
||||
#endif
|
||||
|
||||
@ -71,13 +72,20 @@ struct Meter_ {
|
||||
int mode;
|
||||
int param;
|
||||
Meter_Draw draw;
|
||||
void* drawBuffer;
|
||||
void* drawData;
|
||||
int h;
|
||||
ProcessList* pl;
|
||||
double* values;
|
||||
double total;
|
||||
};
|
||||
|
||||
#ifdef USE_FUNKY_MODES
|
||||
typedef struct GraphData_ {
|
||||
time_t time;
|
||||
double values[METER_BUFFER_LEN];
|
||||
} GraphData;
|
||||
#endif
|
||||
|
||||
typedef enum {
|
||||
CUSTOM_METERMODE = 0,
|
||||
BAR_METERMODE,
|
||||
|
@ -332,7 +332,7 @@ static void Process_writeField(Process* this, RichString* str, ProcessField fiel
|
||||
case TTY_NR: snprintf(buffer, n, "%5u ", this->tty_nr); break;
|
||||
case TGID: snprintf(buffer, n, "%5u ", this->tgid); break;
|
||||
case TPGID: snprintf(buffer, n, "%5d ", this->tpgid); break;
|
||||
case PROCESSOR: snprintf(buffer, n, "%3d ", this->processor+1); break;
|
||||
case PROCESSOR: snprintf(buffer, n, "%3d ", ProcessList_cpuId(this->pl, this->processor)); break;
|
||||
case NLWP: snprintf(buffer, n, "%4ld ", this->nlwp); break;
|
||||
case COMM: {
|
||||
if (this->pl->highlightThreads && Process_isThread(this)) {
|
||||
@ -471,7 +471,7 @@ static void Process_display(Object* cast, RichString* out) {
|
||||
RichString_setAttr(out, CRT_colors[PROCESS_SHADOW]);
|
||||
if (this->tag == true)
|
||||
RichString_setAttr(out, CRT_colors[PROCESS_TAG]);
|
||||
assert(out->len > 0);
|
||||
assert(out->chlen > 0);
|
||||
}
|
||||
|
||||
void Process_delete(Object* cast) {
|
||||
|
@ -54,6 +54,9 @@ in the source distribution for its full text.
|
||||
#define MAX_READ 2048
|
||||
#endif
|
||||
|
||||
#ifndef ProcessList_cpuId
|
||||
#define ProcessList_cpuId(pl, cpu) ((pl)->countCPUsFromZero ? (cpu)-1 : (cpu))
|
||||
#endif
|
||||
}*/
|
||||
|
||||
/*{
|
||||
@ -124,6 +127,7 @@ typedef struct ProcessList_ {
|
||||
bool highlightMegabytes;
|
||||
bool highlightThreads;
|
||||
bool detailedCPUTime;
|
||||
bool countCPUsFromZero;
|
||||
|
||||
} ProcessList;
|
||||
}*/
|
||||
@ -132,7 +136,7 @@ static ProcessField defaultHeaders[] = { PID, USER, PRIORITY, NICE, M_SIZE, M_RE
|
||||
|
||||
ProcessList* ProcessList_new(UsersTable* usersTable) {
|
||||
ProcessList* this;
|
||||
this = malloc(sizeof(ProcessList));
|
||||
this = calloc(sizeof(ProcessList), 1);
|
||||
this->processes = Vector_new(PROCESS_CLASS, true, DEFAULT_SIZE, Process_compare);
|
||||
this->processTable = Hashtable_new(70, false);
|
||||
assert(Hashtable_count(this->processTable) == Vector_count(this->processes));
|
||||
@ -177,6 +181,7 @@ ProcessList* ProcessList_new(UsersTable* usersTable) {
|
||||
this->highlightBaseName = false;
|
||||
this->highlightMegabytes = false;
|
||||
this->detailedCPUTime = false;
|
||||
this->countCPUsFromZero = false;
|
||||
|
||||
return this;
|
||||
}
|
||||
|
@ -56,6 +56,9 @@ in the source distribution for its full text.
|
||||
#define MAX_READ 2048
|
||||
#endif
|
||||
|
||||
#ifndef ProcessList_cpuId
|
||||
#define ProcessList_cpuId(pl, cpu) ((pl)->countCPUsFromZero ? (cpu)-1 : (cpu))
|
||||
#endif
|
||||
|
||||
|
||||
typedef struct CPUData_ {
|
||||
@ -124,6 +127,7 @@ typedef struct ProcessList_ {
|
||||
bool highlightMegabytes;
|
||||
bool highlightThreads;
|
||||
bool detailedCPUTime;
|
||||
bool countCPUsFromZero;
|
||||
|
||||
} ProcessList;
|
||||
|
||||
|
@ -9,10 +9,12 @@ in the source distribution for its full text.
|
||||
#include "Panel.h"
|
||||
#include "Object.h"
|
||||
#include "Vector.h"
|
||||
#include "Header.h"
|
||||
#include "FunctionBar.h"
|
||||
|
||||
#include "debug.h"
|
||||
#include <assert.h>
|
||||
#include <time.h>
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
@ -32,13 +34,15 @@ typedef struct ScreenManager_ {
|
||||
Vector* items;
|
||||
Vector* fuBars;
|
||||
int itemCount;
|
||||
FunctionBar* fuBar;
|
||||
const FunctionBar* fuBar;
|
||||
const Header* header;
|
||||
time_t lastScan;
|
||||
bool owner;
|
||||
} ScreenManager;
|
||||
|
||||
}*/
|
||||
|
||||
ScreenManager* ScreenManager_new(int x1, int y1, int x2, int y2, Orientation orientation, bool owner) {
|
||||
ScreenManager* ScreenManager_new(int x1, int y1, int x2, int y2, Orientation orientation, const Header* header, bool owner) {
|
||||
ScreenManager* this;
|
||||
this = malloc(sizeof(ScreenManager));
|
||||
this->x1 = x1;
|
||||
@ -50,6 +54,7 @@ ScreenManager* ScreenManager_new(int x1, int y1, int x2, int y2, Orientation ori
|
||||
this->items = Vector_new(PANEL_CLASS, owner, DEFAULT_SIZE, NULL);
|
||||
this->fuBars = Vector_new(FUNCTIONBAR_CLASS, true, DEFAULT_SIZE, NULL);
|
||||
this->itemCount = 0;
|
||||
this->header = header;
|
||||
this->owner = owner;
|
||||
return this;
|
||||
}
|
||||
@ -119,14 +124,24 @@ void ScreenManager_resize(ScreenManager* this, int x1, int y1, int x2, int y2) {
|
||||
void ScreenManager_run(ScreenManager* this, Panel** lastFocus, int* lastKey) {
|
||||
bool quit = false;
|
||||
int focus = 0;
|
||||
|
||||
|
||||
Panel* panelFocus = (Panel*) Vector_get(this->items, focus);
|
||||
if (this->fuBar)
|
||||
FunctionBar_draw(this->fuBar, NULL);
|
||||
|
||||
this->lastScan = 0;
|
||||
|
||||
int ch = 0;
|
||||
while (!quit) {
|
||||
int items = this->itemCount;
|
||||
if (this->header) {
|
||||
time_t now = time(NULL);
|
||||
if (now > this->lastScan) {
|
||||
ProcessList_scan(this->header->pl);
|
||||
this->lastScan = now;
|
||||
}
|
||||
Header_draw(this->header);
|
||||
}
|
||||
for (int i = 0; i < items; i++) {
|
||||
Panel* panel = (Panel*) Vector_get(this->items, i);
|
||||
Panel_draw(panel, i == focus);
|
||||
|
@ -12,10 +12,12 @@ in the source distribution for its full text.
|
||||
#include "Panel.h"
|
||||
#include "Object.h"
|
||||
#include "Vector.h"
|
||||
#include "Header.h"
|
||||
#include "FunctionBar.h"
|
||||
|
||||
#include "debug.h"
|
||||
#include <assert.h>
|
||||
#include <time.h>
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
@ -34,12 +36,14 @@ typedef struct ScreenManager_ {
|
||||
Vector* items;
|
||||
Vector* fuBars;
|
||||
int itemCount;
|
||||
FunctionBar* fuBar;
|
||||
const FunctionBar* fuBar;
|
||||
const Header* header;
|
||||
time_t lastScan;
|
||||
bool owner;
|
||||
} ScreenManager;
|
||||
|
||||
|
||||
ScreenManager* ScreenManager_new(int x1, int y1, int x2, int y2, Orientation orientation, bool owner);
|
||||
ScreenManager* ScreenManager_new(int x1, int y1, int x2, int y2, Orientation orientation, const Header* header, bool owner);
|
||||
|
||||
void ScreenManager_delete(ScreenManager* this);
|
||||
|
||||
|
@ -113,6 +113,8 @@ static bool Settings_read(Settings* this, char* fileName) {
|
||||
this->pl->detailedCPUTime = atoi(option[1]);
|
||||
} else if (String_eq(option[0], "detailed_cpu_time")) {
|
||||
this->pl->detailedCPUTime = atoi(option[1]);
|
||||
} else if (String_eq(option[0], "cpu_count_from_zero")) {
|
||||
this->pl->countCPUsFromZero = atoi(option[1]);
|
||||
} else if (String_eq(option[0], "delay")) {
|
||||
this->delay = atoi(option[1]);
|
||||
} else if (String_eq(option[0], "color_scheme")) {
|
||||
@ -172,6 +174,7 @@ bool Settings_write(Settings* this) {
|
||||
fprintf(fd, "tree_view=%d\n", (int) this->pl->treeView);
|
||||
fprintf(fd, "header_margin=%d\n", (int) this->header->margin);
|
||||
fprintf(fd, "detailed_cpu_time=%d\n", (int) this->pl->detailedCPUTime);
|
||||
fprintf(fd, "cpu_count_from_zero=%d\n", (int) this->pl->countCPUsFromZero);
|
||||
fprintf(fd, "color_scheme=%d\n", (int) this->colorScheme);
|
||||
fprintf(fd, "delay=%d\n", (int) this->delay);
|
||||
fprintf(fd, "left_meters=");
|
||||
|
22
htop.c
22
htop.c
@ -164,8 +164,8 @@ static void showHelp(ProcessList* pl) {
|
||||
|
||||
static const char* CategoriesFunctions[] = {" ", " ", " ", " ", " ", " ", " ", " ", " ", "Done ", NULL};
|
||||
|
||||
static void Setup_run(Settings* settings, int headerHeight) {
|
||||
ScreenManager* scr = ScreenManager_new(0, headerHeight, 0, -1, HORIZONTAL, true);
|
||||
static void Setup_run(Settings* settings, const Header* header) {
|
||||
ScreenManager* scr = ScreenManager_new(0, header->height, 0, -1, HORIZONTAL, header, true);
|
||||
CategoriesPanel* panelCategories = CategoriesPanel_new(settings, scr);
|
||||
ScreenManager_add(scr, (Panel*) panelCategories, FunctionBar_new(CategoriesFunctions, NULL, NULL), 16);
|
||||
CategoriesPanel_makeMetersPage(panelCategories);
|
||||
@ -201,12 +201,12 @@ static HandlerResult pickWithEnter(Panel* panel, int ch) {
|
||||
return IGNORED;
|
||||
}
|
||||
|
||||
static Object* pickFromVector(Panel* panel, Panel* list, int x, int y, const char** keyLabels, FunctionBar* prevBar) {
|
||||
static Object* pickFromVector(Panel* panel, Panel* list, int x, int y, const char** keyLabels, FunctionBar* prevBar, Header* header) {
|
||||
const char* fuKeys[] = {"Enter", "Esc", NULL};
|
||||
int fuEvents[] = {13, 27};
|
||||
if (!list->eventHandler)
|
||||
Panel_setEventHandler(list, pickWithEnter);
|
||||
ScreenManager* scr = ScreenManager_new(0, y, 0, -1, HORIZONTAL, false);
|
||||
ScreenManager* scr = ScreenManager_new(0, y, 0, -1, HORIZONTAL, header, false);
|
||||
ScreenManager_add(scr, list, FunctionBar_new(keyLabels, fuKeys, fuEvents), x - 1);
|
||||
ScreenManager_add(scr, panel, NULL, -1);
|
||||
Panel* panelFocus;
|
||||
@ -376,7 +376,7 @@ int main(int argc, char** argv) {
|
||||
double oldTime = 0.0;
|
||||
bool recalculate;
|
||||
|
||||
int ch = 0;
|
||||
int ch = ERR;
|
||||
int closeTimeout = 0;
|
||||
|
||||
while (!quit) {
|
||||
@ -606,7 +606,7 @@ int main(int argc, char** argv) {
|
||||
case 'C':
|
||||
case KEY_F(2):
|
||||
{
|
||||
Setup_run(settings, headerHeight);
|
||||
Setup_run(settings, header);
|
||||
// TODO: shouldn't need this, colors should be dynamic
|
||||
ProcessList_printHeader(pl, Panel_getHeader(panel));
|
||||
headerHeight = Header_calculateHeight(header);
|
||||
@ -630,7 +630,7 @@ int main(int argc, char** argv) {
|
||||
ListItem* allUsers = ListItem_new("All users", -1);
|
||||
Panel_insert(usersPanel, 0, (Object*) allUsers);
|
||||
const char* fuFunctions[] = {"Show ", "Cancel ", NULL};
|
||||
ListItem* picked = (ListItem*) pickFromVector(panel, usersPanel, 20, headerHeight, fuFunctions, defaultBar);
|
||||
ListItem* picked = (ListItem*) pickFromVector(panel, usersPanel, 20, headerHeight, fuFunctions, defaultBar, header);
|
||||
if (picked) {
|
||||
if (picked == allUsers) {
|
||||
userOnly = false;
|
||||
@ -659,7 +659,7 @@ int main(int argc, char** argv) {
|
||||
}
|
||||
SignalsPanel_reset((SignalsPanel*) killPanel);
|
||||
const char* fuFunctions[] = {"Send ", "Cancel ", NULL};
|
||||
Signal* sgn = (Signal*) pickFromVector(panel, killPanel, 15, headerHeight, fuFunctions, defaultBar);
|
||||
Signal* sgn = (Signal*) pickFromVector(panel, killPanel, 15, headerHeight, fuFunctions, defaultBar, header);
|
||||
if (sgn) {
|
||||
if (sgn->number != 0) {
|
||||
Panel_setHeader(panel, "Sending...");
|
||||
@ -692,10 +692,10 @@ int main(int argc, char** argv) {
|
||||
|
||||
unsigned long curr = Process_getAffinity((Process*) Panel_getSelected(panel));
|
||||
|
||||
Panel* affinityPanel = AffinityPanel_new(pl->cpuCount, curr);
|
||||
Panel* affinityPanel = AffinityPanel_new(pl, curr);
|
||||
|
||||
const char* fuFunctions[] = {"Set ", "Cancel ", NULL};
|
||||
void* set = pickFromVector(panel, affinityPanel, 15, headerHeight, fuFunctions, defaultBar);
|
||||
void* set = pickFromVector(panel, affinityPanel, 15, headerHeight, fuFunctions, defaultBar, header);
|
||||
if (set) {
|
||||
unsigned long new = AffinityPanel_getAffinity(affinityPanel);
|
||||
bool anyTagged = false;
|
||||
@ -742,7 +742,7 @@ int main(int argc, char** argv) {
|
||||
Panel_setSelected(sortPanel, i);
|
||||
free(name);
|
||||
}
|
||||
ListItem* field = (ListItem*) pickFromVector(panel, sortPanel, 15, headerHeight, fuFunctions, defaultBar);
|
||||
ListItem* field = (ListItem*) pickFromVector(panel, sortPanel, 15, headerHeight, fuFunctions, defaultBar, header);
|
||||
if (field) {
|
||||
settings->changed = true;
|
||||
setSortKey(pl, field->key, panel, settings);
|
||||
|
10
m4/ltversion.m4
vendored
10
m4/ltversion.m4
vendored
@ -9,15 +9,15 @@
|
||||
|
||||
# Generated from ltversion.in.
|
||||
|
||||
# serial 3017 ltversion.m4
|
||||
# serial 3012 ltversion.m4
|
||||
# This file is part of GNU Libtool
|
||||
|
||||
m4_define([LT_PACKAGE_VERSION], [2.2.6b])
|
||||
m4_define([LT_PACKAGE_REVISION], [1.3017])
|
||||
m4_define([LT_PACKAGE_VERSION], [2.2.6])
|
||||
m4_define([LT_PACKAGE_REVISION], [1.3012])
|
||||
|
||||
AC_DEFUN([LTVERSION_VERSION],
|
||||
[macro_version='2.2.6b'
|
||||
macro_revision='1.3017'
|
||||
[macro_version='2.2.6'
|
||||
macro_revision='1.3012'
|
||||
_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
|
||||
_LT_DECL(, macro_revision, 0)
|
||||
])
|
||||
|
Loading…
Reference in New Issue
Block a user