#include "arg.h"
+#define LEN(x) (sizeof (x) / sizeof *(x))
+
struct arg {
const char *(*func)();
const char *fmt;
static const char *wifi_perc(const char *iface);
static const char *wifi_essid(const char *iface);
static void sighandler(const int signo);
-static void usage(const int eval);
+static void usage(void);
char *argv0;
static unsigned short int delay = 0;
static unsigned short int done;
-static unsigned short int dflag, oflag, nflag;
static Display *dpy;
#include "config.h"
static const char *
battery_state(const char *bat)
{
- char path[PATH_MAX];
- char state[12];
FILE *fp;
+ struct {
+ char *state;
+ char *symbol;
+ } map[] = {
+ { "Charging", "+" },
+ { "Discharging", "-" },
+ { "Full", "=" },
+ { "Unknown", "/" },
+ };
+ size_t i;
int n;
+ char path[PATH_MAX], state[12];
snprintf(path, sizeof(path), "%s%s%s", "/sys/class/power_supply/", bat, "/status");
fp = fopen(path, "r");
if (n != 1)
return UNKNOWN_STR;
- if (strcmp(state, "Charging") == 0) {
- return "+";
- } else if (strcmp(state, "Discharging") == 0) {
- return "-";
- } else if (strcmp(state, "Full") == 0) {
- return "=";
- } else if (strcmp(state, "Unknown") == 0) {
- return "/";
- } else {
- return "?";
+ for (i = 0; i < LEN(map); i++) {
+ if (!strcmp(map[i].state, state)) {
+ break;
+ }
}
+
+ return (i == LEN(map)) ? "?" : map[i].symbol;
}
static const char *
{
Display *dpy = XOpenDisplay(NULL);
XKeyboardState state;
+
+ if (dpy == NULL) {
+ warnx("XOpenDisplay failed");
+ return UNKNOWN_STR;
+ }
XGetKeyboardControl(dpy, &state);
XCloseDisplay(dpy);
close(afd);
return UNKNOWN_STR;
}
- for (i = 0; i < (sizeof(vnames) / sizeof((vnames[0]))); i++) {
+ for (i = 0; i < LEN(vnames); i++) {
if (devmask & (1 << i) && !strcmp("vol", vnames[i])) {
if (ioctl(afd, MIXER_READ(i), &v) == -1) {
warn("vol_perc: ioctl");
}
static void
-usage(const int eval)
+usage(void)
{
- fprintf(stderr, "usage: %s [-d] [-o] [-n] [-v] [-h]\n", argv0);
- exit(eval);
+ fprintf(stderr, "usage: %s [-s]\n", argv0);
+ exit(1);
}
int
main(int argc, char *argv[])
{
- unsigned short int i;
- char status_string[MAXLEN];
- char *element;
struct arg argument;
struct sigaction act;
- size_t len;
+ size_t i, len;
+ int sflag = 0;
+ char status_string[MAXLEN];
+ char *element;
ARGBEGIN {
- case 'd':
- dflag = 1;
- break;
- case 'o':
- oflag = 1;
+ case 's':
+ sflag = 1;
break;
- case 'n':
- nflag = 1;
- break;
- case 'v':
- printf("slstatus (C) 2016-2017 slstatus engineers\n");
- return 0;
- case 'h':
- usage(0);
default:
- usage(1);
+ usage();
} ARGEND
- if ((dflag && oflag) || (dflag && nflag) || (oflag && nflag)) {
- usage(1);
- }
- if (dflag && daemon(1, 1) < 0) {
- err(1, "daemon");
+ if (argc) {
+ usage();
}
memset(&act, 0, sizeof(act));
sigaction(SIGINT, &act, 0);
sigaction(SIGTERM, &act, 0);
- if (!oflag) {
+ if (!sflag) {
dpy = XOpenDisplay(NULL);
+ if (!dpy) {
+ fprintf(stderr, "slstatus: cannot open display");
+ exit(1);
+ }
}
setlocale(LC_ALL, "");
while (!done) {
status_string[0] = '\0';
- for (element = status_string, i = len = 0;
- i < sizeof(args) / sizeof(args[0]);
+ for (element = status_string, i = len = 0; i < LEN(args);
++i, element += len) {
argument = args[i];
len = snprintf(element, sizeof(status_string)-1 - len,
}
}
- if (oflag) {
- printf("%s\n", status_string);
- } else if (nflag) {
+ if (sflag) {
printf("%s\n", status_string);
- done = 1;
} else {
XStoreName(dpy, DefaultRootWindow(dpy), status_string);
XSync(dpy, False);
}
- if ((UPDATE_INTERVAL - delay) <= 0) {
+ if ((update_interval - delay) <= 0) {
delay = 0;
continue;
} else {
- sleep(UPDATE_INTERVAL - delay);
+ sleep(update_interval - delay);
delay = 0;
}
}
- if (!oflag) {
+ if (!sflag) {
XStoreName(dpy, DefaultRootWindow(dpy), NULL);
XCloseDisplay(dpy);
}