Created
August 28, 2015 09:39
-
-
Save eeeeeta/216603e1b539b3dd5a9f to your computer and use it in GitHub Desktop.
crappy grayscale lemonbar manager
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* lemonbar manager | |
* by eeeeeta | |
*/ | |
#define UPDATE_INTERVAL 10 | |
#define GRAY "%{F#808080}" | |
#define WHITE "%{F#FFFFFF}" | |
#include <stdio.h> | |
#include <time.h> | |
#include <errno.h> | |
#include <stdlib.h> | |
#include <string.h> | |
#include <signal.h> | |
#include <unistd.h> | |
FILE *barfp; | |
char *callocr(int sz) { | |
char *ret; | |
if ((ret = calloc(sz, 1)) == NULL) { | |
perror("calloc failed"); | |
pclose(barfp); | |
exit(EXIT_FAILURE); | |
} | |
return ret; | |
} | |
char *exec(char *cmd) { | |
FILE *fp; | |
char *state = callocr(175); | |
if ((fp = popen(cmd, "r")) == NULL) { | |
printf("popen failed\n"); | |
if (errno != 0) perror("popen() failed"); | |
strncpy(state, "popen() failed!", 100); | |
return state; | |
} | |
if ((errno = 0) == 0 && fgets(state, 175, fp) == NULL && errno != 0) { | |
printf("fgets failed\n"); | |
strncpy(state, "fgets() failed!", 100); | |
return state; | |
} | |
if (pclose(fp) == -1) { | |
printf("warn: pclose failed\n"); | |
perror("pclose"); | |
} | |
int len = strlen(state); | |
if (state[len-1] == '\n') state[len-1] = '\0'; | |
return state; | |
} | |
char *get_load() { | |
double loadavg[3]; | |
char *ret = callocr(50); | |
if ((getloadavg(loadavg, 3)) == -1) { | |
strncpy(ret, "err", 14); | |
return ret; | |
} | |
snprintf(ret, 50, "%sload%s %1.2f", GRAY, WHITE, loadavg[0]); | |
return ret; | |
} | |
char *get_vol() { | |
char *vol = exec("pulseaudio-ctl full-status"); | |
if (strcmp(vol, "failed") == 0) return vol; | |
char *ret = callocr(100); | |
char *rvol = strtok(vol, " "); | |
char *mute = strtok(NULL, " "); | |
snprintf(ret, 100, "%svol %s%s%% %smuted %s%s", GRAY, WHITE, rvol, GRAY, WHITE, mute); | |
free(vol); | |
return ret; | |
} | |
char *get_time() { | |
char *ret = callocr(50); | |
time_t rawtime; | |
struct tm * timeinfo; | |
time(&rawtime); | |
timeinfo = localtime(&rawtime); | |
strftime(ret, 50, "%I:%M", timeinfo); | |
return ret; | |
} | |
void bar_upd(int sig) { | |
char *mpc_state = exec("mpc current -f \"%{F##808080}title%{F##FFFFFF} %title% %{F##808080}artist %{F##FFFFFF}%artist% %{F##808080}album %{F##FFFFFF}%album%\""); | |
char *load = get_load(); | |
char *time = get_time(); | |
char *vol = get_vol(); | |
char *win = exec("bspc query -D -d focused"); | |
char *login; | |
if ((login = getlogin()) == NULL) login = "getlogin() failed :("; | |
char barstr[1000]; | |
snprintf(barstr, 500, "%%{l}%sdesktop %s%s%%{c}%s%%{r}%s %s %suser %s%s %stime %s%s\n", GRAY, WHITE, win, mpc_state, vol, load, GRAY, WHITE, login, GRAY, WHITE, time); | |
fputs(barstr, barfp); | |
fflush(barfp); | |
free(mpc_state); | |
free(win); | |
free(vol); | |
free(time); | |
free(load); | |
} | |
int main(int argc, char *argv[]) { | |
int upd = UPDATE_INTERVAL; | |
printf("eeeeeta's lemonbar manager\n"); | |
if (argc > 1) { | |
upd = strtol(argv[1], NULL, 10); | |
} | |
printf("spawning lemonbar..."); | |
if ((barfp = popen("lemonbar -g 1890x20+15+10 -f Inconsolata", "w")) == NULL) { | |
printf("failed\n"); | |
if (errno != 0) perror("popen() failed"); | |
} | |
printf("done :D\n"); | |
struct sigaction sa; | |
sa.sa_handler = bar_upd; | |
sigemptyset(&sa.sa_mask); | |
sa.sa_flags = SA_RESTART; | |
if (sigaction(SIGUSR1, &sa, NULL) == -1) { | |
perror("sigaction failed"); | |
exit(EXIT_FAILURE); | |
} | |
bar_upd(SIGUSR1); | |
printf("updating every %d seconds, or when I get a SIGUSR1\n", upd); | |
while (1) { | |
if (sleep(upd) == 0) bar_upd(SIGUSR1); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment