c8c9157dba03158e36cdb869daa9491fe40dcf58

Author
chrisruff <chrisruff@live.ca>
Committer
chrisruff <chrisruff@live.ca>
Date

Message

Fix moving between empty workspaces

Diff

 1diff --git a/src/Hy3Layout.cpp b/src/Hy3Layout.cpp
 2index 729bc7dcd880a7d72092ae4d6d012f188e1b3918..04036c4d1247e2b68773cb8d88ff7666873d6351 100644
 3--- a/src/Hy3Layout.cpp
 4+++ b/src/Hy3Layout.cpp
 5@@ -899,14 +899,11 @@ void Hy3Layout::shiftFocus(
 6 		if (current_window->m_pWorkspace->m_bHasFullscreenWindow) return;
 7 
 8 		if (current_window->m_bIsFloating) {
 9-			auto next_window = g_pCompositor->getWindowInDirection(
10-			    current_window,
11-			    direction == ShiftDirection::Left   ? 'l'
12-			    : direction == ShiftDirection::Up   ? 'u'
13-			    : direction == ShiftDirection::Down ? 'd'
14-			                                        : 'r'
15-			);
16-
17+			auto direction_char = direction == ShiftDirection::Left ? 'l'
18+			                    : direction == ShiftDirection::Up   ? 'u'
19+			                    : direction == ShiftDirection::Down ? 'd'
20+			                                                        : 'r';
21+			auto next_window = g_pCompositor->getWindowInDirection(current_window, direction_char);
22 			if (next_window != nullptr) {
23 				g_pCompositor->focusWindow(next_window);
24 				if (warp) Hy3Layout::warpCursorToBox(next_window->m_vPosition, next_window->m_vSize);
25@@ -916,7 +913,18 @@ void Hy3Layout::shiftFocus(
26 	}
27 
28 	auto* node = this->getWorkspaceFocusedNode(workspace);
29-	if (node == nullptr) return;
30+	if (node == nullptr) {
31+		auto direction_char = direction == ShiftDirection::Left ? 'l'
32+		                    : direction == ShiftDirection::Up   ? 'u'
33+		                    : direction == ShiftDirection::Down ? 'd'
34+		                                                        : 'r';
35+		auto* next_monitor = g_pCompositor->getMonitorInDirection(direction_char);
36+		if (next_monitor) {
37+			g_pCompositor->setActiveMonitor(next_monitor);
38+			g_pCompositor->warpCursorTo(next_monitor->vecPosition + next_monitor->vecSize / 2);
39+		}
40+		return;
41+	}
42 
43 	auto* target = this->shiftOrGetFocus(*node, direction, false, false, visible);
44