aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFederico Angelilli <code@fedang.net>2023-11-19 22:28:35 +0100
committerFederico Angelilli <code@fedang.net>2023-11-19 22:28:35 +0100
commit7bb670a21a3e6234ac70a031ecc164159559285a (patch)
treeeb3d59c466049ec72ac88abd9335cf96a4835e1e
parent89b205f3138b94325458ab121d5adb4a00091860 (diff)
Add date buttons with periodic updates
-rw-r--r--src/comet.c24
-rw-r--r--src/connect.c10
-rw-r--r--src/draw.c8
3 files changed, 35 insertions, 7 deletions
diff --git a/src/comet.c b/src/comet.c
index 36d517a..a6d94e8 100644
--- a/src/comet.c
+++ b/src/comet.c
@@ -19,8 +19,20 @@ static gboolean mainloop_quit(gpointer data)
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_REMOVE;
+ return G_SOURCE_CONTINUE;
+}
+
+static gboolean date_update(gpointer data)
+{
+ Button *btn = data;
+ g_free(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);
+ log_debug("Updated date");
+ return G_SOURCE_CONTINUE;
}
static void log_handler(const char *log_domain,
@@ -81,16 +93,19 @@ int main(int argc, char **argv)
state_add_button(state, btn);
}
- Button *long_btn = button_create("long button", PANGO_ALIGN_CENTER);
+ Button *long_btn = button_create("long button", PANGO_ALIGN_RIGHT);
button_set_colors(long_btn, background, foreground, stroke);
button_set_action(long_btn, action);
state_add_button(state, long_btn);
- Button *date_btn = button_create("date = today", PANGO_ALIGN_RIGHT);
+ Button *date_btn = button_create("date", PANGO_ALIGN_CENTER);
button_set_colors(date_btn, background, foreground, stroke);
button_set_action(date_btn, action);
state_add_button(state, date_btn);
+ date_update(date_btn);
+ g_timeout_add(30 * 1000, date_update, date_btn);
+
// purple
Color background2 = { 0.502, 0.168, 0.886, 1 };
Button *u_btn = button_create("U", PANGO_ALIGN_RIGHT);
@@ -106,7 +121,8 @@ int main(int argc, char **argv)
guint source_term = g_unix_signal_add(SIGTERM, mainloop_quit, mainloop);
guint source_int = g_unix_signal_add(SIGINT, mainloop_quit, mainloop);
- guint id = g_timeout_add(100, mainloop_draw, state);
+ // TODO: Redraw only when needed (dirty flag)
+ guint id = g_timeout_add(1000, mainloop_draw, state);
log_debug("Starting main loop");
g_main_loop_run(mainloop);
diff --git a/src/connect.c b/src/connect.c
index bc45812..083d5a7 100644
--- a/src/connect.c
+++ b/src/connect.c
@@ -126,6 +126,12 @@ static gboolean source_check(GSource *source)
return xsource->event != NULL;
}
+static void redraw(State *state)
+{
+ draw_compute_layout(state->draw, state->win, state->btns);
+ draw_paint(state->draw, state->win);
+}
+
static gboolean source_dispatch(GSource *source, GSourceFunc callback, gpointer data)
{
EventSource *xsource = (EventSource *)source;
@@ -157,7 +163,7 @@ static gboolean source_dispatch(GSource *source, GSourceFunc callback, gpointer
log_debug("Processing event 'Expose' [type=%d]", XCB_EXPOSE);
// Redraw
- draw_paint(xsource->con->state->draw, xsource->con->state->win);
+ redraw(xsource->con->state);
break;
}
@@ -198,7 +204,7 @@ static gboolean source_dispatch(GSource *source, GSourceFunc callback, gpointer
update_scale(xsource->con);
// Redraw
- draw_paint(xsource->con->state->draw, xsource->con->state->win);
+ redraw(xsource->con->state);
}
break;
}
diff --git a/src/draw.c b/src/draw.c
index 0961f6f..9328bed 100644
--- a/src/draw.c
+++ b/src/draw.c
@@ -118,6 +118,13 @@ void draw_paint(Drawable *draw, Window *win)
pango_cairo_show_layout(cr, layout->pl);
}
+ // Draw midpoint line
+ //cairo_set_source_rgba(cr, 1, 1, 1, 1);
+ //cairo_set_line_width(cr, 3);
+ //cairo_move_to(cr, width / 2, 0);
+ //cairo_line_to(cr, width / 2, height);
+ //cairo_stroke(cr);
+
cairo_destroy(cr);
// TODO: Move these somewhere else
@@ -247,7 +254,6 @@ void draw_compute_layout(Drawable *draw, Window *win, GList *btns)
}
log_debug("Updated layouts");
- g_list_free(btns);
}
void draw_set_background(Drawable *draw, Color background)