diff options
Diffstat (limited to 'src/comet.c')
| -rw-r--r-- | src/comet.c | 61 |
1 files changed, 44 insertions, 17 deletions
diff --git a/src/comet.c b/src/comet.c index a3a9167..98beb74 100644 --- a/src/comet.c +++ b/src/comet.c @@ -1,6 +1,8 @@ #include <math.h> #include <glib.h> #include <glib-unix.h> +#include <time.h> +#include <unistd.h> #include "window.h" #include "log.h" @@ -16,13 +18,13 @@ static gboolean mainloop_quit(gpointer 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 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, @@ -40,17 +42,34 @@ static void log_handler(const char *log_domain, g_print("%s\n", message); } -static gboolean date_update(gpointer data) +typedef struct { + State *state; + Button *btn; + timer_t timer; +} Date_Handler; + +static gboolean date_update(Date_Handler *date_ctx) { - Button *btn = data; - g_free(btn->text); + g_free(date_ctx->btn->text); GDateTime *time = g_date_time_new_now_local(); - btn->text = g_date_time_format(time, "%A %d %H:%M"); - g_assert(btn->text != NULL); + char *date = g_date_time_format(time, "%A %d %H:%M"); + g_assert(date != NULL); + date_ctx->btn->text = date; + log_debug("Updated date"); + state_redraw(date_ctx->state); + + struct timespec current; + clock_gettime(CLOCK_REALTIME, ¤t); + + struct itimerspec its = { 0 }; + its.it_value.tv_sec = 60 - (current.tv_sec % 60); + timer_settime(date_ctx->timer, 0, &its, NULL); + return G_SOURCE_CONTINUE; } + static void show_action(Button *btn) { log_info("Called action: %s", btn->text); @@ -109,8 +128,13 @@ int main(int argc, char **argv) button_set_action(date_btn, show_action, NULL); state_add_button(state, date_btn); - date_update(date_btn); - g_timeout_add(30 * 1000, date_update, 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); // purple Color background2 = { 0.502, 0.168, 0.886, 1 }; @@ -119,16 +143,16 @@ int main(int argc, char **argv) button_set_action(q_btn, quit_action, mainloop); state_add_button(state, q_btn); - draw_compute_layout(draw, win, state->btns); - connect_attach_state(con, state); connect_attach_source(con); + guint source_alrm = g_unix_signal_add(SIGUSR1, (void *)date_update, &date_ctx); 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); + //guint id = g_timeout_add(1000, mainloop_draw, state); + state_redraw(state); log_debug("Starting main loop"); g_main_loop_run(mainloop); @@ -136,9 +160,12 @@ int main(int argc, char **argv) log_debug("Cleaning main loop"); g_clear_pointer(&mainloop, g_main_loop_unref); + g_source_remove(source_alrm); g_source_remove(source_term); g_source_remove(source_int); + timer_delete(date_ctx.timer); + state_destroy(state); draw_destroy(draw); window_destroy(win); |
