master: better cycle

This commit is contained in:
vaxerski 2023-03-13 01:07:05 +00:00
parent bcd8fe9573
commit 17deeb07ad

View file

@ -752,67 +752,20 @@ CWindow* CHyprMasterLayout::getNextWindow(CWindow* pWindow, bool next) {
const auto PNODE = getNodeFromWindow(pWindow); const auto PNODE = getNodeFromWindow(pWindow);
if (next) { auto nodes = m_lMasterNodesData;
if (PNODE->isMaster) { if (!next)
// focus the first non master std::reverse(nodes.begin(), nodes.end());
for (auto n : m_lMasterNodesData) {
if (n.pWindow != pWindow && n.workspaceID == pWindow->m_iWorkspaceID) {
return n.pWindow;
}
}
} else {
// focus next
bool reached = false;
bool found = false;
for (auto n : m_lMasterNodesData) {
if (n.pWindow == pWindow) {
reached = true;
continue;
}
if (n.workspaceID == pWindow->m_iWorkspaceID && reached) { const auto NODEIT = std::find(nodes.begin(), nodes.end(), *PNODE);
return n.pWindow;
}
}
if (!found) {
const auto PMASTER = getMasterNodeOnWorkspace(pWindow->m_iWorkspaceID);
if (PMASTER) const bool ISMASTER = PNODE->isMaster;
return PMASTER->pWindow;
}
}
} else {
if (PNODE->isMaster) {
// focus the last non master
for (auto& nd : m_lMasterNodesData | std::views::reverse) {
if (nd.pWindow != pWindow && nd.workspaceID == pWindow->m_iWorkspaceID) {
return nd.pWindow;
}
}
} else {
// focus previous
bool reached = false;
bool found = false;
for (auto& nd : m_lMasterNodesData | std::views::reverse) {
if (nd.pWindow == pWindow) {
reached = true;
continue;
}
if (nd.workspaceID == pWindow->m_iWorkspaceID && reached) { auto CANDIDATE = std::find_if(NODEIT, nodes.end(), [&](const auto& other) { return other != *PNODE && ISMASTER == other.isMaster && other.workspaceID == PNODE->workspaceID; });
return nd.pWindow; if (CANDIDATE == nodes.end())
} CANDIDATE =
} std::find_if(nodes.begin(), nodes.end(), [&](const auto& other) { return other != *PNODE && ISMASTER != other.isMaster && other.workspaceID == PNODE->workspaceID; });
if (!found) {
const auto PMASTER = getMasterNodeOnWorkspace(pWindow->m_iWorkspaceID);
if (PMASTER) return CANDIDATE == nodes.end() ? nullptr : CANDIDATE->pWindow;
return PMASTER->pWindow;
}
}
}
return nullptr;
} }
bool CHyprMasterLayout::prepareLoseFocus(CWindow* pWindow) { bool CHyprMasterLayout::prepareLoseFocus(CWindow* pWindow) {