swaybar: Handle opaque region properly

The background color can be set individually for the different
elements of the bar. If any of the backgrounds have transparency, we have
to bail out from advertising an opaque surface.
This commit is contained in:
Alexander Orzechowski 2024-12-08 11:53:11 -05:00 committed by Simon Ser
parent 4eb86fce07
commit f293418d9d

View file

@ -29,6 +29,7 @@ struct render_context {
cairo_font_options_t *textaa_sharp; cairo_font_options_t *textaa_sharp;
cairo_font_options_t *textaa_safe; cairo_font_options_t *textaa_safe;
uint32_t background_color; uint32_t background_color;
bool has_transparency;
}; };
static void choose_text_aa_mode(struct render_context *ctx, uint32_t fontcolor) { static void choose_text_aa_mode(struct render_context *ctx, uint32_t fontcolor) {
@ -265,6 +266,7 @@ static uint32_t render_status_block(struct render_context *ctx,
uint32_t bg_color = block->urgent uint32_t bg_color = block->urgent
? config->colors.urgent_workspace.background : block->background; ? config->colors.urgent_workspace.background : block->background;
ctx->has_transparency |= (bg_color & 0xFF) != 0xFF;
if (bg_color) { if (bg_color) {
render_sharp_rectangle(cairo, bg_color, x_pos, y_pos, render_sharp_rectangle(cairo, bg_color, x_pos, y_pos,
block_width, render_height); block_width, render_height);
@ -574,6 +576,7 @@ static uint32_t render_binding_mode_indicator(struct render_context *ctx,
cairo_set_operator(cairo, CAIRO_OPERATOR_SOURCE); cairo_set_operator(cairo, CAIRO_OPERATOR_SOURCE);
cairo_set_source_u32(cairo, config->colors.binding_mode.background); cairo_set_source_u32(cairo, config->colors.binding_mode.background);
ctx->background_color = config->colors.binding_mode.background; ctx->background_color = config->colors.binding_mode.background;
ctx->has_transparency |= (config->colors.binding_mode.background & 0xFF) != 0xFF;
cairo_rectangle(cairo, x, 0, width, height); cairo_rectangle(cairo, x, 0, width, height);
cairo_fill(cairo); cairo_fill(cairo);
@ -653,6 +656,7 @@ static uint32_t render_workspace_button(struct render_context *ctx,
cairo_set_operator(cairo, CAIRO_OPERATOR_SOURCE); cairo_set_operator(cairo, CAIRO_OPERATOR_SOURCE);
cairo_set_source_u32(cairo, box_colors.background); cairo_set_source_u32(cairo, box_colors.background);
ctx->background_color = box_colors.background; ctx->background_color = box_colors.background;
ctx->has_transparency |= (box_colors.background & 0xFF) != 0xFF;
cairo_rectangle(cairo, *x, 0, width, height); cairo_rectangle(cairo, *x, 0, width, height);
cairo_fill(cairo); cairo_fill(cairo);
@ -760,10 +764,12 @@ void render_frame(struct swaybar_output *output) {
background_color = output->bar->config->colors.background; background_color = output->bar->config->colors.background;
} }
struct render_context ctx = { 0 }; struct render_context ctx = {
ctx.output = output; .output = output,
// initial background color used for deciding the best way to antialias text // initial background color used for deciding the best way to antialias text
ctx.background_color = background_color; .background_color = background_color,
.has_transparency = (background_color & 0xFF) != 0xFF,
};
cairo_surface_t *recorder = cairo_recording_surface_create( cairo_surface_t *recorder = cairo_recording_surface_create(
CAIRO_CONTENT_COLOR_ALPHA, NULL); CAIRO_CONTENT_COLOR_ALPHA, NULL);
@ -834,8 +840,7 @@ void render_frame(struct swaybar_output *output) {
wl_surface_damage(output->surface, 0, 0, wl_surface_damage(output->surface, 0, 0,
output->width, output->height); output->width, output->height);
uint32_t bg_alpha = background_color & 0xFF; if (!ctx.has_transparency) {
if (bg_alpha == 0xFF) {
struct wl_region *region = struct wl_region *region =
wl_compositor_create_region(output->bar->compositor); wl_compositor_create_region(output->bar->compositor);
wl_region_add(region, 0, 0, INT32_MAX, INT32_MAX); wl_region_add(region, 0, 0, INT32_MAX, INT32_MAX);