From: Consolatis <35009135+Consolatis@users.noreply.github.com> Date: Wed, 23 Aug 2023 02:42:30 +0000 (+0200) Subject: src/ssd: un-round corners on maximize X-Git-Url: https://git.mdlowis.com/?a=commitdiff_plain;h=f42f5f41c5f2f7090de55a6e21fddfbfde608285;p=proto%2Flabwc.git src/ssd: un-round corners on maximize --- diff --git a/include/ssd-internal.h b/include/ssd-internal.h index 3af0d06a..148337ed 100644 --- a/include/ssd-internal.h +++ b/include/ssd-internal.h @@ -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; diff --git a/src/ssd/ssd_part.c b/src/ssd/ssd_part.c index 07cd6959..4c72d291 100644 --- a/src/ssd/ssd_part.c +++ b/src/ssd/ssd_part.c @@ -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; } diff --git a/src/ssd/ssd_titlebar.c b/src/ssd/ssd_titlebar.c index cadb7de6..b07b2b35 100644 --- a/src/ssd/ssd_titlebar.c +++ b/src/ssd/ssd_titlebar.c @@ -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;