]> git.mdlowis.com Git - proto/labwc.git/commitdiff
img: remove "theme" member from lab_img
authortokyo4j <hrak1529@gmail.com>
Fri, 3 Jan 2025 14:57:40 +0000 (23:57 +0900)
committerConsolatis <35009135+Consolatis@users.noreply.github.com>
Sat, 4 Jan 2025 08:10:02 +0000 (09:10 +0100)
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
src/img/img.c
src/theme.c

index cc7abed2b1527a3ece43c8581b19ad0255f9d66e..22173dbb269783798dbb80feb9f7d96f4c785292 100644 (file)
@@ -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
index ccb7cdccbffe1f9028dd301cb6605a4889858191..7c92a68e7a3b605c61bcff12bf6d1076d945c76a 100644 (file)
@@ -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);
        }
 
index 8b88baf35ae485acedaadf69b3a79cba8a0b7592..0d0938a38ddb286916e17903b4ce20c191be70b1 100644 (file)
@@ -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;
        }