cf919397d4a80f2ae5e2c56e33979fc91d7fd78b

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

Message

fix: moveNodeToWorkspace breakage across monitors (hy3 dispatchers)

Diff

 1diff --git a/CHANGELOG.md b/CHANGELOG.md
 2index 31c6a9661deb11f4eb496a4bda52c1a0f821a7ec..aa889e4d0ca14455c669fb2d665dbb04aebbbc76 100644
 3--- a/CHANGELOG.md
 4+++ b/CHANGELOG.md
 5@@ -2,6 +2,7 @@
 6 
 7 # Upcoming
 8 - Fixed IPC and wlr-foreign-toplevel not getting fullscreen and maximize events.
 9+- Fixed glitches when moving nodes between monitors with hy3 dispatchers.
10 
11 ## hl0.40.0 and before
12 
13diff --git a/src/Hy3Layout.cpp b/src/Hy3Layout.cpp
14index dad84042d679b1bd3ef97a7323c8ab82cb513e34..0bf51150dbf3460b92b1a2cc46b94263fb034f30 100644
15--- a/src/Hy3Layout.cpp
16+++ b/src/Hy3Layout.cpp
17@@ -953,9 +953,12 @@ void changeNodeWorkspaceRecursive(Hy3Node& node, const PHLWORKSPACE& workspace)
18 
19 	if (node.data.is_window()) {
20 		auto window = node.data.as_window();
21+		g_pHyprRenderer->damageWindow(window);
22 		window->moveToWorkspace(workspace);
23+		window->m_iMonitorID = workspace->m_iMonitorID;
24 		window->updateToplevel();
25 		window->updateDynamicRules();
26+		window->uncacheWindowDecos();
27 	} else {
28 		for (auto* child: node.data.as_group().children) {
29 			changeNodeWorkspaceRecursive(*child, workspace);
30@@ -996,6 +999,7 @@ void Hy3Layout::moveNodeToWorkspace(const PHLWORKSPACE& origin, std::string wsna
31 	if (focused_window != nullptr
32 	    && (focused_window_node == nullptr || focused_window->m_bIsFullscreen))
33 	{
34+		g_pHyprRenderer->damageWindow(focused_window);
35 		g_pCompositor->moveWindowToWorkspaceSafe(focused_window, workspace);
36 	} else {
37 		if (node == nullptr) return;
38@@ -1015,6 +1019,8 @@ void Hy3Layout::moveNodeToWorkspace(const PHLWORKSPACE& origin, std::string wsna
39 
40 		changeNodeWorkspaceRecursive(*node, workspace);
41 		this->insertNode(*node);
42+		g_pCompositor->updateWorkspaceWindows(origin->m_iID);
43+		g_pCompositor->updateWorkspaceWindows(workspace->m_iID);
44 	}
45 
46 	if (follow) {