perf(bar): 仅在 bar 需要绘制新内容时才重绘并 flush 后端
This commit is contained in:
@@ -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) {
|
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 cr = bar_output->cr;
|
||||||
|
|
||||||
auto left = &bar_output->left;
|
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);
|
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;
|
auto ctx = bar->ctx;
|
||||||
|
|
||||||
|
bool changed = false;
|
||||||
|
|
||||||
for (size_t i = 0; i < bar->count; ++i) {
|
for (size_t i = 0; i < bar->count; ++i) {
|
||||||
auto bar_output = &bar->bars[i];
|
auto bar_output = &bar->bars[i];
|
||||||
|
if (!bar_output_is_dirty(bar_output)) continue;
|
||||||
|
|
||||||
bar_output_layout(bar_output, ctx);
|
bar_output_layout(bar_output, ctx);
|
||||||
bar_output_draw(bar_output, ctx);
|
bar_output_draw(bar_output, ctx);
|
||||||
|
changed = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return changed;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,4 +41,4 @@ typedef struct bar_t {
|
|||||||
void bar_init(bar_t *bar, listeners_t *listeners);
|
void bar_init(bar_t *bar, listeners_t *listeners);
|
||||||
void bar_cleanup(bar_t *bar);
|
void bar_cleanup(bar_t *bar);
|
||||||
void bar_update(bar_t *bar);
|
void bar_update(bar_t *bar);
|
||||||
void bar_draw(bar_t *bar);
|
bool bar_draw(bar_t *bar);
|
||||||
|
|||||||
@@ -487,8 +487,7 @@ static inline void runtime_update_bar(runtime_t *runtime) {
|
|||||||
if (!bar->visible) return;
|
if (!bar->visible) return;
|
||||||
|
|
||||||
bar_update(bar);
|
bar_update(bar);
|
||||||
bar_draw(bar);
|
if (bar_draw(bar)) backend_flush(runtime->backend);
|
||||||
backend_flush(runtime->backend);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void runtime_run_event_loop(runtime_t *runtime) {
|
static void runtime_run_event_loop(runtime_t *runtime) {
|
||||||
|
|||||||
Reference in New Issue
Block a user