diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/comet.c | 88 |
1 files changed, 54 insertions, 34 deletions
diff --git a/src/comet.c b/src/comet.c index 98beb74..2bf642a 100644 --- a/src/comet.c +++ b/src/comet.c @@ -3,6 +3,8 @@ #include <glib-unix.h> #include <time.h> #include <unistd.h> +#include <sys/statvfs.h> +#include <locale.h> #include "window.h" #include "log.h" @@ -12,20 +14,6 @@ #define EVEN(n) ((int)(n) - ((int)(n) % 2 != 0)) -static gboolean mainloop_quit(gpointer data) -{ - g_main_loop_quit(data); - return G_SOURCE_CONTINUE; -} - -//static gboolean mainloop_draw(gpointer data) -//{ -// State *state = data; -// draw_compute_layout(state->draw, state->win, state->btns); -// draw_paint(state->draw, state->win); -// return G_SOURCE_CONTINUE; -//} - static void log_handler(const char *log_domain, GLogLevelFlags level, const char *message, @@ -42,21 +30,48 @@ static void log_handler(const char *log_domain, g_print("%s\n", message); } -typedef struct { - State *state; - Button *btn; - timer_t timer; -} Date_Handler; -static gboolean date_update(Date_Handler *date_ctx) +static gboolean mainloop_quit(gpointer data) +{ + g_main_loop_quit(data); + return G_SOURCE_CONTINUE; +} + +static gboolean disk_update(gpointer data) +{ + Button *btn = data; + + struct statvfs buffer; + g_assert(statvfs("/", &buffer) == 0); + + const double total = buffer.f_blocks * buffer.f_frsize; + const double available = buffer.f_bfree * buffer.f_frsize; + const double used = total - available; + + g_free(btn->text); + btn->text = g_strdup_printf(" %d%%", (int)round((used / total) * 100.0)); + + log_debug("Updated disk percentage"); + state_redraw(btn->action_data); + return G_SOURCE_CONTINUE; +} + +static gboolean date_update(gpointer data) { - g_free(date_ctx->btn->text); + Button *btn = data; + + g_free(btn->text); GDateTime *time = g_date_time_new_now_local(); char *date = g_date_time_format(time, "%A %d %H:%M"); g_assert(date != NULL); - date_ctx->btn->text = date; + btn->text = date; + + struct { + State *state; + timer_t timer; + } *date_ctx = btn->action_data; - log_debug("Updated date"); + log_debug("Updated date and time"); state_redraw(date_ctx->state); struct timespec current; @@ -69,7 +84,6 @@ static gboolean date_update(Date_Handler *date_ctx) return G_SOURCE_CONTINUE; } - static void show_action(Button *btn) { log_info("Called action: %s", btn->text); @@ -83,6 +97,7 @@ static void quit_action(Button *btn) int main(int argc, char **argv) { + setlocale(LC_CTYPE, ""); g_log_set_default_handler(log_handler, (gpointer)G_LOG_LEVEL_DEBUG); GMainLoop *mainloop = g_main_loop_new(NULL, FALSE); @@ -118,23 +133,30 @@ int main(int argc, char **argv) state_add_button(state, btn); } - Button *long_btn = button_create("long button", PANGO_ALIGN_RIGHT); - button_set_colors(long_btn, background, foreground, stroke); - button_set_action(long_btn, show_action, NULL); - state_add_button(state, long_btn); + Button *disk_btn = button_create("disk", PANGO_ALIGN_RIGHT); + button_set_colors(disk_btn, background, foreground, stroke); + button_set_action(disk_btn, show_action, state); + state_add_button(state, disk_btn); + + disk_update(disk_btn); + g_timeout_add(60 * 1000, disk_update, disk_btn); + + struct { + State *state; + timer_t timer; + } date_ctx = { state, 0 }; Button *date_btn = button_create("date", PANGO_ALIGN_CENTER); button_set_colors(date_btn, background, foreground, stroke); - button_set_action(date_btn, show_action, NULL); + button_set_action(date_btn, show_action, &date_ctx); state_add_button(state, date_btn); struct sigevent sev = { 0 }; sev.sigev_notify = SIGEV_SIGNAL; sev.sigev_signo = SIGUSR1; - Date_Handler date_ctx = { state, date_btn, 0 }; g_assert(timer_create(CLOCK_REALTIME, &sev, &date_ctx.timer) == 0); - date_update(&date_ctx); + date_update(date_btn); // purple Color background2 = { 0.502, 0.168, 0.886, 1 }; @@ -146,12 +168,10 @@ int main(int argc, char **argv) connect_attach_state(con, state); connect_attach_source(con); - guint source_alrm = g_unix_signal_add(SIGUSR1, (void *)date_update, &date_ctx); + guint source_alrm = g_unix_signal_add(SIGUSR1, date_update, date_btn); guint source_term = g_unix_signal_add(SIGTERM, mainloop_quit, mainloop); guint source_int = g_unix_signal_add(SIGINT, mainloop_quit, mainloop); - // TODO: Redraw only when needed (dirty flag) - //guint id = g_timeout_add(1000, mainloop_draw, state); state_redraw(state); log_debug("Starting main loop"); |
