From 3b1918496ea4b20ec61287ffbb9e1573e950fdcc Mon Sep 17 00:00:00 2001 From: gotmor Date: Wed, 1 Aug 2007 19:15:37 +0000 Subject: release 0.7.5 fixed memory leak added in-text commands: ^tw() ^c() ^p() added gadgets: kittscanner gdbar gcpubar git-svn-id: http://dzen.googlecode.com/svn/trunk@149 f2baff5b-bf2c-0410-a398-912abdc3d8b2 --- gadgets/gcpubar.c | 182 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 182 insertions(+) create mode 100644 gadgets/gcpubar.c (limited to 'gadgets/gcpubar.c') diff --git a/gadgets/gcpubar.c b/gadgets/gcpubar.c new file mode 100644 index 0000000..f65569c --- /dev/null +++ b/gadgets/gcpubar.c @@ -0,0 +1,182 @@ +/* + gcpubar - graphical cpu usage bar, to be used with dzen + + Copyright (C) 2007 by Robert Manea, + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + +#include +#include +#include +#include + +/* critical % value */ +#define CPUCRIT 75 +/* bar color for critical values */ +#define CRITCOL "red" + +static void pbar (double, int, int); + +struct cpu_info { + unsigned long long user; + unsigned long long sys; + unsigned long long idle; + unsigned long long iowait; +} ncpu, ocpu; + +char *bg, *fg; + +static void +pbar(double perc, int maxc, int height) { + int i, rp; + double l; + + l = perc * ((double)maxc / 100); + if((int)(l + 0.5) >= (int)l) + l = l + 0.5; + + if((int)(perc + 0.5) >= (int)perc) + rp = (int)(perc + 0.5); + else + rp = (int)perc; + + printf("CPU: %3d%% ^fg(%s)^r(%dx%d)^fg(%s)^r(%dx%d)\n", rp, + (rp>=CPUCRIT) ? CRITCOL : fg, (int)l, height, + bg, maxc-(int)l, height); + + fflush(stdout); +} + +int +main(int argc, char *argv[]) +{ + int i, t; + double total; + struct cpu_info mcpu; + FILE *statfp; + char buf[256], *ep; + + /* defaults */ + double ival=1.0; + int counts = 0; + int barwidth=100; + int barheight=10; + char *myfont = NULL; + + for(i=1; i < argc; i++) { + if(!strncmp(argv[i], "-i", 3)) { + if(i+1 < argc) { + ival = strtod(argv[i+1], &ep); + if(*ep) { + fprintf(stderr, "%s: '-i' Invalid interval value\n", argv[0]); + return EXIT_FAILURE; + } + else + i++; + } + } + else if(!strncmp(argv[i], "-c", 3)) { + if(++i < argc) + counts = atoi(argv[i]); + } + else if(!strncmp(argv[i], "-w", 3)) { + if(++i < argc) + barwidth = atoi(argv[i]); + } + else if(!strncmp(argv[i], "-h", 3)) { + if(++i < argc) + barheight = atoi(argv[i]); + } + else if(!strncmp(argv[i], "-fg", 4)) { + if(++i < argc) + fg = argv[i]; + else { + fg = malloc(6); + strcpy(fg, "white"); + } + } + else if(!strncmp(argv[i], "-bg", 4)) { + if(++i < argc) + bg = argv[i]; + else { + bg = malloc(9); + strcpy(bg, "darkgrey"); + } + } + else { + printf("usage: %s [-i ] [-c ] [-fg ] [-bg ] [-w ] [-h ]\n", argv[0]); + return EXIT_FAILURE; + } + } + + if(!fg) { + fg = malloc(6); + strcpy(fg, "white"); + } + if(!bg) { + bg = malloc(9); + strcpy(bg, "darkgrey"); + } + + if(!(statfp = fopen("/proc/stat", "r"))) { + printf("%s: error opening '/proc/stat'\n", argv[0]); + return EXIT_FAILURE; + } + + t = counts > 0 ? counts : 1; + while(t) { + rewind(statfp); + while(fgets(buf, sizeof buf, statfp)) { + if(!strncmp(buf, "cpu ", 4)) { + unsigned long long unice; + double myload; + /* linux >= 2.6 */ + if((sscanf(buf, "cpu %llu %llu %llu %llu %llu", + &ncpu.user, &unice, &ncpu.sys, &ncpu.idle, &ncpu.iowait)) < 5) { + printf("%s: wrong field count in /proc/stat\n", argv[0]); + return EXIT_FAILURE; + } + ncpu.user += unice; + + mcpu.user = ncpu.user - ocpu.user; + mcpu.sys = ncpu.sys - ocpu.sys; + mcpu.idle = ncpu.idle - ocpu.idle; + mcpu.iowait = ncpu.iowait - ocpu.iowait; + + total = (mcpu.user + mcpu.sys + mcpu.idle + mcpu.iowait) / 100.0; + myload = (mcpu.user + mcpu.sys + mcpu.iowait) / total; + + pbar(myload, barwidth, barheight); + ocpu = ncpu; + } + } + if((counts > 0) && (t-1 > 0)) { + --t; + usleep((unsigned long)(ival * 1000000.0)); + } + else if((counts == 0) && (t == 1)) + usleep((unsigned long)(ival * 1000000.0)); + else + break; + } + + return EXIT_SUCCESS; +} + -- cgit v1.2.3-54-g00ecf