From f9e4bb41d5d3a0d947bcc68c9fda5f88d4370ed5 Mon Sep 17 00:00:00 2001 From: Yocraft-2000 <304616174+Yocraft-2000@users.noreply.github.com> Date: Sun, 23 Aug 2026 23:35:34 +0200 Subject: [PATCH 1/2] fix: preserve column maximize across fullscreen / maximize-to-edges --- src/view/view.cpp | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/src/view/view.cpp b/src/view/view.cpp index dd974985..627d8795 100644 --- a/src/view/view.cpp +++ b/src/view/view.cpp @@ -1784,12 +1784,6 @@ namespace umbriel { m_unfullscreenGraceStartMsec = 0; } cancelSizeAnimation(); - if (m_tiled && m_workspace != nullptr && maximized) { - const int column = m_workspace->layout().columnOf(this); - if (column >= 0 && m_workspace->layout().isFullWidth(column)) { - m_workspace->layout().clearFullWidthState(column); - } - } m_maximizedToEdges = maximized; if (m_tiled) { @@ -2124,15 +2118,6 @@ namespace umbriel { if (!fullscreen) { m_refullscreenOnTile = false; } - // Leaving column maximize when entering real fullscreen avoids a stale - // widthFrac=1.0 column after the client leaves fullscreen. - if (fullscreen && m_tiled && m_workspace != nullptr) { - const int column = m_workspace->layout().columnOf(this); - if (m_workspace->layout().isFullWidth(column)) { - m_workspace->layout().clearFullWidthState(column); - wlr_xdg_toplevel_set_maximized(m_toplevel, false); - } - } if (fullscreen) { if (m_pinned) { m_pinned = false; From d6addd4bff4caf81f371c2a031ba0ca0a2ce3edf Mon Sep 17 00:00:00 2001 From: Lemmy Date: Wed, 26 Aug 2026 10:45:03 -0400 Subject: [PATCH 2/2] fix(view): keep maximize state for preserved full-width columns --- docs/user/keybinds.md | 2 +- src/view/view.cpp | 7 ++++++- tests/scrolling_layout.cpp | 18 ++++++++++++++++++ 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/docs/user/keybinds.md b/docs/user/keybinds.md index cf141582..11f63302 100644 --- a/docs/user/keybinds.md +++ b/docs/user/keybinds.md @@ -105,7 +105,7 @@ These take no argument. | `window-cycle-width` | Cycle the focused column through its preset widths. | | `window-toggle-fullscreen` | Toggle fullscreen for the focused window. | | `window-toggle-maximize` | Toggle the focused column's full-width state. | -| `window-toggle-maximize-to-edges` | Toggle maximization of the focused window to the usable area's edges, without gaps or borders. Layer-shell exclusive zones remain visible. | +| `window-toggle-maximize-to-edges` | Toggle maximization of the focused window to the usable area's edges, without gaps or borders. Layer-shell exclusive zones remain visible. A column's full-width restore state is preserved when this is toggled or when fullscreen is entered and left. | | `layout-scroll-left` / `layout-scroll-right` | Scroll the active workspace's scrolling-layout viewport; a no-op on a dwindle workspace. | | `config-reload` | Reload the config file, the same reload that runs automatically when the file changes on disk. | diff --git a/src/view/view.cpp b/src/view/view.cpp index 627d8795..34ec799d 100644 --- a/src/view/view.cpp +++ b/src/view/view.cpp @@ -1786,8 +1786,13 @@ namespace umbriel { cancelSizeAnimation(); m_maximizedToEdges = maximized; + bool columnFullWidth = false; + if (!maximized && m_tiled && m_workspace != nullptr && !m_toplevel->scheduled.fullscreen) { + const int column = m_workspace->layout().columnOf(this); + columnFullWidth = column >= 0 && m_workspace->layout().isFullWidth(column); + } if (m_tiled) { - wlr_xdg_toplevel_set_maximized(m_toplevel, maximized); + wlr_xdg_toplevel_set_maximized(m_toplevel, maximized || columnFullWidth); } else { setMaximized(maximized); } diff --git a/tests/scrolling_layout.cpp b/tests/scrolling_layout.cpp index 17b4a3e7..9bff7bed 100644 --- a/tests/scrolling_layout.cpp +++ b/tests/scrolling_layout.cpp @@ -385,6 +385,24 @@ UMBRIEL_TEST(maximizedToEdgesColumnFillsTheViewportIgnoringFractions) { CHECK(!fixture.layout.isFullWidth(1)); } +UMBRIEL_TEST(preservedFullWidthSurvivesEdgeMaximizeToggle) { + Fixture fixture; + fixture.addColumns(1); + CHECK(fixture.layout.setWidthFraction(0, 0.5)); + CHECK(fixture.layout.toggleFullWidth(0)); + + fixture.layout.setConstraints([](const View* view) { + return LayoutConstraints{.maximizedToEdges = view == stub(0)}; + }); + CHECK_EQ(fixture.layout.columnWidth(0, kViewport), kViewport); + + fixture.layout.setConstraints([](const View*) { return LayoutConstraints{}; }); + CHECK(fixture.layout.isFullWidth(0)); + CHECK_EQ(fixture.layout.columnWidth(0, kViewport), kViewport); + CHECK(!fixture.layout.toggleFullWidth(0)); + CHECK(std::fabs(fixture.layout.widthFraction(0) - 0.5) < 1e-6); +} + UMBRIEL_TEST(unsetConstraintsMeanUnconstrained) { Fixture fixture; fixture.addColumns(1);