diff options
author | Ian Fan <ianfan0@gmail.com> | 2018-09-28 16:17:15 +0100 |
---|---|---|
committer | Ian Fan <ianfan0@gmail.com> | 2018-09-30 10:07:33 +0100 |
commit | 02dfeea54c4eac2a96c0d8d614d5c16d96358ad0 (patch) | |
tree | 1f1d49abca1369c7e165991f69d8451f01af5c2f /swaybar/render.c | |
parent | Merge pull request #2732 from RyanDwyer/fix-zero-outputs (diff) | |
download | sway-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.c | 24 |
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 | ||
476 | void render_frame(struct swaybar *bar, struct swaybar_output *output) { | 476 | static 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 | |||
487 | static const struct wl_callback_listener output_frame_listener = { | ||
488 | .done = output_frame_handle_done | ||
489 | }; | ||
490 | |||
491 | void 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); |