diff --git a/src/bar/bar.c b/src/bar/bar.c index 18f2a56..1357e20 100644 --- a/src/bar/bar.c +++ b/src/bar/bar.c @@ -302,8 +302,6 @@ static inline bool bar_output_is_dirty(bar_output_t *bar_output) { } static void bar_output_draw(bar_output_t *bar_output, text_context_t *ctx) { - if (!bar_output_is_dirty(bar_output)) return; - auto cr = bar_output->cr; auto left = &bar_output->left; @@ -318,12 +316,19 @@ static void bar_output_draw(bar_output_t *bar_output, text_context_t *ctx) { bar_item_draw(cr, &bar_output->center, ctx, bar_output->height); } -void bar_draw(bar_t *bar) { +bool bar_draw(bar_t *bar) { auto ctx = bar->ctx; + bool changed = false; + for (size_t i = 0; i < bar->count; ++i) { auto bar_output = &bar->bars[i]; + if (!bar_output_is_dirty(bar_output)) continue; + bar_output_layout(bar_output, ctx); bar_output_draw(bar_output, ctx); + changed = true; } + + return changed; } diff --git a/src/bar/bar.h b/src/bar/bar.h index 79da315..3c3e5fe 100644 --- a/src/bar/bar.h +++ b/src/bar/bar.h @@ -41,4 +41,4 @@ typedef struct bar_t { void bar_init(bar_t *bar, listeners_t *listeners); void bar_cleanup(bar_t *bar); void bar_update(bar_t *bar); -void bar_draw(bar_t *bar); +bool bar_draw(bar_t *bar); diff --git a/src/runtime/runtime.c b/src/runtime/runtime.c index afb4e82..98244b5 100644 --- a/src/runtime/runtime.c +++ b/src/runtime/runtime.c @@ -487,8 +487,7 @@ static inline void runtime_update_bar(runtime_t *runtime) { if (!bar->visible) return; bar_update(bar); - bar_draw(bar); - backend_flush(runtime->backend); + if (bar_draw(bar)) backend_flush(runtime->backend); } static void runtime_run_event_loop(runtime_t *runtime) {