8ac36f3954619a9a5c1a1bb3296f782452987e82

Author
outfoxxed <outfoxxed@outfoxxed.me>
Committer
outfoxxed <outfoxxed@outfoxxed.me>
Date

Message

layout: add no_gaps_when_only=2

Also clean up window special render data, which may fix some
unreported bugs.

Closes #61

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);