]> git.mdlowis.com Git - proto/labwc.git/commitdiff
src/ssd: un-round corners on maximize
authorConsolatis <35009135+Consolatis@users.noreply.github.com>
Wed, 23 Aug 2023 02:42:30 +0000 (04:42 +0200)
committerConsolatis <35009135+Consolatis@users.noreply.github.com>
Fri, 25 Aug 2023 09:34:52 +0000 (11:34 +0200)
include/ssd-internal.h
src/ssd/ssd_part.c
src/ssd/ssd_titlebar.c

index 3af0d06a963bf3cd3317a81686cc1e14e8bdf759..148337edad92952484bdb15c64575d3d1c28981a 100644 (file)
@@ -17,6 +17,7 @@ struct ssd_button {
        struct view *view;
        enum ssd_part_type type;
        struct wlr_scene_node *hover;
+       struct wlr_scene_node *background;
 
        struct wl_listener destroy;
 };
@@ -41,6 +42,7 @@ struct ssd {
         * don't update things we don't have to.
         */
        struct {
+               bool squared_corners;   /* To un-round corner buttons on maximize */
                struct wlr_box geometry;
                struct ssd_state_title {
                        char *text;
index 07cd695988cc0e45d45efd1c1d6c8c0ac8a11958..4c72d291743d9a85e72cd7c882d54bdc74d4a6e3 100644 (file)
@@ -152,7 +152,7 @@ add_scene_button(struct wl_list *part_list, enum ssd_part_type type,
        wlr_scene_node_set_position(button_root->node, x, 0);
 
        /* Background */
-       add_scene_rect(part_list, type, parent,
+       struct ssd_part *bg_rect = add_scene_rect(part_list, type, parent,
                SSD_BUTTON_WIDTH, rc.theme->title_height, 0, 0, bg_color);
 
        /* Icon */
@@ -175,6 +175,7 @@ add_scene_button(struct wl_list *part_list, enum ssd_part_type type,
        button->type = type;
        button->view = view;
        button->hover = hover;
+       button->background = bg_rect->node;
        return button_root;
 }
 
index cadb7de68be1a672a31f60669f3bfb5b233abb61..b07b2b356a7526e186ce65905609faf87cd65d7f 100644 (file)
@@ -90,15 +90,49 @@ is_direct_child(struct wlr_scene_node *node, struct ssd_sub_tree *subtree)
        return node->parent == subtree->tree;
 }
 
+static void
+set_squared_corners(struct ssd *ssd, bool enable)
+{
+       struct ssd_part *part;
+       struct ssd_sub_tree *subtree;
+       enum ssd_part_type ssd_type[2] = { LAB_SSD_BUTTON_WINDOW_MENU, LAB_SSD_BUTTON_CLOSE };
+
+       FOR_EACH_STATE(ssd, subtree) {
+               for (size_t i = 0; i < sizeof(ssd_type) / sizeof(ssd_type[0]); i++) {
+                       part = ssd_get_part(&subtree->parts, ssd_type[i]);
+                       struct ssd_button *button = node_ssd_button_from_node(part->node);
+
+                       /* Toggle background between invisible and titlebar background color */
+                       struct wlr_scene_rect *rect = lab_wlr_scene_get_rect(button->background);
+                       wlr_scene_rect_set_color(rect, !enable ? (float[4]) {0, 0, 0, 0} : (
+                               subtree == &ssd->titlebar.active
+                                       ? rc.theme->window_active_title_bg_color
+                                       : rc.theme->window_inactive_title_bg_color));
+
+                       /* Toggle rounded corner image itself */
+                       struct wlr_scene_node *rounded_corner =
+                               wl_container_of(part->node->link.prev, rounded_corner, link);
+                       wlr_scene_node_set_enabled(rounded_corner, !enable);
+               }
+       } FOR_EACH_END
+
+       ssd->state.squared_corners = enable;
+}
+
 void
 ssd_titlebar_update(struct ssd *ssd)
 {
        struct view *view = ssd->view;
        int width = view->current.width;
+       struct theme *theme = view->server->theme;
+
+       if (view->maximized != ssd->state.squared_corners) {
+               set_squared_corners(ssd, view->maximized);
+       }
+
        if (width == ssd->state.geometry.width) {
                return;
        }
-       struct theme *theme = view->server->theme;
 
        struct ssd_part *part;
        struct ssd_sub_tree *subtree;