From 90a8c3e793ab53496c3f8e641f83f9941def233b Mon Sep 17 00:00:00 2001 From: tokyo4j Date: Fri, 3 Jan 2025 23:57:40 +0900 Subject: [PATCH] img: remove "theme" member from lab_img lab_img.theme member was referenced by "modifier" functions when drawing a hover effect on button buffers or rounding the button buffer for corner buttons, but this can be prone to use-after-free and was not very clean because theme and lab_img were referencing each other. Instead, let's just reference rc.theme in the modifier functions and remove theme from lab_img. --- include/img/img.h | 7 ++----- src/img/img.c | 6 ++---- src/theme.c | 22 +++++++++++----------- 3 files changed, 15 insertions(+), 20 deletions(-) diff --git a/include/img/img.h b/include/img/img.h index cc7abed2..22173dbb 100644 --- a/include/img/img.h +++ b/include/img/img.h @@ -16,7 +16,6 @@ enum lab_img_type { }; struct lab_img { - struct theme *theme; /* Used by modifier functions */ struct wl_array modifiers; /* lab_img_modifier_func_t */ struct lab_img_cache *cache; }; @@ -33,8 +32,7 @@ struct lab_img *lab_img_load(enum lab_img_type type, const char *path, */ struct lab_img *lab_img_load_from_bitmap(const char *bitmap, float *rgba); -typedef void (*lab_img_modifier_func_t)(struct theme *theme, cairo_t *cairo, - int w, int h); +typedef void (*lab_img_modifier_func_t)(cairo_t *cairo, int w, int h); /** * lab_img_copy() - Copy lab_img @@ -55,8 +53,7 @@ struct lab_img *lab_img_copy(struct lab_img *img); * after the image is rendered on a buffer with lab_img_render(). For example, * hover effects for window buttons can be drawn over the rendered image. */ -void lab_img_add_modifier(struct lab_img *img, lab_img_modifier_func_t modifier, - struct theme *theme); +void lab_img_add_modifier(struct lab_img *img, lab_img_modifier_func_t modifier); /** * lab_img_render() - Render lab_img to a buffer diff --git a/src/img/img.c b/src/img/img.c index ccb7cdcc..7c92a68e 100644 --- a/src/img/img.c +++ b/src/img/img.c @@ -106,10 +106,8 @@ lab_img_copy(struct lab_img *img) } void -lab_img_add_modifier(struct lab_img *img, lab_img_modifier_func_t modifier, - struct theme *theme) +lab_img_add_modifier(struct lab_img *img, lab_img_modifier_func_t modifier) { - img->theme = theme; lab_img_modifier_func_t *mod = wl_array_add(&img->modifiers, sizeof(*mod)); *mod = modifier; } @@ -185,7 +183,7 @@ lab_img_render(struct lab_img *img, int width, int height, int padding, lab_img_modifier_func_t *modifier; wl_array_for_each(modifier, &img->modifiers) { cairo_save(cairo); - (*modifier)(img->theme, cairo, width, height); + (*modifier)(cairo, width, height); cairo_restore(cairo); } diff --git a/src/theme.c b/src/theme.c index 8b88baf3..0d0938a3 100644 --- a/src/theme.c +++ b/src/theme.c @@ -76,12 +76,12 @@ zdrop(struct lab_data_buffer **buffer) /* Draw rounded-rectangular hover overlay on the button buffer */ static void -draw_hover_overlay_on_button(struct theme *theme, cairo_t *cairo, int w, int h) +draw_hover_overlay_on_button(cairo_t *cairo, int w, int h) { /* Overlay (pre-multiplied alpha) */ float overlay_color[4] = { 0.15f, 0.15f, 0.15f, 0.3f}; set_cairo_color(cairo, overlay_color); - int r = theme->window_button_hover_bg_corner_radius; + int r = rc.theme->window_button_hover_bg_corner_radius; cairo_new_sub_path(cairo); cairo_arc(cairo, r, r, r, 180 * deg, 270 * deg); @@ -97,16 +97,16 @@ draw_hover_overlay_on_button(struct theme *theme, cairo_t *cairo, int w, int h) /* Round the buffer for the leftmost button in the titlebar */ static void -round_left_corner_button(struct theme *theme, cairo_t *cairo, int w, int h) +round_left_corner_button(cairo_t *cairo, int w, int h) { /* * Position of the topleft corner of the titlebar relative to the * leftmost button */ - double x = -theme->window_titlebar_padding_width; - double y = -(theme->titlebar_height - theme->window_button_height) / 2; + double x = -rc.theme->window_titlebar_padding_width; + double y = -(rc.theme->titlebar_height - rc.theme->window_button_height) / 2; - double r = rc.corner_radius - (double)theme->border_width / 2.0; + double r = rc.corner_radius - (double)rc.theme->border_width / 2.0; cairo_new_sub_path(cairo); cairo_arc(cairo, x + r, y + r, r, deg * 180, deg * 270); @@ -122,7 +122,7 @@ round_left_corner_button(struct theme *theme, cairo_t *cairo, int w, int h) /* Round the buffer for the rightmost button in the titlebar */ static void -round_right_corner_button(struct theme *theme, cairo_t *cairo, int w, int h) +round_right_corner_button(cairo_t *cairo, int w, int h) { /* * Horizontally flip the cairo context so we can reuse @@ -130,7 +130,7 @@ round_right_corner_button(struct theme *theme, cairo_t *cairo, int w, int h) */ cairo_scale(cairo, -1, 1); cairo_translate(cairo, -w, 0); - round_left_corner_button(theme, cairo, w, h); + round_left_corner_button(cairo, w, h); } /* @@ -223,7 +223,7 @@ load_button(struct theme *theme, struct button *b, int active) button_imgs[b->type][b->state_set & ~LAB_BS_HOVERD]; *img = lab_img_copy(non_hover_img); lab_img_add_modifier(*img, - draw_hover_overlay_on_button, theme); + draw_hover_overlay_on_button); } /* @@ -239,7 +239,7 @@ load_button(struct theme *theme, struct button *b, int active) if (leftmost_button->type == b->type) { *rounded_img = lab_img_copy(*img); lab_img_add_modifier(*rounded_img, - round_left_corner_button, theme); + round_left_corner_button); } break; } @@ -249,7 +249,7 @@ load_button(struct theme *theme, struct button *b, int active) if (rightmost_button->type == b->type) { *rounded_img = lab_img_copy(*img); lab_img_add_modifier(*rounded_img, - round_right_corner_button, theme); + round_right_corner_button); } break; } -- 2.52.0