diff --git a/CPUMeter.c b/CPUMeter.c index 8fbd1d45..9c63f41e 100644 --- a/CPUMeter.c +++ b/CPUMeter.c @@ -137,6 +137,15 @@ static void AllCPUsMeter_getRange(Meter* this, int* start, int* count) { } } +static int MapClassnameToColumncount(Meter* this){ + if (strchr(Meter_name(this), '4')) + return 4; + else if (strchr(Meter_name(this), '2')) + return 2; + else + return 1; +} + static void AllCPUsMeter_init(Meter* this) { int cpus = this->pl->cpuCount; if (!this->drawData) @@ -152,10 +161,8 @@ static void AllCPUsMeter_init(Meter* this) { if (this->mode == 0) this->mode = BAR_METERMODE; int h = Meter_modes[this->mode]->h; - if (strchr(Meter_name(this), '2')) - this->h = h * ((count+1) / 2); - else - this->h = h * count; + int ncol = MapClassnameToColumncount(this); + this->h = h * ((count + ncol - 1)/ ncol); } static void AllCPUsMeter_done(Meter* this) { @@ -175,10 +182,8 @@ static void AllCPUsMeter_updateMode(Meter* this, int mode) { for (int i = 0; i < count; i++) { Meter_setMode(meters[i], mode); } - if (strchr(Meter_name(this), '2')) - this->h = h * ((count+1) / 2); - else - this->h = h * count; + int ncol = MapClassnameToColumncount(this); + this->h = h * ((count + ncol - 1)/ ncol); } static void DualColCPUsMeter_draw(Meter* this, int x, int y, int w) { @@ -209,6 +214,21 @@ static void SingleColCPUsMeter_draw(Meter* this, int x, int y, int w) { } } +static void MultiColCPUsMeter_draw(Meter* this, int x, int y, int w){ + Meter** meters = (Meter**) this->drawData; + int start, count; + AllCPUsMeter_getRange(this, &start, &count); + int ncol = MapClassnameToColumncount(this); + int colwidth = (w-ncol)/ncol + 1; + int diff = (w - (colwidth * ncol)); + for (int i = 0; i < count; i++){ + int d = (i%ncol) > diff ? diff : (i % ncol) ; // dynamic spacer + int xpos = x + ((i % ncol) * colwidth) + d; + int ypos = y + ((i / ncol) * meters[0]->h); + meters[i]->draw(meters[i], xpos, ypos, colwidth); + } +} + MeterClass CPUMeter_class = { .super = { .extends = Class(Meter), @@ -340,3 +360,59 @@ MeterClass RightCPUs2Meter_class = { .done = AllCPUsMeter_done }; +MeterClass AllCPUs4Meter_class = { + .super = { + .extends = Class(Meter), + .delete = Meter_delete, + .display = CPUMeter_display + }, + .defaultMode = CUSTOM_METERMODE, + .total = 100.0, + .attributes = CPUMeter_attributes, + .name = "AllCPUs4", + .uiName = "CPUs (1&2&3&4/4)", + .description = "CPUs (1&2&3&4/4): all CPUs in 4 shorter columns", + .caption = "CPU", + .draw = MultiColCPUsMeter_draw, + .init = AllCPUsMeter_init, + .updateMode = AllCPUsMeter_updateMode, + .done = AllCPUsMeter_done +}; + +MeterClass LeftCPUs4Meter_class = { + .super = { + .extends = Class(Meter), + .delete = Meter_delete, + .display = CPUMeter_display + }, + .defaultMode = CUSTOM_METERMODE, + .total = 100.0, + .attributes = CPUMeter_attributes, + .name = "LeftCPUs4", + .uiName = "CPUs (1-4/8)", + .description = "CPUs (1-4/8): first half in 4 shorter columns", + .caption = "CPU", + .draw = MultiColCPUsMeter_draw, + .init = AllCPUsMeter_init, + .updateMode = AllCPUsMeter_updateMode, + .done = AllCPUsMeter_done +}; + +MeterClass RightCPUs4Meter_class = { + .super = { + .extends = Class(Meter), + .delete = Meter_delete, + .display = CPUMeter_display + }, + .defaultMode = CUSTOM_METERMODE, + .total = 100.0, + .attributes = CPUMeter_attributes, + .name = "RightCPUs4", + .uiName = "CPUs (5-8/8)", + .description = "CPUs (5-8/8): second half in 4 shorter columns", + .caption = "CPU", + .draw = MultiColCPUsMeter_draw, + .init = AllCPUsMeter_init, + .updateMode = AllCPUsMeter_updateMode, + .done = AllCPUsMeter_done +}; diff --git a/CPUMeter.h b/CPUMeter.h index 2f163968..5018028c 100644 --- a/CPUMeter.h +++ b/CPUMeter.h @@ -47,5 +47,10 @@ extern MeterClass LeftCPUs2Meter_class; extern MeterClass RightCPUs2Meter_class; +extern MeterClass AllCPUs4Meter_class; + +extern MeterClass LeftCPUs4Meter_class; + +extern MeterClass RightCPUs4Meter_class; #endif diff --git a/linux/Platform.c b/linux/Platform.c index ab90ca74..62222bc6 100644 --- a/linux/Platform.c +++ b/linux/Platform.c @@ -121,10 +121,13 @@ MeterClass* Platform_meterTypes[] = { &HostnameMeter_class, &AllCPUsMeter_class, &AllCPUs2Meter_class, + &AllCPUs4Meter_class, &LeftCPUsMeter_class, &RightCPUsMeter_class, &LeftCPUs2Meter_class, &RightCPUs2Meter_class, + &LeftCPUs4Meter_class, + &RightCPUs4Meter_class, &BlankMeter_class, NULL };