From eaf11cc12a1aa4b050a8a1e7ea3770d3d9c81e95 Mon Sep 17 00:00:00 2001 From: Daniel Lange Date: Mon, 11 Apr 2016 13:00:29 +0200 Subject: Imported Upstream version 1.0 --- CPUMeter.c | 169 +++++++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 148 insertions(+), 21 deletions(-) (limited to 'CPUMeter.c') diff --git a/CPUMeter.c b/CPUMeter.c index a1144ea..f2a4fe3 100644 --- a/CPUMeter.c +++ b/CPUMeter.c @@ -1,6 +1,6 @@ /* htop - CPUMeter.c -(C) 2004-2010 Hisham H. Muhammad +(C) 2004-2011 Hisham H. Muhammad Released under the GNU GPL, see the COPYING file in the source distribution for its full text. */ @@ -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 - 1)); Meter_setCaption(this, caption); } if (this->param == 0) @@ -122,35 +122,91 @@ static void CPUMeter_display(Object* cast, RichString* out) { } } +static void AllCPUsMeter_getRange(Meter* this, int* start, int* count) { + int cpus = this->pl->cpuCount; + switch(this->type->name[0]) { + default: + case 'A': // All + *start = 0; + *count = cpus; + break; + case 'L': // First Half + *start = 0; + *count = (cpus+1) / 2; + break; + case 'R': // Second Half + *start = (cpus+1) / 2; + *count = cpus / 2; + break; + } +} + static void AllCPUsMeter_init(Meter* this) { int cpus = this->pl->cpuCount; - this->drawBuffer = malloc(sizeof(Meter*) * cpus); - Meter** meters = (Meter**) this->drawBuffer; - for (int i = 0; i < cpus; i++) - meters[i] = Meter_new(this->pl, i+1, &CPUMeter); - this->h = cpus; - this->mode = BAR_METERMODE; + if (!this->drawData) + this->drawData = calloc(sizeof(Meter*), cpus); + Meter** meters = (Meter**) this->drawData; + int start, count; + AllCPUsMeter_getRange(this, &start, &count); + for (int i = 0; i < count; i++) { + if (!meters[i]) + meters[i] = Meter_new(this->pl, start+i+1, &CPUMeter); + meters[i]->type->init(meters[i]); + } + if (this->mode == 0) + this->mode = BAR_METERMODE; + int h = Meter_modes[this->mode]->h; + if (strchr(this->type->name, '2')) + this->h = h * ((count+1) / 2); + else + this->h = h * count; } static void AllCPUsMeter_done(Meter* this) { - int cpus = this->pl->cpuCount; - Meter** meters = (Meter**) this->drawBuffer; - for (int i = 0; i < cpus; i++) + Meter** meters = (Meter**) this->drawData; + int start, count; + AllCPUsMeter_getRange(this, &start, &count); + for (int i = 0; i < count; i++) Meter_delete((Object*)meters[i]); } static void AllCPUsMeter_setMode(Meter* this, int mode) { + Meter** meters = (Meter**) this->drawData; this->mode = mode; - int cpus = this->pl->cpuCount; - int h = Meter_modes[this->mode]->h; - this->h = h * cpus; + int h = Meter_modes[mode]->h; + int start, count; + AllCPUsMeter_getRange(this, &start, &count); + for (int i = 0; i < count; i++) { + Meter_setMode(meters[i], mode); + } + if (strchr(this->type->name, '2')) + this->h = h * ((count+1) / 2); + else + this->h = h * count; } -static void AllCPUsMeter_draw(Meter* this, int x, int y, int w) { - int cpus = this->pl->cpuCount; - Meter** meters = (Meter**) this->drawBuffer; - for (int i = 0; i < cpus; i++) { - Meter_setMode(meters[i], this->mode); +static void DualColCPUsMeter_draw(Meter* this, int x, int y, int w) { + Meter** meters = (Meter**) this->drawData; + int start, count; + AllCPUsMeter_getRange(this, &start, &count); + int height = (count+1)/2; + int startY = y; + for (int i = 0; i < height; i++) { + meters[i]->draw(meters[i], x, y, (w-2)/2); + y += meters[i]->h; + } + y = startY; + for (int i = height; i < count; i++) { + meters[i]->draw(meters[i], x+(w-1)/2+2, y, (w-2)/2); + y += meters[i]->h; + } +} + +static void SingleColCPUsMeter_draw(Meter* this, int x, int y, int w) { + Meter** meters = (Meter**) this->drawData; + int start, count; + AllCPUsMeter_getRange(this, &start, &count); + for (int i = 0; i < count; i++) { meters[i]->draw(meters[i], x, y, w); y += meters[i]->h; } @@ -175,10 +231,81 @@ MeterType AllCPUsMeter = { .total = 100.0, .attributes = CPUMeter_attributes, .name = "AllCPUs", - .uiName = "All CPUs", + .uiName = "CPUs (1/1)", + .caption = "CPU", + .draw = SingleColCPUsMeter_draw, + .init = AllCPUsMeter_init, + .setMode = AllCPUsMeter_setMode, + .done = AllCPUsMeter_done +}; + +MeterType AllCPUs2Meter = { + .mode = 0, + .items = 1, + .total = 100.0, + .attributes = CPUMeter_attributes, + .name = "AllCPUs2", + .uiName = "CPUs (1&2/2)", + .caption = "CPU", + .draw = DualColCPUsMeter_draw, + .init = AllCPUsMeter_init, + .setMode = AllCPUsMeter_setMode, + .done = AllCPUsMeter_done +}; + +MeterType LeftCPUsMeter = { + .mode = 0, + .items = 1, + .total = 100.0, + .attributes = CPUMeter_attributes, + .name = "LeftCPUs", + .uiName = "CPUs (1/2)", + .caption = "CPU", + .draw = SingleColCPUsMeter_draw, + .init = AllCPUsMeter_init, + .setMode = AllCPUsMeter_setMode, + .done = AllCPUsMeter_done +}; + +MeterType RightCPUsMeter = { + .mode = 0, + .items = 1, + .total = 100.0, + .attributes = CPUMeter_attributes, + .name = "RightCPUs", + .uiName = "CPUs (2/2)", + .caption = "CPU", + .draw = SingleColCPUsMeter_draw, + .init = AllCPUsMeter_init, + .setMode = AllCPUsMeter_setMode, + .done = AllCPUsMeter_done +}; + +MeterType LeftCPUs2Meter = { + .mode = 0, + .items = 1, + .total = 100.0, + .attributes = CPUMeter_attributes, + .name = "LeftCPUs2", + .uiName = "CPUs (1&2/4)", .caption = "CPU", - .draw = AllCPUsMeter_draw, + .draw = DualColCPUsMeter_draw, .init = AllCPUsMeter_init, .setMode = AllCPUsMeter_setMode, .done = AllCPUsMeter_done }; + +MeterType RightCPUs2Meter = { + .mode = 0, + .items = 1, + .total = 100.0, + .attributes = CPUMeter_attributes, + .name = "RightCPUs2", + .uiName = "CPUs (3&4/4)", + .caption = "CPU", + .draw = DualColCPUsMeter_draw, + .init = AllCPUsMeter_init, + .setMode = AllCPUsMeter_setMode, + .done = AllCPUsMeter_done +}; + -- cgit v1.2.3