X-Git-Url: https://git.xinqibao.xyz/slstatus.git/blobdiff_plain/32bb92453ac243264763fed4f77dbb7e36ed3763..b2714032e5087e63b5744d3fb8a131e13e1d6f9a:/slstatus.c?ds=sidebyside diff --git a/slstatus.c b/slstatus.c index 2775788..5500a62 100644 --- a/slstatus.c +++ b/slstatus.c @@ -25,10 +25,7 @@ #include #include -#undef strlcat - -#include "extern/arg.h" -#include "extern/strlcat.h" +#include "arg.h" struct arg { char *(*func)(); @@ -50,6 +47,7 @@ static char *gid(void); static char *hostname(void); static char *ip(const char *iface); static char *kernel_release(void); +static char *keyboard_indicators(void); static char *load_avg(void); static char *ram_free(void); static char *ram_perc(void); @@ -142,6 +140,8 @@ battery_state(const char *bat) return smprintf("-"); } else if (strcmp(state, "Full") == 0) { return smprintf("="); + } else if (strcmp(state, "Unknown") == 0) { + return smprintf("/"); } else { return smprintf("?"); } @@ -325,6 +325,29 @@ kernel_release(void) return smprintf("%s", udata.release); } +static char * +keyboard_indicators(void) +{ + Display *dpy = XOpenDisplay(NULL); + XKeyboardState state; + XGetKeyboardControl(dpy, &state); + XCloseDisplay(dpy); + + switch (state.led_mask) { + case 1: + return smprintf("c"); + break; + case 2: + return smprintf("n"); + break; + case 3: + return smprintf("cn"); + break; + default: + return smprintf(""); + } +} + static char * load_avg(void) { @@ -426,7 +449,7 @@ run_command(const char *cmd) } fgets(buf, sizeof(buf), fp); pclose(fp); - buf[sizeof(buf)] = '\0'; + buf[sizeof(buf) - 1] = '\0'; if ((nlptr = strstr(buf, "\n")) != NULL) { nlptr[0] = '\0'; @@ -450,7 +473,7 @@ swap_free(void) return smprintf("%s", UNKNOWN_STR); } - if ((bytes_read = fread(buf, sizeof(char), sizeof(buf), fp)) == 0) { + if ((bytes_read = fread(buf, sizeof(char), sizeof(buf) - 1, fp)) == 0) { warn("swap_free: read error"); fclose(fp); return smprintf("%s", UNKNOWN_STR); @@ -487,7 +510,7 @@ swap_perc(void) return smprintf("%s", UNKNOWN_STR); } - if ((bytes_read = fread(buf, sizeof(char), sizeof(buf), fp)) == 0) { + if ((bytes_read = fread(buf, sizeof(char), sizeof(buf) - 1, fp)) == 0) { warn("swap_perc: read error"); fclose(fp); return smprintf("%s", UNKNOWN_STR); @@ -528,7 +551,7 @@ swap_total(void) warn("Failed to open file /proc/meminfo"); return smprintf("%s", UNKNOWN_STR); } - if ((bytes_read = fread(buf, sizeof(char), sizeof(buf), fp)) == 0) { + if ((bytes_read = fread(buf, sizeof(char), sizeof(buf) - 1, fp)) == 0) { warn("swap_total: read error"); fclose(fp); return smprintf("%s", UNKNOWN_STR); @@ -559,7 +582,7 @@ swap_used(void) warn("Failed to open file /proc/meminfo"); return smprintf("%s", UNKNOWN_STR); } - if ((bytes_read = fread(buf, sizeof(char), sizeof(buf), fp)) == 0) { + if ((bytes_read = fread(buf, sizeof(char), sizeof(buf) - 1, fp)) == 0) { warn("swap_used: read error"); fclose(fp); return smprintf("%s", UNKNOWN_STR); @@ -620,8 +643,7 @@ uptime(void) static char * username(void) { - uid_t uid = geteuid(); - struct passwd *pw = getpwuid(uid); + struct passwd *pw = getpwuid(geteuid()); if (pw == NULL) { warn("Failed to get username"); @@ -661,9 +683,7 @@ vol_perc(const char *card) } close(afd); - if (v == 0) { - return smprintf("mute"); - } + return smprintf("%d%%", v & 0xff); } @@ -811,9 +831,7 @@ main(int argc, char *argv[]) element = smprintf("%s", UNKNOWN_STR); warnx("Failed to format output"); } - if (strlcat(status_string, element, sizeof(status_string)) >= sizeof(status_string)) { - warnx("Output too long"); - } + strncat(status_string, element, sizeof(status_string) - strlen(status_string) - 1); free(res); free(element); }