From 5765bea99e1d497063ab312d879390b0dd3d2efd Mon Sep 17 00:00:00 2001 From: Federico Angelilli Date: Thu, 14 Mar 2024 23:42:39 +0100 Subject: Add layout animations and refactor --- src/draw.c | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) (limited to 'src/draw.c') 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], -- cgit v1.2.3