]> git.mdlowis.com Git - proto/labwc.git/commitdiff
src/ssd/ssd_part.c: ensure button is found
authorConsolatis <35009135+Consolatis@users.noreply.github.com>
Mon, 8 Apr 2024 15:56:56 +0000 (17:56 +0200)
committerConsolatis <35009135+Consolatis@users.noreply.github.com>
Wed, 10 Apr 2024 06:14:59 +0000 (08:14 +0200)
This fixes an issue detected by the static analyzer.
It currently is not a real bug but it could become
one in the future if `add_toggled_icon()` is called
before `add_scene_button()`.

Rather than having `add_toggled_icon()` go through
the list, find the root button and then fetch its
node descriptor just supply the button as argument.

include/ssd-internal.h
src/ssd/ssd_part.c
src/ssd/ssd_titlebar.c

index 82652f2ca5754930a600fbf0b1ee0952bcf67ab9..7d5f44dcc26883e2b987c828a6284c1a81d1bc32 100644 (file)
@@ -123,9 +123,9 @@ struct ssd_part *add_scene_button(
        struct wlr_scene_tree *parent, float *bg_color,
        struct wlr_buffer *icon_buffer, struct wlr_buffer *hover_buffer,
        int x, struct view *view);
-void
-add_toggled_icon(struct wl_list *part_list, enum ssd_part_type type,
-               struct wlr_buffer *icon_buffer, struct wlr_buffer *hover_buffer);
+void add_toggled_icon(struct ssd_button *button, struct wl_list *part_list,
+       enum ssd_part_type type, struct wlr_buffer *icon_buffer,
+       struct wlr_buffer *hover_buffer);
 struct ssd_part *add_scene_button_corner(
        struct wl_list *part_list, enum ssd_part_type type,
        enum ssd_part_type corner_type, struct wlr_scene_tree *parent,
index f8a693f03f41f383fa0c8fb02436e9036f6f3a53..3933cd1704d61c4679366a898475e1f9cce766d8 100644 (file)
@@ -194,12 +194,10 @@ add_scene_button(struct wl_list *part_list, enum ssd_part_type type,
 }
 
 void
-add_toggled_icon(struct wl_list *part_list, enum ssd_part_type type,
-               struct wlr_buffer *icon_buffer, struct wlr_buffer *hover_buffer)
+add_toggled_icon(struct ssd_button *button, struct wl_list *part_list,
+               enum ssd_part_type type, struct wlr_buffer *icon_buffer,
+               struct wlr_buffer *hover_buffer)
 {
-       struct ssd_part *part = ssd_get_part(part_list, type);
-       struct ssd_button *button = node_ssd_button_from_node(part->node);
-
        /* Alternate icon */
        struct wlr_box icon_geo = get_scale_box(icon_buffer,
                SSD_BUTTON_WIDTH, rc.theme->title_height);
index ca5ff42c7142d502294bad57754a0c6aaa6c280f..cde7bb773ab38b6914b72e403df7d193242c011a 100644 (file)
@@ -99,11 +99,16 @@ ssd_titlebar_create(struct ssd *ssd)
                add_scene_button(&subtree->parts, LAB_SSD_BUTTON_ICONIFY, parent,
                        color, iconify_button_unpressed, iconify_button_hover,
                        width - SSD_BUTTON_WIDTH * 3, view);
-               add_scene_button(&subtree->parts, LAB_SSD_BUTTON_MAXIMIZE, parent,
+
+               /* Maximize button has an alternate state when maximized */
+               struct ssd_part *btn_max_root = add_scene_button(
+                       &subtree->parts, LAB_SSD_BUTTON_MAXIMIZE, parent,
                        color, maximize_button_unpressed, maximize_button_hover,
                        width - SSD_BUTTON_WIDTH * 2, view);
-               add_toggled_icon(&subtree->parts, LAB_SSD_BUTTON_MAXIMIZE,
+               struct ssd_button *btn_max = node_ssd_button_from_node(btn_max_root->node);
+               add_toggled_icon(btn_max, &subtree->parts, LAB_SSD_BUTTON_MAXIMIZE,
                        restore_button_unpressed, restore_button_hover);
+
                add_scene_button_corner(&subtree->parts,
                        LAB_SSD_BUTTON_CLOSE, LAB_SSD_PART_CORNER_TOP_RIGHT, parent,
                        corner_top_right, close_button_unpressed, close_button_hover,