Skip to content

Instantly share code, notes, and snippets.

@eeeeeta
Created August 28, 2015 09:39
Show Gist options
  • Save eeeeeta/216603e1b539b3dd5a9f to your computer and use it in GitHub Desktop.
Save eeeeeta/216603e1b539b3dd5a9f to your computer and use it in GitHub Desktop.
crappy grayscale lemonbar manager
/*
* 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