Skip to content

Instantly share code, notes, and snippets.

@mhz-tamb
Created December 15, 2015 21:14
Show Gist options
  • Save mhz-tamb/384c159093e6fa02a92a to your computer and use it in GitHub Desktop.
Save mhz-tamb/384c159093e6fa02a92a to your computer and use it in GitHub Desktop.
/*
gcc dwmbar.c -std=c99 -D_XOPEN_SOURCE=600 -lX11 -lasound -Wall -O3 -o dwmbar
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <time.h>
#include <alsa/asoundlib.h>
#include <X11/XKBlib.h>
#define DATETIME_BUFFER 8
#define BATTERY_DEVICE "/sys/class/power_supply/BAT1/capacity"
#define ADAPTER_DEVICE "/sys/class/power_supply/ADP1/online"
#define GLYPH_CLOCK "\uf017"
#define GLYPH_BATTERY "\uf0e7"
#define GLYPH_VOLUME "\uf028"
#define GLYPH_WEATHER "\uf185"
#define GLYPH_KEYBOARD "\uf11c"
#define GLYPH_MAIL "\uf0e0"
int main (void) {
const char *keyboardLayouts[] = {"En", "Ru"};
const char *adapterStatuses[] = {"DC", "AC"};
time_t timestamp;
char datetime[DATETIME_BUFFER], output[512];
Display *display = XOpenDisplay(NULL);
XkbStateRec xkbState;
char adapterStatus, batteryStatus[3];
int adapterDescriptor = open(ADAPTER_DEVICE, O_RDONLY);
int batteryDescriptor = open(BATTERY_DEVICE, O_RDONLY);
if (adapterDescriptor == -1 || batteryDescriptor == -1) {
return EXIT_FAILURE;
}
snd_mixer_t *alsa_handle;
snd_mixer_elem_t *elem;
snd_mixer_selem_id_t *s_elem;
snd_mixer_open(&alsa_handle, 0);
snd_mixer_attach(alsa_handle, "default");
snd_mixer_selem_register(alsa_handle, NULL, NULL);
snd_mixer_load(alsa_handle);
snd_mixer_selem_id_malloc(&s_elem);
snd_mixer_selem_id_set_index(s_elem, 0);
snd_mixer_selem_id_set_name(s_elem, "Master");
elem = snd_mixer_find_selem(alsa_handle, s_elem);
long int volume, volumeMin, volumeMax, volumePercent;
snd_mixer_selem_get_playback_volume_range(elem, &volumeMin, &volumeMax);
while(1) {
time(&timestamp);
strftime(datetime, DATETIME_BUFFER, "%H:%M", localtime(&timestamp));
XkbGetState(display, XkbUseCoreKbd, &xkbState);
if (pread(adapterDescriptor, &adapterStatus, sizeof(adapterStatus), 0) != sizeof(adapterStatus)) {
return EXIT_FAILURE;
}
if (pread(batteryDescriptor, &batteryStatus, sizeof(batteryStatus), 0) != sizeof(batteryStatus)) {
return EXIT_FAILURE;
}
snd_mixer_handle_events(alsa_handle);
snd_mixer_selem_get_playback_volume(elem, SND_MIXER_SCHN_MONO, &volume);
volumePercent = (volume * 100) / volumeMax;
snprintf(output, 512,
"%s %s %s %ld%% %s %i%% %s %s %s",
GLYPH_KEYBOARD, keyboardLayouts[xkbState.group],
GLYPH_VOLUME, volumePercent,
GLYPH_BATTERY, atoi(batteryStatus), adapterStatuses[atoi(&adapterStatus)],
GLYPH_CLOCK, datetime
);
XStoreName(display, DefaultRootWindow(display), output);
XSync(display, False);
usleep(300 * 1000);
}
close(adapterDescriptor);
close(batteryDescriptor);
snd_mixer_selem_id_free(s_elem);
snd_mixer_close(alsa_handle);
XCloseDisplay(display);
return EXIT_SUCCESS;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment