From 10f22a8f5bedfdd56a3cdb847da1b7cebf9025a5 Mon Sep 17 00:00:00 2001 From: Consolatis <35009135+Consolatis@users.noreply.github.com> Date: Wed, 23 Aug 2023 01:04:40 +0200 Subject: [PATCH] src/ssd: disable border on maximize Fixes #1044 --- include/ssd-internal.h | 2 +- src/ssd/ssd.c | 9 +++++++++ src/ssd/ssd_border.c | 35 ++++++++++++++++++++++++++++++----- 3 files changed, 40 insertions(+), 6 deletions(-) diff --git a/include/ssd-internal.h b/include/ssd-internal.h index 755e5db4..3af0d06a 100644 --- a/include/ssd-internal.h +++ b/include/ssd-internal.h @@ -62,7 +62,7 @@ struct ssd { /* Borders allow resizing as well */ struct { - /* struct wlr_scene_tree *tree; unused for now */ + struct wlr_scene_tree *tree; struct ssd_sub_tree active; struct ssd_sub_tree inactive; } border; diff --git a/src/ssd/ssd.c b/src/ssd/ssd.c index f2d3f267..f2f37c12 100644 --- a/src/ssd/ssd.c +++ b/src/ssd/ssd.c @@ -27,6 +27,15 @@ ssd_thickness(struct view *view) } struct theme *theme = view->server->theme; + + if (view->maximized) { + struct border thickness = { 0 }; + if (!ssd_titlebar_is_hidden(view->ssd)) { + thickness.top += theme->title_height; + } + return thickness; + } + struct border thickness = { .top = theme->title_height + theme->border_width, .bottom = theme->border_width, diff --git a/src/ssd/ssd_border.c b/src/ssd/ssd_border.c index d7cc0e34..70179777 100644 --- a/src/ssd/ssd_border.c +++ b/src/ssd/ssd_border.c @@ -1,5 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only +#include #include "common/scene-helpers.h" #include "labwc.h" #include "ssd-internal.h" @@ -13,6 +14,9 @@ void ssd_border_create(struct ssd *ssd) { + assert(ssd); + assert(!ssd->border.tree); + struct view *view = ssd->view; struct theme *theme = view->server->theme; int width = view->current.width; @@ -23,10 +27,12 @@ ssd_border_create(struct ssd *ssd) struct wlr_scene_tree *parent; struct ssd_sub_tree *subtree; + ssd->border.tree = wlr_scene_tree_create(ssd->tree); + wlr_scene_node_set_position(&ssd->border.tree->node, -theme->border_width, 0); + FOR_EACH_STATE(ssd, subtree) { - subtree->tree = wlr_scene_tree_create(ssd->tree); + subtree->tree = wlr_scene_tree_create(ssd->border.tree); parent = subtree->tree; - wlr_scene_node_set_position(&parent->node, -theme->border_width, 0); if (subtree == &ssd->border.active) { color = theme->window_active_border_color; } else { @@ -51,7 +57,24 @@ ssd_border_create(struct ssd *ssd) void ssd_border_update(struct ssd *ssd) { + assert(ssd); + assert(ssd->border.tree); + struct view *view = ssd->view; + if (view->maximized && ssd->border.tree->node.enabled) { + /* Disable borders on maximize */ + wlr_scene_node_set_enabled(&ssd->border.tree->node, false); + ssd->margin = ssd_thickness(ssd->view); + } + + if (view->maximized) { + return; + } else if (!ssd->border.tree->node.enabled) { + /* And re-enabled them when unmaximized */ + wlr_scene_node_set_enabled(&ssd->border.tree->node, true); + ssd->margin = ssd_thickness(ssd->view); + } + struct theme *theme = view->server->theme; int width = view->current.width; @@ -106,9 +129,8 @@ ssd_border_update(struct ssd *ssd) void ssd_border_destroy(struct ssd *ssd) { - if (!ssd->border.active.tree) { - return; - } + assert(ssd); + assert(ssd->border.tree); struct ssd_sub_tree *subtree; FOR_EACH_STATE(ssd, subtree) { @@ -116,6 +138,9 @@ ssd_border_destroy(struct ssd *ssd) wlr_scene_node_destroy(&subtree->tree->node); subtree->tree = NULL; } FOR_EACH_END + + wlr_scene_node_destroy(&ssd->border.tree->node); + ssd->border.tree = NULL; } #undef FOR_EACH_STATE -- 2.52.0