#include #include #include #include #include "cairo.h" #include "pango.h" #include "pool-buffer.h" #include "swaybar/bar.h" #include "swaybar/config.h" #include "swaybar/render.h" #include "wlr-layer-shell-unstable-v1-client-protocol.h" static uint32_t render_to_cairo(cairo_t *cairo, struct swaybar *bar, struct swaybar_output *output) { struct swaybar_config *config = bar->config; cairo_save(cairo); cairo_set_operator(cairo, CAIRO_OPERATOR_CLEAR); cairo_paint(cairo); cairo_restore(cairo); cairo_set_operator(cairo, CAIRO_OPERATOR_SOURCE); if (output->focused) { cairo_set_source_u32(cairo, config->colors.focused_background); } else { cairo_set_source_u32(cairo, config->colors.background); } cairo_paint(cairo); // TODO: use actual height return 20; } void render_frame(struct swaybar *bar, struct swaybar_output *output) { cairo_surface_t *recorder = cairo_recording_surface_create( CAIRO_CONTENT_COLOR_ALPHA, NULL); cairo_t *cairo = cairo_create(recorder); uint32_t height = render_to_cairo(cairo, bar, output); if (height != output->height) { // Reconfigure surface zwlr_layer_surface_v1_set_size( output->layer_surface, 0, height); // TODO: this could infinite loop if the compositor assigns us a // different height than what we asked for wl_surface_commit(output->surface); wl_display_roundtrip(bar->display); } else { // Replay recording into shm and send it off output->current_buffer = get_next_buffer(bar->shm, output->buffers, output->width, output->height); cairo_t *shm = output->current_buffer->cairo; cairo_set_source_surface(shm, recorder, 0.0, 0.0); cairo_paint(shm); wl_surface_attach(output->surface, output->current_buffer->buffer, 0, 0); wl_surface_damage(output->surface, 0, 0, output->width, output->height); wl_surface_commit(output->surface); wl_display_roundtrip(bar->display); } cairo_surface_destroy(recorder); cairo_destroy(cairo); }