Diff
1diff --git a/CHANGELOG.md b/CHANGELOG.md
2index 42aea670d1cf4dce7566847efb1c1ba08172576b..a96935f066b6eed8c747ee769b30f7730a3a8a26 100644
3--- a/CHANGELOG.md
4+++ b/CHANGELOG.md
5@@ -1,6 +1,8 @@
6 # Changelog
7
8 ## Upcoming
9+
10+- Added `no_gaps_when_only = 2`
11 - Fixed fullscreen not working on workspaces with only floating windows
12
13 ## hl0.36.0 and before
14diff --git a/README.md b/README.md
15index a059ee623d7c63e6b21c0e23c9465db985c0a639..ef2dda849ab03b3d5d2ebb00570734e4a3ceedb9 100644
16--- a/README.md
17+++ b/README.md
18@@ -212,7 +212,10 @@ configuration options, and some explanation as to what they do.
19 plugin {
20 hy3 {
21 # disable gaps when only one window is onscreen
22- no_gaps_when_only = <bool> # default: false
23+ # 0 - always show gaps
24+ # 1 - hide gaps with a single window onscreen
25+ # 2 - 1 but also show the window border
26+ no_gaps_when_only = <int> # default: 0
27
28 # policy controlling what happens when a node is removed from a group,
29 # leaving only a group
30diff --git a/src/Hy3Layout.cpp b/src/Hy3Layout.cpp
31index c4208d8e2ad8bbd20c804589a177d0cf6a6588b8..b1f177305a2f2aa92294b1dea360456732f4bb3d 100644
32--- a/src/Hy3Layout.cpp
33+++ b/src/Hy3Layout.cpp
34@@ -1453,6 +1453,8 @@ void Hy3Layout::applyNodeDataToWindow(Hy3Node* node, bool no_animation) {
35
36 CMonitor* monitor = nullptr;
37
38+ auto* workspace = g_pCompositor->getWorkspaceByID(node->workspace_id);
39+
40 if (g_pCompositor->isWorkspaceSpecial(node->workspace_id)) {
41 for (auto& m: g_pCompositor->m_vMonitors) {
42 if (m->specialWorkspaceID == node->workspace_id) {
43@@ -1461,9 +1463,7 @@ void Hy3Layout::applyNodeDataToWindow(Hy3Node* node, bool no_animation) {
44 }
45 }
46 } else {
47- monitor = g_pCompositor->getMonitorFromID(
48- g_pCompositor->getWorkspaceByID(node->workspace_id)->m_iMonitorID
49- );
50+ monitor = g_pCompositor->getMonitorFromID(workspace->m_iMonitorID);
51 }
52
53 if (monitor == nullptr) {
54@@ -1476,9 +1476,11 @@ void Hy3Layout::applyNodeDataToWindow(Hy3Node* node, bool no_animation) {
55 return;
56 }
57
58+ const auto workspace_rule = g_pConfigManager->getWorkspaceRuleFor(workspace);
59+
60 // clang-format off
61 static const auto gaps_in = ConfigValue<Hyprlang::CUSTOMTYPE, CCssGapData>("general:gaps_in");
62- static const auto single_window_no_gaps = ConfigValue<Hyprlang::INT>("plugin:hy3:no_gaps_when_only");
63+ static const auto no_gaps_when_only = ConfigValue<Hyprlang::INT>("plugin:hy3:no_gaps_when_only");
64 // clang-format on
65
66 if (!g_pCompositor->windowExists(window) || !window->m_bIsMapped) {
67@@ -1494,35 +1496,36 @@ void Hy3Layout::applyNodeDataToWindow(Hy3Node* node, bool no_animation) {
68 return;
69 }
70
71- window->m_vSize = node->size;
72- window->m_vPosition = node->position;
73+ window->updateSpecialRenderData();
74+
75+ auto nodeBox = CBox(node->position, node->size);
76+ nodeBox.round();
77+
78+ window->m_vSize = nodeBox.size();
79+ window->m_vPosition = nodeBox.pos();
80
81 auto only_node = root_node != nullptr && root_node->data.as_group.children.size() == 1
82 && root_node->data.as_group.children.front()->data.type == Hy3NodeType::Window;
83
84 if (!g_pCompositor->isWorkspaceSpecial(window->m_iWorkspaceID)
85- && ((*single_window_no_gaps && (only_node || window->m_bIsFullscreen))
86+ && ((*no_gaps_when_only != 0 && (only_node || window->m_bIsFullscreen))
87 || (window->m_bIsFullscreen
88 && g_pCompositor->getWorkspaceByID(window->m_iWorkspaceID)->m_efFullscreenMode
89 == FULLSCREEN_FULL)))
90 {
91+ window->m_sSpecialRenderData.border = workspace_rule.border.value_or(*no_gaps_when_only == 2);
92+ window->m_sSpecialRenderData.rounding = false;
93+ window->m_sSpecialRenderData.shadow = false;
94
95- CBox wb = {window->m_vPosition, window->m_vSize};
96- wb.round();
97+ window->updateWindowDecos();
98
99- window->m_vRealPosition = wb.pos();
100- window->m_vRealSize = wb.size();
101+ const auto reserved = window->getFullWindowReservedArea();
102
103- window->updateWindowDecos();
104+ window->m_vRealPosition = window->m_vPosition + reserved.topLeft;
105+ window->m_vRealSize = window->m_vSize - (reserved.topLeft + reserved.bottomRight);
106
107- window->m_sSpecialRenderData.rounding = false;
108- window->m_sSpecialRenderData.border = false;
109- window->m_sSpecialRenderData.decorate = false;
110+ g_pXWaylandManager->setWindowSize(window, window->m_vRealSize.goal());
111 } else {
112- window->m_sSpecialRenderData.rounding = true;
113- window->m_sSpecialRenderData.border = true;
114- window->m_sSpecialRenderData.decorate = true;
115-
116 auto calcPos = window->m_vPosition;
117 auto calcSize = window->m_vSize;
118
119@@ -1544,7 +1547,7 @@ void Hy3Layout::applyNodeDataToWindow(Hy3Node* node, bool no_animation) {
120 window->m_vRealPosition = wb.pos();
121 window->m_vRealSize = wb.size();
122
123- g_pXWaylandManager->setWindowSize(window, calcSize);
124+ g_pXWaylandManager->setWindowSize(window, wb.size());
125
126 if (no_animation) {
127 g_pHyprRenderer->damageWindow(window);