all repos — slstatus @ 81e8da5d90aafa533b7cbcec27559cd79e119703

my build of slstatus (tools.suckless.org/slstatus/)

Merge branch 'master' of https://github.com/drkh5h/slstatus
Ali H. Fardan raiz@firemail.cc
Wed, 14 Sep 2016 03:24:53 +0300
commit

81e8da5d90aafa533b7cbcec27559cd79e119703

parent

e6158e300d3134e44f741e01108dd088297c476f

3 files changed, 67 insertions(+), 37 deletions(-)

jump to
M README.mdREADME.md

@@ -8,7 +8,7 @@ Looking at the LOC (lines of code) of the [Conky project](https://github.com/brndnmtthws/conky), very interesting: *28.346 lines C++, 219 lines Python and 110 lines Lua*. slstatus currently has about **800 lines of clean documented C code** and even includes additional possibilities as it can be customized and extended very easily. Configure it by customizing the config.h (C header file) which is secure and fast as no config files are parsed at runtime.

The following information is included: -- Battery percentage +- Battery percentage/state - CPU usage (in percent) - Custom shell commands - Date and time

@@ -39,11 +39,7 @@ ### Starting

Write the following code to your ~/.xinitrc (or any other initialization script): - while true; do - slstatus - done & - -The loop is needed that the program runs after suspend to ram. + slstatus & ## Contributing
M config.def.hconfig.def.h

@@ -1,13 +1,5 @@

/* See LICENSE file for copyright and license details. */ -/* alsa sound */ -#define ALSA_CHANNEL "Master" - -/* battery */ -#define BATTERY_PATH "/sys/class/power_supply/" -#define BATTERY_NOW "energy_now" -#define BATTERY_FULL "energy_full_design" - /* how often to update the statusbar (min value == 1) */ #define UPDATE_INTERVAL 1

@@ -16,6 +8,7 @@ #define UNKNOWN_STR "n/a"

/* statusbar - battery_perc (battery percentage) [argument: battery name] +- battery_state (battery charging state) [argument: battery name] - cpu_perc (cpu usage in percent) [argument: NULL] - datetime (date and time) [argument: format] - disk_free (disk usage in percent) [argument: mountpoint]
M slstatus.cslstatus.c

@@ -8,6 +8,7 @@ #include <limits.h>

#include <linux/wireless.h> #include <netdb.h> #include <pwd.h> +#include <signal.h> #include <stdarg.h> #include <stdio.h> #include <stdlib.h>

@@ -39,6 +40,7 @@ };

static char *smprintf(const char *, ...); static char *battery_perc(const char *); +static char *battery_state(const char *); static char *cpu_perc(void); static char *datetime(const char *); static char *disk_free(const char *);

@@ -62,9 +64,11 @@ static char *username(void);

static char *vol_perc(const char *); static char *wifi_perc(const char *); static char *wifi_essid(const char *); +static void sighandler(const int); static unsigned short int delay; static Display *dpy; +static int done = 0; #include "config.h"

@@ -95,34 +99,50 @@

static char * battery_perc(const char *battery) { - int now, full, perc; + int perc; FILE *fp; - ccat(4, BATTERY_PATH, battery, "/", BATTERY_NOW); - + ccat(3, "/sys/class/power_supply/", battery, "/capacity"); fp = fopen(concat, "r"); if (fp == NULL) { warn("Error opening battery file: %s", concat); return smprintf(UNKNOWN_STR); } + fscanf(fp, "%i", &perc); + fclose(fp); - fscanf(fp, "%i", &now); - fclose(fp); + return smprintf("%d%%", perc); +} - ccat(4, BATTERY_PATH, battery, "/", BATTERY_FULL); +static char * +battery_state(const char *battery) +{ + char *state = malloc(sizeof(char)*12); + FILE *fp; + if (!state) { + warn("Failed to get battery state."); + return smprintf(UNKNOWN_STR); + } + + + ccat(3, "/sys/class/power_supply/", battery, "/status"); fp = fopen(concat, "r"); if (fp == NULL) { warn("Error opening battery file: %s", concat); return smprintf(UNKNOWN_STR); } - - fscanf(fp, "%i", &full); + fscanf(fp, "%s", state); fclose(fp); - perc = now / (full / 100); - - return smprintf("%d%%", perc); + if (strcmp(state, "Charging") == 0) + return smprintf("+"); + else if (strcmp(state, "Discharging") == 0) + return smprintf("-"); + else if (strcmp(state, "Full") == 0) + return smprintf("="); + else + return smprintf("?"); } static char *

@@ -470,26 +490,26 @@ return smprintf("%d", geteuid());

} -static char * -vol_perc(const char *snd_card) -{ /* FIX THIS SHIT! */ +static char * +vol_perc(const char *soundcard) +{ long int vol, max, min; snd_mixer_t *handle; snd_mixer_elem_t *elem; snd_mixer_selem_id_t *s_elem; snd_mixer_open(&handle, 0); - snd_mixer_attach(handle, snd_card); + snd_mixer_attach(handle, soundcard); snd_mixer_selem_register(handle, NULL, NULL); snd_mixer_load(handle); snd_mixer_selem_id_malloc(&s_elem); - snd_mixer_selem_id_set_name(s_elem, ALSA_CHANNEL); + snd_mixer_selem_id_set_name(s_elem, "Master"); elem = snd_mixer_find_selem(handle, s_elem); if (elem == NULL) { snd_mixer_selem_id_free(s_elem); snd_mixer_close(handle); - warn("error: ALSA"); + warn("Failed to get volume percentage for: %s.", soundcard); return smprintf(UNKNOWN_STR); }

@@ -500,7 +520,7 @@

snd_mixer_selem_id_free(s_elem); snd_mixer_close(handle); - return smprintf("%d", ((uint_fast16_t)(vol * 100) / max)); + return smprintf("%d%%", ((uint_fast16_t)(vol * 100) / max)); } static char *

@@ -516,7 +536,7 @@ ccat(3, "/sys/class/net/", wificard, "/operstate");

fp = fopen(concat, "r"); - if(fp == NULL) { + if (fp == NULL) { warn("Error opening wifi operstate file"); return smprintf(UNKNOWN_STR); }

@@ -558,7 +578,7 @@

memset(&wreq, 0, sizeof(struct iwreq)); wreq.u.essid.length = IW_ESSID_MAX_SIZE+1; sprintf(wreq.ifr_name, wificard); - if(sockfd == -1) { + if (sockfd == -1) { warn("Cannot open socket for interface: %s", wificard); return smprintf(UNKNOWN_STR); }

@@ -567,6 +587,8 @@ if (ioctl(sockfd,SIOCGIWESSID, &wreq) == -1) {

warn("Get ESSID ioctl failed for interface %s", wificard); return smprintf(UNKNOWN_STR); } + + close(sockfd); if (strcmp((char *)wreq.u.essid.pointer, "") == 0) return smprintf(UNKNOWN_STR);

@@ -574,18 +596,34 @@ else

return smprintf("%s", (char *)wreq.u.essid.pointer); } +static void +sighandler(const int signo) +{ + if (signo == SIGTERM || signo == SIGINT) { + done = 1; + } +} + int main(void) { size_t i; char status_string[4096]; - char *res, *element; + char *res, *element, *status_old; struct arg argument; + struct sigaction act; + + memset(&act, 0, sizeof(act)); + act.sa_handler = sighandler; + sigaction(SIGINT, &act, 0); + sigaction(SIGTERM, &act, 0); dpy = XOpenDisplay(NULL); - for (;;) { - memset(status_string, 0, sizeof(status_string)); + XFetchName(dpy, DefaultRootWindow(dpy), &status_old); + + while (!done) { + status_string[0] = '\0'; for (i = 0; i < sizeof(args) / sizeof(args[0]); ++i) { argument = args[i]; if (argument.args == NULL)

@@ -610,6 +648,9 @@ */

sleep(UPDATE_INTERVAL - delay); delay = 0; } + + XStoreName(dpy, DefaultRootWindow(dpy), status_old); + XSync(dpy, False); XCloseDisplay(dpy);