aboutsummaryrefslogtreecommitdiff
path: root/src/comet.c
diff options
context:
space:
mode:
authorFederico Angelilli <code@fedang.net>2023-11-25 11:11:15 +0100
committerFederico Angelilli <code@fedang.net>2023-11-25 11:11:15 +0100
commit61f65a2e24fb7ac9739db934baa6e9fa53641c5f (patch)
tree7a33aa962e60e3c8a9e96162105cf9832b54bd31 /src/comet.c
parent710672df7e0d1e65b6253efb7af714c326a777db (diff)
Change redraw scheduling and use posix timer in date_update
Diffstat (limited to 'src/comet.c')
-rw-r--r--src/comet.c61
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, &current);
+
+ 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);