#include "signal.h" #include "text.h" #include #include #include #include #define SOMEBAR_CMD "status" struct state { FILE * file; struct text * text; }; static int init_state(struct state * s) { char * dir = getenv("XDG_RUNTIME_DIR"); char * file = "/somebar-0"; size_t dir_len = strlen(dir); size_t file_len = strlen(file); size_t path_len = dir_len + file_len + 1; char path[path_len]; memset(path, '\0', path_len); strncat(path, dir, dir_len); strncat(path, file, file_len); s->text = NULL; s->file = fopen(path, "a"); if(s->file == NULL) return -1; s->text = text_new(); return 0; } static void deinit_state(struct state * s) { if(s->file) fclose(s->file); if(s->text) text_free(s->text); } static void update_status(struct state * s) { const size_t cmd_len = strlen(SOMEBAR_CMD), msg_len = TEXT_SIZE + cmd_len + 3; char msg[msg_len]; text_update(s->text); snprintf(msg, msg_len, "%s %s\n", SOMEBAR_CMD, s->text->value); fputs(msg, s->file); fflush(s->file); } static void run_loop(struct state * s) { while(signal_running) { update_status(s); usleep(1000 * 800); } } int main(void) { int rc; struct state s; signal_setup_actions(); rc = init_state(&s); if(rc == 0) run_loop(&s); deinit_state(&s); return 0; }