X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fprint_load.c;h=5d97a2ca5a08c538a27705aba1718026c6a07689;hb=0e4fd9ad4a4cc7d6c770134a077e91b02f6cd2f0;hp=c0d9494322a41e903cd3c6b5d342d03c835b7e7b;hpb=f947d0a446b1b99020722cbc71127fc0c06086b2;p=i3%2Fi3status diff --git a/src/print_load.c b/src/print_load.c index c0d9494..5d97a2c 100644 --- a/src/print_load.c +++ b/src/print_load.c @@ -1,39 +1,62 @@ -// vim:ts=8:expandtab +// vim:ts=4:sw=4:expandtab +#include #include "i3status.h" -#include #include #include #include +#include +#include -void print_load(const char *format) { +void print_load(yajl_gen json_gen, char *buffer, const char *format, const char *format_above_threshold, const float max_threshold) { + char *outwalk = buffer; /* Get load */ -#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(linux) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__APPLE__) || defined(sun) - double loadavg[3]; - const char *walk; - - if (getloadavg(loadavg, 3) == -1) - errx(-1, "getloadavg() failed\n"); - - for (walk = format; *walk != '\0'; walk++) { - if (*walk != '%') { - putchar(*walk); - continue; - } - - if (BEGINS_WITH(walk+1, "5min")) { - (void)printf("%1.2f", loadavg[0]); - walk += strlen("5min"); - } - - if (BEGINS_WITH(walk+1, "10min")) { - (void)printf("%1.2f", loadavg[1]); - walk += strlen("10min"); - } - - if (BEGINS_WITH(walk+1, "15min")) { - (void)printf("%1.2f", loadavg[2]); - walk += strlen("15min"); - } + +#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(linux) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__APPLE__) || defined(sun) || defined(__DragonFly__) + double loadavg[3]; + const char *selected_format = format; + const char *walk; + bool colorful_output = false; + + if (getloadavg(loadavg, 3) == -1) + goto error; + + if (loadavg[0] >= max_threshold) { + START_COLOR("color_bad"); + colorful_output = true; + if (format_above_threshold != NULL) + selected_format = format_above_threshold; + } + + for (walk = selected_format; *walk != '\0'; walk++) { + if (*walk != '%') { + *(outwalk++) = *walk; + + } else if (BEGINS_WITH(walk + 1, "1min")) { + outwalk += sprintf(outwalk, "%1.2f", loadavg[0]); + walk += strlen("1min"); + + } else if (BEGINS_WITH(walk + 1, "5min")) { + outwalk += sprintf(outwalk, "%1.2f", loadavg[1]); + walk += strlen("5min"); + + } else if (BEGINS_WITH(walk + 1, "15min")) { + outwalk += sprintf(outwalk, "%1.2f", loadavg[2]); + walk += strlen("15min"); + + } else { + *(outwalk++) = '%'; } + } + + if (colorful_output) + END_COLOR; + + *outwalk = '\0'; + OUTPUT_FULL_TEXT(buffer); + + return; +error: #endif + OUTPUT_FULL_TEXT("cant read load"); + (void)fputs("i3status: Cannot read system load using getloadavg()\n", stderr); }