]> git.sur5r.net Git - i3/i3status/blobdiff - i3status.c
Merge pull request #266 from moreais/master
[i3/i3status] / i3status.c
index 5e177450ae7f6be5f5cf5a59eea96e0dbf588c9f..5088c96c8f236d80de1375e4b43d40f584165080 100644 (file)
@@ -63,6 +63,7 @@
 int general_socket;
 
 static bool exit_upon_signal = false;
+static bool run_once = false;
 
 cfg_t *cfg, *cfg_general, *cfg_section;
 
@@ -70,6 +71,11 @@ void **cur_instance;
 
 pthread_t main_thread;
 
+markup_format_t markup_format;
+output_format_t output_format;
+
+char *pct_mark;
+
 /*
  * Set the exit_upon_signal flag, because one cannot do anything in a safe
  * manner in a signal handler (e.g. fprintf, which we really want to do for
@@ -104,7 +110,10 @@ static void *scalloc(size_t size) {
     return result;
 }
 
-static char *sstrdup(const char *str) {
+char *sstrdup(const char *str) {
+    if (str == NULL) {
+        return NULL;
+    }
     char *result = strdup(str);
     exit_if_null(result, "Error: out of memory (strdup())\n");
     return result;
@@ -385,6 +394,7 @@ int main(int argc, char *argv[]) {
     cfg_opt_t tztime_opts[] = {
         CFG_STR("format", "%Y-%m-%d %H:%M:%S %Z", CFGF_NONE),
         CFG_STR("timezone", "", CFGF_NONE),
+        CFG_STR("locale", "", CFGF_NONE),
         CFG_STR("format_time", NULL, CFGF_NONE),
         CFG_CUSTOM_ALIGN_OPT,
         CFG_CUSTOM_MIN_WIDTH_OPT,
@@ -402,6 +412,7 @@ int main(int argc, char *argv[]) {
 
     cfg_opt_t load_opts[] = {
         CFG_STR("format", "%1min %5min %15min", CFGF_NONE),
+        CFG_STR("format_above_threshold", NULL, CFGF_NONE),
         CFG_FLOAT("max_threshold", 5, CFGF_NONE),
         CFG_CUSTOM_ALIGN_OPT,
         CFG_CUSTOM_COLOR_OPTS,
@@ -412,6 +423,9 @@ int main(int argc, char *argv[]) {
 
     cfg_opt_t usage_opts[] = {
         CFG_STR("format", "%usage", CFGF_NONE),
+        CFG_STR("format_above_threshold", NULL, CFGF_NONE),
+        CFG_STR("format_above_degraded_threshold", NULL, CFGF_NONE),
+        CFG_STR("path", "/proc/stat", CFGF_NONE),
         CFG_FLOAT("max_threshold", 95, CFGF_NONE),
         CFG_FLOAT("degraded_threshold", 90, CFGF_NONE),
         CFG_CUSTOM_ALIGN_OPT,
@@ -423,6 +437,7 @@ int main(int argc, char *argv[]) {
 
     cfg_opt_t temp_opts[] = {
         CFG_STR("format", "%degrees C", CFGF_NONE),
+        CFG_STR("format_above_threshold", NULL, CFGF_NONE),
         CFG_STR("path", NULL, CFGF_NONE),
         CFG_INT("max_threshold", 75, CFGF_NONE),
         CFG_CUSTOM_ALIGN_OPT,
@@ -434,6 +449,7 @@ int main(int argc, char *argv[]) {
 
     cfg_opt_t disk_opts[] = {
         CFG_STR("format", "%free", CFGF_NONE),
+        CFG_STR("format_below_threshold", NULL, CFGF_NONE),
         CFG_STR("format_not_mounted", NULL, CFGF_NONE),
         CFG_STR("prefix_type", "binary", CFGF_NONE),
         CFG_STR("threshold_type", "percentage_avail", CFGF_NONE),
@@ -478,11 +494,12 @@ int main(int argc, char *argv[]) {
         CFG_END()};
 
     char *configfile = NULL;
-    int o, option_index = 0;
+    int opt, option_index = 0;
     struct option long_options[] = {
         {"config", required_argument, 0, 'c'},
         {"help", no_argument, 0, 'h'},
         {"version", no_argument, 0, 'v'},
+        {"run-once", no_argument, 0, 0},
         {0, 0, 0, 0}};
 
     struct sigaction action;
@@ -505,18 +522,28 @@ int main(int argc, char *argv[]) {
     if (setlocale(LC_ALL, "") == NULL)
         die("Could not set locale. Please make sure all your LC_* / LANG settings are correct.");
 
-    while ((o = getopt_long(argc, argv, "c:hv", long_options, &option_index)) != -1)
-        if ((char)o == 'c')
-            configfile = optarg;
-        else if ((char)o == 'h') {
-            printf("i3status " VERSION " © 2008 Michael Stapelberg and contributors\n"
-                   "Syntax: %s [-c <configfile>] [-h] [-v]\n",
-                   argv[0]);
-            return 0;
-        } else if ((char)o == 'v') {
-            printf("i3status " VERSION " © 2008 Michael Stapelberg and contributors\n");
-            return 0;
+    while ((opt = getopt_long(argc, argv, "c:hv", long_options, &option_index)) != -1) {
+        switch (opt) {
+            case 'c':
+                configfile = optarg;
+                break;
+            case 'h':
+                printf("i3status " VERSION " © 2008 Michael Stapelberg and contributors\n"
+                       "Syntax: %s [-c <configfile>] [-h] [-v]\n",
+                       argv[0]);
+                return 0;
+                break;
+            case 'v':
+                printf("i3status " VERSION " © 2008 Michael Stapelberg and contributors\n");
+                return 0;
+                break;
+            case 0:
+                if (strcmp(long_options[option_index].name, "run-once") == 0) {
+                    run_once = true;
+                }
+                break;
         }
+    }
 
     if (configfile == NULL)
         configfile = get_config_path();
@@ -604,6 +631,11 @@ int main(int argc, char *argv[]) {
         die("Could not create socket\n");
 
     int interval = cfg_getint(cfg_general, "interval");
+    if (interval <= 0) {
+        die("Invalid interval attribute found in section %s, line %d: %d\n"
+            "Expected positive integer\n",
+            cfg_general->name, cfg_general->line, interval);
+    }
 
     /* One memory page which each plugin can use to buffer output.
      * Even though it’s unclean, we just assume that the user will not
@@ -682,25 +714,25 @@ int main(int argc, char *argv[]) {
 
             CASE_SEC_TITLE("disk") {
                 SEC_OPEN_MAP("disk_info");
-                print_disk_info(json_gen, buffer, title, cfg_getstr(sec, "format"), cfg_getstr(sec, "format_not_mounted"), cfg_getstr(sec, "prefix_type"), cfg_getstr(sec, "threshold_type"), cfg_getfloat(sec, "low_threshold"));
+                print_disk_info(json_gen, buffer, title, cfg_getstr(sec, "format"), cfg_getstr(sec, "format_below_threshold"), cfg_getstr(sec, "format_not_mounted"), cfg_getstr(sec, "prefix_type"), cfg_getstr(sec, "threshold_type"), cfg_getfloat(sec, "low_threshold"));
                 SEC_CLOSE_MAP;
             }
 
             CASE_SEC("load") {
                 SEC_OPEN_MAP("load");
-                print_load(json_gen, buffer, cfg_getstr(sec, "format"), cfg_getfloat(sec, "max_threshold"));
+                print_load(json_gen, buffer, cfg_getstr(sec, "format"), cfg_getstr(sec, "format_above_threshold"), cfg_getfloat(sec, "max_threshold"));
                 SEC_CLOSE_MAP;
             }
 
             CASE_SEC("time") {
                 SEC_OPEN_MAP("time");
-                print_time(json_gen, buffer, NULL, cfg_getstr(sec, "format"), NULL, NULL, tv.tv_sec);
+                print_time(json_gen, buffer, NULL, cfg_getstr(sec, "format"), NULL, NULL, NULL, tv.tv_sec);
                 SEC_CLOSE_MAP;
             }
 
             CASE_SEC_TITLE("tztime") {
                 SEC_OPEN_MAP("tztime");
-                print_time(json_gen, buffer, title, cfg_getstr(sec, "format"), cfg_getstr(sec, "timezone"), cfg_getstr(sec, "format_time"), tv.tv_sec);
+                print_time(json_gen, buffer, title, cfg_getstr(sec, "format"), cfg_getstr(sec, "timezone"), cfg_getstr(sec, "locale"), cfg_getstr(sec, "format_time"), tv.tv_sec);
                 SEC_CLOSE_MAP;
             }
 
@@ -722,13 +754,13 @@ int main(int argc, char *argv[]) {
 
             CASE_SEC_TITLE("cpu_temperature") {
                 SEC_OPEN_MAP("cpu_temperature");
-                print_cpu_temperature_info(json_gen, buffer, atoi(title), cfg_getstr(sec, "path"), cfg_getstr(sec, "format"), cfg_getint(sec, "max_threshold"));
+                print_cpu_temperature_info(json_gen, buffer, atoi(title), cfg_getstr(sec, "path"), cfg_getstr(sec, "format"), cfg_getstr(sec, "format_above_threshold"), cfg_getint(sec, "max_threshold"));
                 SEC_CLOSE_MAP;
             }
 
             CASE_SEC("cpu_usage") {
                 SEC_OPEN_MAP("cpu_usage");
-                print_cpu_usage(json_gen, buffer, cfg_getstr(sec, "format"), cfg_getfloat(sec, "max_threshold"), cfg_getfloat(sec, "degraded_threshold"));
+                print_cpu_usage(json_gen, buffer, cfg_getstr(sec, "format"), cfg_getstr(sec, "format_above_threshold"), cfg_getstr(sec, "format_above_degraded_threshold"), cfg_getstr(sec, "path"), cfg_getfloat(sec, "max_threshold"), cfg_getfloat(sec, "degraded_threshold"));
                 SEC_CLOSE_MAP;
             }
         }
@@ -748,6 +780,10 @@ int main(int argc, char *argv[]) {
         printf("\n");
         fflush(stdout);
 
+        if (run_once) {
+            break;
+        }
+
         /* To provide updates on every full second (as good as possible)
          * we don’t use sleep(interval) but we sleep until the next
          * second (with microsecond precision) plus (interval-1)