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