commit 7e7994dbb2a2c04f55b3c74eb61577c51e9a43ae
parent 63689bfb830b68eba8062aedef9928c55713c9bc
Author: Konstantin Pospelov <kupospelov@gmail.com>
Date: Thu, 27 Mar 2025 20:11:59 +0100
swaybar: deduplicate mode and workspace rendering code
The render_workspace_button and render_binding_mode_indicator functions are
almost the same. This commit extracts the common rendering code into a new
render_box function.
Diffstat:
2 files changed, 58 insertions(+), 86 deletions(-)
diff --git a/include/swaybar/config.h b/include/swaybar/config.h
@@ -14,6 +14,11 @@ struct box_colors {
uint32_t text;
};
+struct box_size {
+ uint32_t width;
+ uint32_t height;
+};
+
struct config_output {
struct wl_list link; // swaybar_config::outputs
char *name;
diff --git a/swaybar/render.c b/swaybar/render.c
@@ -13,7 +13,6 @@
#include "swaybar/ipc.h"
#include "swaybar/render.h"
#include "swaybar/status_line.h"
-#include "log.h"
#if HAVE_TRAY
#include "swaybar/tray/tray.h"
#endif
@@ -21,7 +20,7 @@
static const int WS_HORIZONTAL_PADDING = 5;
static const double WS_VERTICAL_PADDING = 1.5;
-static const double BORDER_WIDTH = 1;
+static const int BORDER_WIDTH = 1;
struct render_context {
cairo_t *cairo;
@@ -541,62 +540,74 @@ static uint32_t render_status_line(struct render_context *ctx, double *x) {
return 0;
}
-static uint32_t render_binding_mode_indicator(struct render_context *ctx,
- double x) {
+static struct box_size render_box(struct render_context *ctx, double x,
+ struct box_colors colors, const char *label, bool pango_markup) {
struct swaybar_output *output = ctx->output;
- const char *mode = output->bar->mode;
- if (!mode) {
- return 0;
- }
-
- cairo_t *cairo = ctx->cairo;
struct swaybar_config *config = output->bar->config;
+ cairo_t *cairo = ctx->cairo;
+
int text_width, text_height;
get_text_size(cairo, config->font_description, &text_width, &text_height, NULL,
- 1, output->bar->mode_pango_markup,
- "%s", mode);
+ 1, pango_markup, "%s", label);
- int ws_vertical_padding = WS_VERTICAL_PADDING;
- int ws_horizontal_padding = WS_HORIZONTAL_PADDING;
- int border_width = BORDER_WIDTH;
+ uint32_t width = text_width + WS_HORIZONTAL_PADDING * 2 + BORDER_WIDTH * 2;
+ if (width < config->workspace_min_width) {
+ width = config->workspace_min_width;
+ }
- uint32_t ideal_height = text_height + ws_vertical_padding * 2
- + border_width * 2;
+ uint32_t ideal_height = text_height + WS_VERTICAL_PADDING * 2
+ + BORDER_WIDTH * 2;
uint32_t ideal_surface_height = ideal_height;
if (!output->bar->config->height &&
output->height < ideal_surface_height) {
- return ideal_surface_height;
- }
- uint32_t width = text_width + ws_horizontal_padding * 2 + border_width * 2;
- if (width < config->workspace_min_width) {
- width = config->workspace_min_width;
+ return (struct box_size) {
+ .width = width,
+ .height = ideal_surface_height,
+ };
}
uint32_t height = output->height;
cairo_set_operator(cairo, CAIRO_OPERATOR_SOURCE);
- cairo_set_source_u32(cairo, config->colors.binding_mode.background);
- ctx->background_color = config->colors.binding_mode.background;
- ctx->has_transparency |= (config->colors.binding_mode.background & 0xFF) != 0xFF;
+ cairo_set_source_u32(cairo, colors.background);
+ ctx->background_color = colors.background;
+ ctx->has_transparency |= (colors.background & 0xFF) != 0xFF;
cairo_rectangle(cairo, x, 0, width, height);
cairo_fill(cairo);
- cairo_set_source_u32(cairo, config->colors.binding_mode.border);
- cairo_rectangle(cairo, x, 0, width, border_width);
+ cairo_set_source_u32(cairo, colors.border);
+ cairo_rectangle(cairo, x, 0, width, BORDER_WIDTH);
cairo_fill(cairo);
- cairo_rectangle(cairo, x, 0, border_width, height);
+ cairo_rectangle(cairo, x, 0, BORDER_WIDTH, height);
cairo_fill(cairo);
- cairo_rectangle(cairo, x + width - border_width, 0, border_width, height);
+ cairo_rectangle(cairo, x + width - BORDER_WIDTH, 0, BORDER_WIDTH, height);
cairo_fill(cairo);
- cairo_rectangle(cairo, x, height - border_width, width, border_width);
+ cairo_rectangle(cairo, x, height - BORDER_WIDTH, width, BORDER_WIDTH);
cairo_fill(cairo);
double text_y = height / 2.0 - text_height / 2.0;
- cairo_set_source_u32(cairo, config->colors.binding_mode.text);
+ cairo_set_source_u32(cairo, colors.text);
cairo_move_to(cairo, x + width / 2 - text_width / 2, (int)floor(text_y));
- choose_text_aa_mode(ctx, config->colors.binding_mode.text);
- render_text(cairo, config->font_description, 1, output->bar->mode_pango_markup,
- "%s", mode);
- return output->height;
+ choose_text_aa_mode(ctx, colors.text);
+ render_text(cairo, config->font_description, 1, pango_markup,
+ "%s", label);
+
+ return (struct box_size) {
+ .width = width,
+ .height = output->height,
+ };
+}
+
+static uint32_t render_binding_mode_indicator(struct render_context *ctx,
+ double x) {
+ struct swaybar_output *output = ctx->output;
+ const char *mode = output->bar->mode;
+ if (!mode) {
+ return 0;
+ }
+
+ struct box_size size = render_box(ctx, x, output->bar->config->colors.binding_mode,
+ mode, output->bar->mode_pango_markup);
+ return size.height;
}
static enum hotspot_event_handling workspace_hotspot_callback(
@@ -618,6 +629,7 @@ static uint32_t render_workspace_button(struct render_context *ctx,
struct swaybar_workspace *ws, double *x) {
struct swaybar_output *output = ctx->output;
struct swaybar_config *config = output->bar->config;
+
struct box_colors box_colors;
if (ws->urgent) {
box_colors = config->colors.urgent_workspace;
@@ -629,66 +641,21 @@ static uint32_t render_workspace_button(struct render_context *ctx,
box_colors = config->colors.inactive_workspace;
}
- uint32_t height = output->height;
-
- cairo_t *cairo = ctx->cairo;
- int text_width, text_height;
- get_text_size(cairo, config->font_description, &text_width, &text_height, NULL,
- 1, config->pango_markup, "%s", ws->label);
-
- int ws_vertical_padding = WS_VERTICAL_PADDING;
- int ws_horizontal_padding = WS_HORIZONTAL_PADDING;
- int border_width = BORDER_WIDTH;
-
- uint32_t ideal_height = ws_vertical_padding * 2 + text_height
- + border_width * 2;
- uint32_t ideal_surface_height = ideal_height;
- if (!output->bar->config->height &&
- output->height < ideal_surface_height) {
- return ideal_surface_height;
- }
-
- uint32_t width = text_width + ws_horizontal_padding * 2 + border_width * 2;
- if (width < config->workspace_min_width) {
- width = config->workspace_min_width;
- }
-
- cairo_set_operator(cairo, CAIRO_OPERATOR_SOURCE);
- cairo_set_source_u32(cairo, 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_fill(cairo);
-
- cairo_set_source_u32(cairo, box_colors.border);
- cairo_rectangle(cairo, *x, 0, width, border_width);
- cairo_fill(cairo);
- cairo_rectangle(cairo, *x, 0, border_width, height);
- cairo_fill(cairo);
- cairo_rectangle(cairo, *x + width - border_width, 0, border_width, height);
- cairo_fill(cairo);
- cairo_rectangle(cairo, *x, height - border_width, width, border_width);
- cairo_fill(cairo);
-
- double text_y = height / 2.0 - text_height / 2.0;
- cairo_set_source_u32(cairo, box_colors.text);
- cairo_move_to(cairo, *x + width / 2 - text_width / 2, (int)floor(text_y));
- choose_text_aa_mode(ctx, box_colors.text);
- render_text(cairo, config->font_description, 1, config->pango_markup,
- "%s", ws->label);
+ struct box_size size = render_box(ctx, *x, box_colors,
+ ws->label, config->pango_markup);
struct swaybar_hotspot *hotspot = calloc(1, sizeof(struct swaybar_hotspot));
hotspot->x = *x;
hotspot->y = 0;
- hotspot->width = width;
- hotspot->height = height;
+ hotspot->width = size.width;
+ hotspot->height = size.height;
hotspot->callback = workspace_hotspot_callback;
hotspot->destroy = free;
hotspot->data = strdup(ws->name);
wl_list_insert(&output->hotspots, &hotspot->link);
- *x += width;
- return output->height;
+ *x += size.width;
+ return size.height;
}
static uint32_t render_to_cairo(struct render_context *ctx) {