aboutsummaryrefslogtreecommitdiffstats
path: root/swaybar/render.c
diff options
context:
space:
mode:
authorLibravatar Ian Fan <ianfan0@gmail.com>2018-09-28 16:17:15 +0100
committerLibravatar Ian Fan <ianfan0@gmail.com>2018-09-30 10:07:33 +0100
commit02dfeea54c4eac2a96c0d8d614d5c16d96358ad0 (patch)
tree1f1d49abca1369c7e165991f69d8451f01af5c2f /swaybar/render.c
parentMerge pull request #2732 from RyanDwyer/fix-zero-outputs (diff)
downloadsway-02dfeea54c4eac2a96c0d8d614d5c16d96358ad0.tar.gz
sway-02dfeea54c4eac2a96c0d8d614d5c16d96358ad0.tar.zst
sway-02dfeea54c4eac2a96c0d8d614d5c16d96358ad0.zip
swaybar: synchronize rendering to output frames
Diffstat (limited to 'swaybar/render.c')
-rw-r--r--swaybar/render.c24
1 files changed, 23 insertions, 1 deletions
diff --git a/swaybar/render.c b/swaybar/render.c
index 90e5bac7..dc31a5ea 100644
--- a/swaybar/render.c
+++ b/swaybar/render.c
@@ -473,7 +473,22 @@ static uint32_t render_to_cairo(cairo_t *cairo, struct swaybar_output *output) {
473 return max_height > output->height ? max_height : output->height; 473 return max_height > output->height ? max_height : output->height;
474} 474}
475 475
476void render_frame(struct swaybar *bar, struct swaybar_output *output) { 476static void output_frame_handle_done(void *data, struct wl_callback *callback,
477 uint32_t time) {
478 wl_callback_destroy(callback);
479 struct swaybar_output *output = data;
480 output->frame_scheduled = false;
481 if (output->dirty) {
482 render_frame(output);
483 output->dirty = false;
484 }
485}
486
487static const struct wl_callback_listener output_frame_listener = {
488 .done = output_frame_handle_done
489};
490
491void render_frame(struct swaybar_output *output) {
477 assert(output->surface != NULL); 492 assert(output->surface != NULL);
478 493
479 struct swaybar_hotspot *hotspot, *tmp; 494 struct swaybar_hotspot *hotspot, *tmp;
@@ -518,6 +533,8 @@ void render_frame(struct swaybar *bar, struct swaybar_output *output) {
518 output->width * output->scale, 533 output->width * output->scale,
519 output->height * output->scale); 534 output->height * output->scale);
520 if (!output->current_buffer) { 535 if (!output->current_buffer) {
536 cairo_surface_destroy(recorder);
537 cairo_destroy(cairo);
521 return; 538 return;
522 } 539 }
523 cairo_t *shm = output->current_buffer->cairo; 540 cairo_t *shm = output->current_buffer->cairo;
@@ -535,6 +552,11 @@ void render_frame(struct swaybar *bar, struct swaybar_output *output) {
535 output->current_buffer->buffer, 0, 0); 552 output->current_buffer->buffer, 0, 0);
536 wl_surface_damage(output->surface, 0, 0, 553 wl_surface_damage(output->surface, 0, 0,
537 output->width, output->height); 554 output->width, output->height);
555
556 struct wl_callback *frame_callback = wl_surface_frame(output->surface);
557 wl_callback_add_listener(frame_callback, &output_frame_listener, output);
558 output->frame_scheduled = true;
559
538 wl_surface_commit(output->surface); 560 wl_surface_commit(output->surface);
539 } 561 }
540 cairo_surface_destroy(recorder); 562 cairo_surface_destroy(recorder);