*
* i3status – Generates a status line for dzen2 or xmobar
*
- *
* Copyright © 2008-2009 Michael Stapelberg and contributors
* Copyright © 2009 Thorsten Toepper <atsutane at freethoughts dot de>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * * Neither the name of Michael Stapelberg nor the names of contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
+ * See file LICENSE for license information.
*
*/
#include <string.h>
#include <getopt.h>
#include <signal.h>
#include <confuse.h>
+#include <glob.h>
+#include <sys/stat.h>
+#include <sys/types.h>
#include "i3status.h"
exit(1);
}
+/*
+ * Checks if there is a file at the given path (expanding ~) and returns the
+ * full path if so or NULL if there is no file.
+ *
+ */
+char *file_exists(const char *path) {
+ static glob_t globbuf;
+ struct stat buf;
+ char *full_path = NULL;
+
+ if (glob(path, GLOB_NOCHECK | GLOB_TILDE, NULL, &globbuf) < 0)
+ return NULL;
+
+ full_path = (globbuf.gl_pathc > 0 ? globbuf.gl_pathv[0] : path);
+
+ if (stat(full_path, &buf) < 0)
+ return NULL;
+
+ return full_path;
+}
+
int main(int argc, char *argv[]) {
unsigned int j;
cfg_opt_t general_opts[] = {
+ CFG_STR("output_format", "dzen2", CFGF_NONE),
CFG_BOOL("colors", 1, CFGF_NONE),
CFG_INT("interval", 1, CFGF_NONE),
CFG_END()
};
cfg_opt_t ethernet_opts[] = {
- CFG_STR("format", "E: %ip (%speed)", CFGF_NONE),
+ CFG_STR("format_up", "E: %ip (%speed)", CFGF_NONE),
+ CFG_STR("format_down", "E: down", CFGF_NONE),
CFG_END()
};
};
cfg_opt_t battery_opts[] = {
- CFG_STR("format", "%status %remaining", CFGF_NONE),
+ CFG_STR("format", "%status %percentage %remaining", CFGF_NONE),
+ CFG_BOOL("last_full_capacity", false, CFGF_NONE),
CFG_END()
};
CFG_END()
};
- char *configfile = PREFIX "/etc/i3status.conf";
+ char *configfile;
int o, option_index = 0;
struct option long_options[] = {
{"config", required_argument, 0, 'c'},
action.sa_handler = sigpipe;
sigaction(SIGPIPE, &action, NULL);
+ /* Figure out which configuration file to use before the user may
+ * override this setting using -c */
+
+ if ((configfile = file_exists("~/.i3status.conf")) == NULL)
+ configfile = file_exists(PREFIX "/etc/i3status.conf");
+
while ((o = getopt_long(argc, argv, "c:h", long_options, &option_index)) != -1)
if ((char)o == 'c')
configfile = optarg;
return 0;
}
+ if (configfile == NULL)
+ die("No configuration file found\n");
+
cfg = cfg_init(opts, CFGF_NONE);
if (cfg_parse(cfg, configfile) == CFG_PARSE_ERROR)
return EXIT_FAILURE;
cfg_general = cfg_getsec(cfg, "general");
+ if (cfg_general == NULL)
+ die("Could not get section \"general\"\n");
+
+ char *output_str = cfg_getstr(cfg_general, "output_format");
+ if (strcasecmp(output_str, "dzen2") == 0)
+ output_format = O_DZEN2;
+ else if (strcasecmp(output_str, "xmobar") == 0)
+ output_format = O_XMOBAR;
+ else if (strcasecmp(output_str, "none") == 0)
+ output_format = O_NONE;
+ else die("Unknown output format: \"%s\"\n", output_str);
if ((general_socket = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
die("Could not create socket\n");
print_wireless_info(title, cfg_getstr(sec, "format_up"), cfg_getstr(sec, "format_down"));
CASE_SEC_TITLE("ethernet")
- print_eth_info(title, cfg_getstr(sec, "format"));
+ print_eth_info(title, cfg_getstr(sec, "format_up"), cfg_getstr(sec, "format_down"));
CASE_SEC_TITLE("battery")
- print_battery_info(atoi(title), cfg_getstr(sec, "format"));
+ print_battery_info(atoi(title), cfg_getstr(sec, "format"), cfg_getbool(sec, "last_full_capacity"));
CASE_SEC_TITLE("run_watch")
print_run_watch(title, cfg_getstr(sec, "pidfile"), cfg_getstr(sec, "format"));