9199fdc442ebd97854a5b751fc5ff5b3cf771a5c

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

Message

reduce SP usage in preparation for upstream UPs

Diff

This diff is truncated to protect this page.

  1diff --git a/flake.lock b/flake.lock
  2index 12ac27d5c638ba40a467beb1b9c528b27acfbc37..da248012299d238361cb76c0533ff7e8fe92e8d0 100644
  3--- a/flake.lock
  4+++ b/flake.lock
  5@@ -20,11 +20,11 @@
  6         ]
  7       },
  8       "locked": {
  9-        "lastModified": 1736102453,
 10-        "narHash": "sha256-5qb4kb7Xbt8jJFL/oDqOor9Z2+E+A+ql3PiyDvsfWZ0=",
 11+        "lastModified": 1737636397,
 12+        "narHash": "sha256-F5MbBj3QVorycVSFE9qjuOTLtIQBqt2VWbXa0uwzm98=",
 13         "owner": "hyprwm",
 14         "repo": "aquamarine",
 15-        "rev": "4846091641f3be0ad7542086d52769bb7932bde6",
 16+        "rev": "7fe006981fae53e931f513026fc754e322f13145",
 17         "type": "github"
 18       },
 19       "original": {
 20@@ -87,11 +87,11 @@
 21         ]
 22       },
 23       "locked": {
 24-        "lastModified": 1734906540,
 25-        "narHash": "sha256-vQ/L9hZFezC0LquLo4TWXkyniWtYBlFHAKIsDc7PYJE=",
 26+        "lastModified": 1737634937,
 27+        "narHash": "sha256-Ffw4ujFpi++6pPHe+gCBOfDgAoNlzVPZN6MReC1beu8=",
 28         "owner": "hyprwm",
 29         "repo": "hyprcursor",
 30-        "rev": "69270ba8f057d55b0e6c2dca0e165d652856e613",
 31+        "rev": "9c5dd1f7c825ee47f72727ad0a4e16ca46a2688e",
 32         "type": "github"
 33       },
 34       "original": {
 35@@ -116,11 +116,11 @@
 36         ]
 37       },
 38       "locked": {
 39-        "lastModified": 1736115290,
 40-        "narHash": "sha256-Jcn6yAzfUMcxy3tN/iZRbi/QgrYm7XLyVRl9g/nbUl4=",
 41+        "lastModified": 1737634889,
 42+        "narHash": "sha256-9JZE3KxcXOqZH9zs3UeadngDiK/yIACTiAR8HSA/TNI=",
 43         "owner": "hyprwm",
 44         "repo": "hyprgraphics",
 45-        "rev": "52202272d89da32a9f866c0d10305a5e3d954c50",
 46+        "rev": "0d77b4895ad5f1bb3b0ee43103a5246c58b65591",
 47         "type": "github"
 48       },
 49       "original": {
 50@@ -136,26 +136,26 @@
 51         "hyprgraphics": "hyprgraphics",
 52         "hyprland-protocols": "hyprland-protocols",
 53         "hyprland-qtutils": "hyprland-qtutils",
 54-        "hyprlang": "hyprlang",
 55+        "hyprlang": "hyprlang_2",
 56         "hyprutils": "hyprutils",
 57         "hyprwayland-scanner": "hyprwayland-scanner",
 58-        "nixpkgs": "nixpkgs",
 59+        "nixpkgs": "nixpkgs_2",
 60         "pre-commit-hooks": "pre-commit-hooks",
 61-        "systems": "systems",
 62+        "systems": "systems_2",
 63         "xdph": "xdph"
 64       },
 65       "locked": {
 66-        "lastModified": 1737190765,
 67-        "narHash": "sha256-PLlikEedyXErmdkuIYPTY7YA3LVRlb+ZYM9YALCi7MM=",
 68+        "lastModified": 1737667631,
 69+        "narHash": "sha256-CptFGa5lP1ag6xF6eeNBCixhpFTbZyuqeXRjBU6saRw=",
 70         "owner": "hyprwm",
 71         "repo": "Hyprland",
 72-        "rev": "d01756c1f41977e852eba1cbf45c0149ae0f08e8",
 73+        "rev": "1a0a22ad038bbd51c4e1514868d6dcd505af0242",
 74         "type": "github"
 75       },
 76       "original": {
 77         "owner": "hyprwm",
 78         "repo": "Hyprland",
 79-        "rev": "d01756c1f41977e852eba1cbf45c0149ae0f08e8",
 80+        "rev": "1a0a22ad038bbd51c4e1514868d6dcd505af0242",
 81         "type": "github"
 82       }
 83     },
 84@@ -171,11 +171,11 @@
 85         ]
 86       },
 87       "locked": {
 88-        "lastModified": 1735774328,
 89-        "narHash": "sha256-vIRwLS9w+N99EU1aJ+XNOU6mJTxrUBa31i1r82l0V7s=",
 90+        "lastModified": 1737556638,
 91+        "narHash": "sha256-laKgI3mr2qz6tas/q3tuGPxMdsGhBi/w+HO+hO2f1AY=",
 92         "owner": "hyprwm",
 93         "repo": "hyprland-protocols",
 94-        "rev": "e3b6af97ddcfaafbda8e2828c719a5af84f662cb",
 95+        "rev": "4c75dd5c015c8a0e5a34c6d02a018a650f57feb5",
 96         "type": "github"
 97       },
 98       "original": {
 99@@ -184,8 +184,37 @@
100         "type": "github"
101       }
102     },
103+    "hyprland-qt-support": {
104+      "inputs": {
105diff --git a/flake.nix b/flake.nix
106index a502dc45ade44c31809c3de1e069492fded99b53..af849adc99192b50bd4c3fa9a3ba775da6cd0750 100644
107--- a/flake.nix
108+++ b/flake.nix
109@@ -1,6 +1,6 @@
110 {
111   inputs = {
112-    hyprland.url = "github:hyprwm/Hyprland?rev=d01756c1f41977e852eba1cbf45c0149ae0f08e8";
113+    hyprland.url = "github:hyprwm/Hyprland?rev=1a0a22ad038bbd51c4e1514868d6dcd505af0242";
114   };
115 
116   outputs = { self, hyprland, ... }: let
117diff --git a/src/Hy3Layout.cpp b/src/Hy3Layout.cpp
118index f37464773ff82a297c81067ce49048230bd64587..ab7f3e85263103c6a39bf8e489ef89c61b5024f5 100644
119--- a/src/Hy3Layout.cpp
120+++ b/src/Hy3Layout.cpp
121@@ -64,59 +64,6 @@ SP<HOOK_CALLBACK_FN> urgentHookPtr;
122 SP<HOOK_CALLBACK_FN> tickHookPtr;
123 SP<HOOK_CALLBACK_FN> mouseButtonPtr;
124 
125-bool performContainment(Hy3Node& node, bool contained, PHLWINDOW& window) {
126-	if (node.data.is_group()) {
127-		auto& group = node.data.as_group();
128-		contained |= group.containment;
129-
130-		auto iter = group.children.begin();
131-		while (iter != group.children.end()) {
132-			switch ((*iter)->data.type()) {
133-			case Hy3NodeType::Group: return performContainment(**iter, contained, window);
134-			case Hy3NodeType::Window:
135-				if (contained) {
136-					auto wpid = (*iter)->data.as_window()->getPID();
137-					auto ppid = getPPIDof(window->getPID());
138-					while (ppid > 10) { // `> 10` yoinked from HL swallow
139-						if (ppid == wpid) {
140-							node.layout->nodes.push_back({
141-							    .parent = &node,
142-							    .data = window,
143-							    .workspace = node.workspace,
144-							    .layout = node.layout,
145-							});
146-
147-							auto& child_node = node.layout->nodes.back();
148-
149-							group.children.insert(std::next(iter), &child_node);
150-							child_node.markFocused();
151-							node.recalcSizePosRecursive();
152-
153-							return true;
154-						}
155-
156-						ppid = getPPIDof(ppid);
157-					}
158-				}
159-			}
160-
161-			iter = std::next(iter);
162-		}
163-	}
164-
165-	return false;
166-}
167-
168-void Hy3Layout::onWindowCreated(PHLWINDOW window, eDirection direction) {
169-	for (auto& node: this->nodes) {
170-		if (node.parent == nullptr && performContainment(node, false, window)) {
171-			return;
172-		}
173-	}
174-
175-	IHyprLayout::onWindowCreated(window, direction);
176-}
177-
178 void Hy3Layout::onWindowCreatedTiling(PHLWINDOW window, eDirection) {
179 	hy3_log(
180 	    LOG,
181@@ -129,7 +76,7 @@ void Hy3Layout::onWindowCreatedTiling(PHLWINDOW window, eDirection) {
182 
183 	if (window->m_bIsFloating) return;
184 
185-	auto* existing = this->getNodeFromWindow(window);
186+	auto* existing = this->getNodeFromWindow(window.get());
187 	if (existing != nullptr) {
188 		hy3_log(
189 		    ERR,
190@@ -174,12 +121,12 @@ void Hy3Layout::insertNode(Hy3Node& node) {
191 	node.reparenting = true;
192 	node.size_ratio = 1.0;
193 
194-	auto monitor = node.workspace->m_pMonitor.lock();
195+	auto& monitor = node.workspace->m_pMonitor;
196 
197 	Hy3Node* opening_into;
198 	Hy3Node* opening_after = nullptr;
199 
200-	auto* root = this->getWorkspaceRootGroup(node.workspace);
201+	auto* root = this->getWorkspaceRootGroup(node.workspace.get());
202 
203 	if (root != nullptr) {
204 		opening_after = root->getFocusedNode();
205@@ -192,13 +139,13 @@ void Hy3Layout::insertNode(Hy3Node& node) {
206 	}
207 
208 	if (opening_after == nullptr) {
209-		auto last_window = g_pCompositor->m_pLastWindow.lock();
210+		auto last_window = g_pCompositor->m_pLastWindow;
211 		if (last_window != nullptr && last_window->m_pWorkspace == node.workspace
212 		    && !last_window->m_bIsFloating
213 		    && (node.data.is_window() || last_window != node.data.as_window())
214 		    && last_window->m_bIsMapped)
215 		{
216-			opening_after = this->getNodeFromWindow(last_window);
217+			opening_after = this->getNodeFromWindow(last_window.get());
218 		} else {
219 			auto mouse_window = g_pCompositor->vectorToWindowUnified(
220 			    g_pInputManager->getMouseCoordsInternal(),
221diff --git a/src/Hy3Layout.hpp b/src/Hy3Layout.hpp
222index 4785533fb0b5336efd5b97181e7d49aef4cb1cc5..eda45791cfcbadc16ad186a1d0756e0d7e3ce092 100644
223--- a/src/Hy3Layout.hpp
224+++ b/src/Hy3Layout.hpp
225@@ -78,7 +78,6 @@ PHLWORKSPACE workspace_for_action(bool allow_fullscreen = false);
226 
227 class Hy3Layout: public IHyprLayout {
228 public:
229-	void onWindowCreated(PHLWINDOW, eDirection = DIRECTION_DEFAULT) override;
230 	void onWindowCreatedTiling(PHLWINDOW, eDirection = DIRECTION_DEFAULT) override;
231 	void onWindowRemovedTiling(PHLWINDOW) override;
232 	void onWindowFocusChange(PHLWINDOW) override;
233@@ -106,13 +105,13 @@ public:
234 	void onDisable() override;
235 
236 	void insertNode(Hy3Node& node);
237-	void makeGroupOnWorkspace(const PHLWORKSPACE& workspace, Hy3GroupLayout, GroupEphemeralityOption);
238-	void makeOppositeGroupOnWorkspace(const PHLWORKSPACE& workspace, GroupEphemeralityOption);
239-	void changeGroupOnWorkspace(const PHLWORKSPACE& workspace, Hy3GroupLayout);
240-	void untabGroupOnWorkspace(const PHLWORKSPACE& workspace);
241-	void toggleTabGroupOnWorkspace(const PHLWORKSPACE& workspace);
242-	void changeGroupToOppositeOnWorkspace(const PHLWORKSPACE& workspace);
243-	void changeGroupEphemeralityOnWorkspace(const PHLWORKSPACE& workspace, bool ephemeral);
244+	void makeGroupOnWorkspace(const CWorkspace* workspace, Hy3GroupLayout, GroupEphemeralityOption);
245+	void makeOppositeGroupOnWorkspace(const CWorkspace* workspace, GroupEphemeralityOption);
246+	void changeGroupOnWorkspace(const CWorkspace* workspace, Hy3GroupLayout);
247+	void untabGroupOnWorkspace(const CWorkspace* workspace);
248+	void toggleTabGroupOnWorkspace(const CWorkspace* workspace);
249+	void changeGroupToOppositeOnWorkspace(const CWorkspace* workspace);
250+	void changeGroupEphemeralityOnWorkspace(const CWorkspace* workspace, bool ephemeral);
251 	void makeGroupOn(Hy3Node*, Hy3GroupLayout, GroupEphemeralityOption);
252 	void makeOppositeGroupOn(Hy3Node*, GroupEphemeralityOption);
253 	void changeGroupOn(Hy3Node&, Hy3GroupLayout);
254@@ -121,35 +120,35 @@ public:
255 	void changeGroupToOppositeOn(Hy3Node&);
256 	void changeGroupEphemeralityOn(Hy3Node&, bool ephemeral);
257 	void shiftNode(Hy3Node&, ShiftDirection, bool once, bool visible);
258-	void shiftWindow(const PHLWORKSPACE& workspace, ShiftDirection, bool once, bool visible);
259-	void shiftFocus(const PHLWORKSPACE& workspace, ShiftDirection, bool visible, bool warp);
260-	void toggleFocusLayer(const PHLWORKSPACE& workspace, bool warp);
261+	void shiftWindow(const CWorkspace* workspace, ShiftDirection, bool once, bool visible);
262+	void shiftFocus(const CWorkspace* workspace, ShiftDirection, bool visible, bool warp);
263+	void toggleFocusLayer(const CWorkspace* workspace, bool warp);
264 	bool shiftMonitor(Hy3Node&, ShiftDirection, bool follow);
265 	Hy3Node* focusMonitor(ShiftDirection);
266 
267 	void warpCursor();
268-	void moveNodeToWorkspace(const PHLWORKSPACE& origin, std::string wsname, bool follow, bool warp);
269-	void changeFocus(const PHLWORKSPACE& workspace, FocusShift);
270+	void moveNodeToWorkspace(CWorkspace* origin, std::string wsname, bool follow, bool warp);
271+	void changeFocus(const CWorkspace* workspace, FocusShift);
272 	void focusTab(
273-	    const PHLWORKSPACE& workspace,
274+	    const CWorkspace* workspace,
275 	    TabFocus target,
276 	    TabFocusMousePriority,
277 	    bool wrap_scroll,
278 	    int index
279 	);
280-	void setNodeSwallow(const PHLWORKSPACE& workspace, SetSwallowOption);
281-	void killFocusedNode(const PHLWORKSPACE& workspace);
282-	void expand(const PHLWORKSPACE& workspace, ExpandOption, ExpandFullscreenOption);
283+	void setNodeSwallow(const CWorkspace* workspace, SetSwallowOption);
284+	void killFocusedNode(const CWorkspace* workspace);
285+	void expand(const CWorkspace* workspace, ExpandOption, ExpandFullscreenOption);
286 	static void warpCursorToBox(const Vector2D& pos, const Vector2D& size);
287 	static void warpCursorWithFocus(const Vector2D& pos, bool force = false);
288 
289-	bool shouldRenderSelected(const PHLWINDOW&);
290-	PHLWINDOW findTiledWindowCandidate(const PHLWINDOW& from);
291-	PHLWINDOW findFloatingWindowCandidate(const PHLWINDOW& from);
292+	bool shouldRenderSelected(const CWindow*);
293+	PHLWINDOW findTiledWindowCandidate(const CWindow* from);
294+	PHLWINDOW findFloatingWindowCandidate(const CWindow* from);
295 
296-	Hy3Node* getWorkspaceRootGroup(const PHLWORKSPACE& workspace);
297+	Hy3Node* getWorkspaceRootGroup(const CWorkspace* workspace);
298 	Hy3Node* getWorkspaceFocusedNode(
299-	    const PHLWORKSPACE& workspace,
300+	    const CWorkspace* workspace,
301 	    bool ignore_group_focus = false,
302 	    bool stop_at_expanded = false
303 	);
304@@ -164,7 +163,7 @@ public:
305 	std::list<Hy3TabGroup> tab_groups;
306 
307 private:
308-	Hy3Node* getNodeFromWindow(const PHLWINDOW&);
309+	Hy3Node* getNodeFromWindow(const CWindow*);
310 	void applyNodeDataToWindow(Hy3Node*, bool no_animation = false);
311 
312 	// if shift is true, shift the window in the given direction, returning
313@@ -173,7 +172,7 @@ private:
314 	Hy3Node* shiftOrGetFocus(Hy3Node&, ShiftDirection, bool shift, bool once, bool visible);
315 
316 	void updateAutotileWorkspaces();
317-	bool shouldAutotileWorkspace(const PHLWORKSPACE& workspace);
318+	bool shouldAutotileWorkspace(const CWorkspace* workspace);
319 	void resizeNode(Hy3Node*, Vector2D, ShiftDirection resize_edge_x, ShiftDirection resize_edge_y);
320 
321 	struct {
322diff --git a/src/Hy3Node.cpp b/src/Hy3Node.cpp
323index bd84350e56e5ccce03a9ed3183237dcd9f738c50..d339853509097440d526ad7ab48690ce056805a7 100644
324--- a/src/Hy3Node.cpp
325+++ b/src/Hy3Node.cpp
326@@ -326,7 +326,7 @@ void Hy3Node::recalcSizePosRecursive(bool no_animation) {
327 
328 	if (this->data.is_window() && this->data.as_window()->isFullscreen()) {
329 		auto window = this->data.as_window();
330-		auto monitor = this->workspace->m_pMonitor.lock();
331+		auto& monitor = this->workspace->m_pMonitor;
332 
333 		if (window->isEffectiveInternalFSMode(FSMODE_FULLSCREEN)) {
334 			*window->m_vRealPosition = monitor->vecPosition;
335diff --git a/src/SelectionHook.cpp b/src/SelectionHook.cpp
336index 3800e2c8edf23fb5f2fdf409780d677c78f10338..776effec76e385a0fab32adbe551007fb75cec8f 100644
337--- a/src/SelectionHook.cpp
338+++ b/src/SelectionHook.cpp
339@@ -7,7 +7,7 @@ namespace selection_hook {
340 inline CFunctionHook* g_LastSelectionHook = nullptr;
341 
342 void hook_updateDecos(void* thisptr, PHLWINDOW window) {
343-	bool explicitly_selected = g_Hy3Layout->shouldRenderSelected(window);
344+	bool explicitly_selected = g_Hy3Layout->shouldRenderSelected(window.get());
345 
346 	auto lastWindow = g_pCompositor->m_pLastWindow;
347 	if (explicitly_selected) {
348diff --git a/src/TabGroup.cpp b/src/TabGroup.cpp
349index 234cd725f0303d6aaa4f23168f86dfe159c9c9bc..e173ed0f162d4ab6f6e8e16975d8ca050a17c204 100644
350--- a/src/TabGroup.cpp
351+++ b/src/TabGroup.cpp
352@@ -570,7 +570,7 @@ void Hy3TabGroup::tick() {
353 		auto has_fullscreen = this->workspace->m_bHasFullscreenWindow;
354 
355 		if (!has_fullscreen && *no_gaps_when_only) {
356-			auto root_node = g_Hy3Layout->getWorkspaceRootGroup(this->workspace);
357+			auto root_node = g_Hy3Layout->getWorkspaceRootGroup(this->workspace.get());
358 			has_fullscreen = root_node != nullptr && root_node->data.as_group().children.size() == 1
359 			              && root_node->data.as_group().children.front()->data.is_window();
360 		}
361diff --git a/src/dispatchers.cpp b/src/dispatchers.cpp
362index 6d54d304cb42c9ae377166d982293377dd07ed2e..acde155822321431b01153362a528dc46a5e22aa 100644
363--- a/src/dispatchers.cpp
364+++ b/src/dispatchers.cpp
365@@ -22,13 +22,13 @@ void dispatch_makegroup(std::string value) {
366 	}
367 
368 	if (args[0] == "h") {
369-		g_Hy3Layout->makeGroupOnWorkspace(workspace, Hy3GroupLayout::SplitH, ephemeral);
370+		g_Hy3Layout->makeGroupOnWorkspace(workspace.get(), Hy3GroupLayout::SplitH, ephemeral);
371 	} else if (args[0] == "v") {
372-		g_Hy3Layout->makeGroupOnWorkspace(workspace, Hy3GroupLayout::SplitV, ephemeral);
373+		g_Hy3Layout->makeGroupOnWorkspace(workspace.get(), Hy3GroupLayout::SplitV, ephemeral);
374 	} else if (args[0] == "tab") {
375-		g_Hy3Layout->makeGroupOnWorkspace(workspace, Hy3GroupLayout::Tabbed, ephemeral);
376+		g_Hy3Layout->makeGroupOnWorkspace(workspace.get(), Hy3GroupLayout::Tabbed, ephemeral);
377 	} else if (args[0] == "opposite") {
378-		g_Hy3Layout->makeOppositeGroupOnWorkspace(workspace, ephemeral);
379+		g_Hy3Layout->makeOppositeGroupOnWorkspace(workspace.get(), ephemeral);
380 	}
381 }
382 
383@@ -39,17 +39,17 @@ void dispatch_changegroup(std::string value) {
384 	auto args = CVarList(value);
385 
386 	if (args[0] == "h") {
387-		g_Hy3Layout->changeGroupOnWorkspace(workspace, Hy3GroupLayout::SplitH);
388+		g_Hy3Layout->changeGroupOnWorkspace(workspace.get(), Hy3GroupLayout::SplitH);
389 	} else if (args[0] == "v") {
390-		g_Hy3Layout->changeGroupOnWorkspace(workspace, Hy3GroupLayout::SplitV);
391+		g_Hy3Layout->changeGroupOnWorkspace(workspace.get(), Hy3GroupLayout::SplitV);
392 	} else if (args[0] == "tab") {
393-		g_Hy3Layout->changeGroupOnWorkspace(workspace, Hy3GroupLayout::Tabbed);
394+		g_Hy3Layout->changeGroupOnWorkspace(workspace.get(), Hy3GroupLayout::Tabbed);
395 	} else if (args[0] == "untab") {
396-		g_Hy3Layout->untabGroupOnWorkspace(workspace);
397+		g_Hy3Layout->untabGroupOnWorkspace(workspace.get());
398 	} else if (args[0] == "toggletab") {
399-		g_Hy3Layout->toggleTabGroupOnWorkspace(workspace);
400+		g_Hy3Layout->toggleTabGroupOnWorkspace(workspace.get());
401 	} else if (args[0] == "opposite") {
402-		g_Hy3Layout->changeGroupToOppositeOnWorkspace(workspace);
403+		g_Hy3Layout->changeGroupToOppositeOnWorkspace(workspace.get());
404 	}
405 }
406 
407@@ -61,7 +61,7 @@ void dispatch_setephemeral(std::string value) {
408 
409 	bool ephemeral = args[0] == "true";
410 
411-	g_Hy3Layout->changeGroupEphemeralityOnWorkspace(workspace, ephemeral);
412+	g_Hy3Layout->changeGroupEphemeralityOnWorkspace(workspace.get(), ephemeral);
413 }
414 
415 std::optional<ShiftDirection> parseShiftArg(std::string arg) {
416@@ -93,7 +93,7 @@ void dispatch_movewindow(std::string value) {
417 			i++;
418 		}
419 
420-		g_Hy3Layout->shiftWindow(workspace, shift.value(), once, visible);
421+		g_Hy3Layout->shiftWindow(workspace.get(), shift.value(), once, visible);
422 	}
423 }
424 
425@@ -120,14 +120,14 @@ void dispatch_movefocus(std::string value) {
426 	if (args[argi] == "nowarp") warp_cursor = false;
427 	else if (args[argi] == "warp") warp_cursor = true;
428 
429-	g_Hy3Layout->shiftFocus(workspace, shift.value(), visible, warp_cursor);
430+	g_Hy3Layout->shiftFocus(workspace.get(), shift.value(), visible, warp_cursor);
431 }
432 
433 void dispatch_togglefocuslayer(std::string value) {
434 	auto workspace = workspace_for_action();
435 	if (!valid(workspace)) return;
436 
437-	g_Hy3Layout->toggleFocusLayer(workspace, value != "nowarp");
438+	g_Hy3Layout->toggleFocusLayer(workspace.get(), value != "nowarp");
439 }
440 
441 void dispatch_warpcursor(std::string value) { g_Hy3Layout->warpCursor(); }
442@@ -149,19 +149,19 @@ void dispatch_move_to_workspace(std::string value) {
443 	    follow
444 	    && ((!*no_cursor_warps && args[2] != "nowarp") || (*no_cursor_warps && args[2] == "warp"));
445 
446-	g_Hy3Layout->moveNodeToWorkspace(origin_workspace, workspace, follow, warp_cursor);
447+	g_Hy3Layout->moveNodeToWorkspace(origin_workspace.get(), workspace, follow, warp_cursor);
448 }
449 
450 void dispatch_changefocus(std::string arg) {
451 	auto workspace = workspace_for_action();
452 	if (!valid(workspace)) return;
453 
454-	if (arg == "top") g_Hy3Layout->changeFocus(workspace, FocusShift::Top);
455-	else if (arg == "bottom") g_Hy3Layout->changeFocus(workspace, FocusShift::Bottom);
456-	else if (arg == "raise") g_Hy3Layout->changeFocus(workspace, FocusShift::Raise);
457-	else if (arg == "lower") g_Hy3Layout->changeFocus(workspace, FocusShift::Lower);
458-	else if (arg == "tab") g_Hy3Layout->changeFocus(workspace, FocusShift::Tab);
459-	else if (arg == "tabnode") g_Hy3Layout->changeFocus(workspace, FocusShift::TabNode);
460+	if (arg == "top") g_Hy3Layout->changeFocus(workspace.get(), FocusShift::Top);
461+	else if (arg == "bottom") g_Hy3Layout->changeFocus(workspace.get(), FocusShift::Bottom);
462+	else if (arg == "raise") g_Hy3Layout->changeFocus(workspace.get(), FocusShift::Raise);
463+	else if (arg == "lower") g_Hy3Layout->changeFocus(workspace.get(), FocusShift::Lower);
464+	else if (arg == "tab") g_Hy3Layout->changeFocus(workspace.get(), FocusShift::Tab);