Created
December 15, 2015 21:14
-
-
Save mhz-tamb/384c159093e6fa02a92a to your computer and use it in GitHub Desktop.
This file contains hidden or 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
/* | |
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(×tamp); | |
strftime(datetime, DATETIME_BUFFER, "%H:%M", localtime(×tamp)); | |
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