aboutsummaryrefslogtreecommitdiff
path: root/src/draw.c
diff options
context:
space:
mode:
authorFederico Angelilli <code@fedang.net>2024-03-14 23:42:39 +0100
committerFederico Angelilli <code@fedang.net>2024-03-14 23:42:39 +0100
commit5765bea99e1d497063ab312d879390b0dd3d2efd (patch)
tree474befd6fa140801c5d48ce857eb4dc2462616aa /src/draw.c
parent164a2559cbc9012194484fba767dcd127b36a993 (diff)
Add layout animations and refactor
Diffstat (limited to 'src/draw.c')
-rw-r--r--src/draw.c33
1 files changed, 28 insertions, 5 deletions
diff --git a/src/draw.c b/src/draw.c
index 9fcc54b..5171321 100644
--- a/src/draw.c
+++ b/src/draw.c
@@ -102,9 +102,23 @@ void draw_paint(Drawer *draw, Window *win)
pango_cairo_show_layout(cr, layout->pl);
}
- if (layout->btn->anim != NULL && !layout->btn->anim->paint(layout->btn->anim, cr, layout)) {
- animation_destroy(layout->btn->anim);
- layout->btn->anim = NULL;
+ if (layout->btn->anim != NULL) {
+ if (layout->btn->anim->paint_func != NULL) {
+ if (layout->btn->anim->start == 0) {
+ layout->btn->anim->start = g_get_monotonic_time();
+ log_debug("Starting animation [start=%ld, duration=%ld, button=%p]",
+ layout->btn->anim->start, layout->btn->anim->duration, layout->btn);
+ }
+
+ if (!layout->btn->anim->paint_func(layout->btn->anim, cr, layout))
+ layout->btn->anim->paint_func = NULL;
+
+ } else if (layout->btn->anim->paint_func == NULL) {
+ // Remove animation if both paint_func and layout_func finished
+ animation_destroy(layout->btn->anim);
+ layout->btn->anim = NULL;
+ log_debug("Removing animation [button=%p]", layout->btn);
+ }
}
cairo_pop_group_to_source(cr);
@@ -231,6 +245,17 @@ void draw_compute_layout(Drawer *draw, Window *win, GList *btns)
}
}
+ if (btn->anim != NULL && btn->anim->layout_func != NULL) {
+ if (layout->btn->anim->start == 0) {
+ layout->btn->anim->start = g_get_monotonic_time();
+ log_debug("Starting animation [start=%ld, duration=%ld, button=%p]",
+ layout->btn->anim->start, layout->btn->anim->duration, layout->btn);
+ }
+
+ if (!btn->anim->layout_func(btn->anim, layout))
+ btn->anim->layout_func = NULL;
+ }
+
if (layout->btn->simple) {
layout->pl = pango_cairo_create_layout(window_get_context(win));
layout_text(layout, draw->desc, height, radius);
@@ -246,8 +271,6 @@ void draw_compute_layout(Drawer *draw, Window *win, GList *btns)
draw->layouts = g_list_reverse(draw->layouts);
- // FIXME: BUG! Explodes if the buttons are not loaded with the left first!!!
-
int layout_width[3] = {
layout_end[PANGO_ALIGN_LEFT],
layout_end[PANGO_ALIGN_CENTER] - layout_end[PANGO_ALIGN_LEFT],