034e23e7587ab682db23220a4af9f551f6e0cda2

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

Message

Fix multi workspace support

Diff

 1diff --git a/src/Hy3Layout.cpp b/src/Hy3Layout.cpp
 2index 7bb8c8636030f70aa13d078628bb368cf1c342cd..6cbd06e5a61dddc8bba4e910da886f29b0c6fd8d 100644
 3--- a/src/Hy3Layout.cpp
 4+++ b/src/Hy3Layout.cpp
 5@@ -248,7 +248,7 @@ Hy3Node* Hy3Layout::getNodeFromWindow(CWindow* window) {
 6 
 7 Hy3Node* Hy3Layout::getWorkspaceRootGroup(const int& id) {
 8 	for (auto& node: this->nodes) {
 9-		if (node.parent == nullptr && node.data.type == Hy3NodeData::Group) {
10+		if (node.workspace_id == id && node.parent == nullptr && node.data.type == Hy3NodeData::Group) {
11 			return &node;
12 		}
13 	}
14@@ -361,6 +361,12 @@ void Hy3Layout::applyNodeDataToWindow(Hy3Node* node, bool force) {
15 void Hy3Layout::onWindowCreatedTiling(CWindow* window) {
16 	if (window->m_bIsFloating) return;
17 
18+	auto* existing = this->getNodeFromWindow(window);
19+	if (existing != nullptr) {
20+		Debug::log(WARN, "Attempted to add a window(%p) that is already tiled(as %p) to the layout", window, existing);
21+		return;
22+	}
23+
24 	auto* monitor = g_pCompositor->getMonitorFromID(window->m_iMonitorID);
25 
26 	Hy3Node* opening_into;
27@@ -377,6 +383,10 @@ void Hy3Layout::onWindowCreatedTiling(CWindow* window) {
28 		opening_after = this->getNodeFromWindow(g_pCompositor->vectorToWindowTiled(g_pInputManager->getMouseCoordsInternal()));
29 	}
30 
31+	if (opening_after != nullptr && opening_after->workspace_id != window->m_iWorkspaceID) {
32+		opening_after = nullptr;
33+	}
34+
35 	if (opening_after != nullptr) {
36 		opening_into = opening_after->parent;
37 	} else {
38@@ -398,6 +408,10 @@ void Hy3Layout::onWindowCreatedTiling(CWindow* window) {
39 		return;
40 	}
41 
42+	if (opening_into->workspace_id != window->m_iWorkspaceID) {
43+		Debug::log(WARN, "opening_into node %p has workspace %d which does not match the opening window (workspace %d)", opening_into, opening_into->workspace_id, window->m_iWorkspaceID);
44+	}
45+
46 	this->nodes.push_back({
47 		.parent = opening_into,
48 		.data = window,
49@@ -415,7 +429,7 @@ void Hy3Layout::onWindowCreatedTiling(CWindow* window) {
50 		auto iter2 = std::next(iter);
51 		children.insert(iter2, &node);
52 	}
53-	Debug::log(LOG, "open new window %p(node: %p:%p) on winodow %p in %p", window, &node, node.data.as_window, opening_after, opening_into);
54+	Debug::log(LOG, "opened new window %p(node: %p) on window %p in %p", window, &node, opening_after, opening_into);
55 
56 	opening_into->data.as_group.lastFocusedChild = &node;
57 	opening_into->recalcSizePosRecursive();