From 9a9ecc25db21c2797c691ee90624e81b3c1f897c Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Thu, 10 Nov 2022 12:22:19 +0000 Subject: [PATCH] added monitor cycling --- src/Compositor.cpp | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/src/Compositor.cpp b/src/Compositor.cpp index 60779420..4638f3f0 100644 --- a/src/Compositor.cpp +++ b/src/Compositor.cpp @@ -1536,7 +1536,40 @@ void CCompositor::swapActiveWorkspaces(CMonitor* pMonitorA, CMonitor* pMonitorB) } CMonitor* CCompositor::getMonitorFromString(const std::string& name) { - if (isNumber(name)) { + if (name[0] == '+' || name[0] == '-') { + // relative + const auto OFFSET = name[0] == '-' ? name : name.substr(1); + + if (!isNumber(OFFSET)) { + Debug::log(ERR, "Error in getMonitorFromString: Not a number in relative."); + return nullptr; + } + + int offsetLeft = std::stoi(OFFSET) % m_vMonitors.size(); // no need to cycle more + + int currentPlace = 0; + for (int i = 0; i < (int)m_vMonitors.size(); i++) { + if (m_vMonitors[i].get() == m_pLastMonitor) { + currentPlace = i; + break; + } + } + + currentPlace += offsetLeft; + + if (currentPlace < 0) { + currentPlace = m_vMonitors.size() - currentPlace; + } else { + currentPlace = currentPlace % m_vMonitors.size(); + } + + if (currentPlace != std::clamp(currentPlace, 0, (int)m_vMonitors.size())) { + Debug::log(WARN, "Error in getMonitorFromString: Vaxry's code sucks."); + currentPlace = std::clamp(currentPlace, 0, (int)m_vMonitors.size()); + } + + return m_vMonitors[currentPlace].get(); + } else if (isNumber(name)) { // change by ID int monID = -1; try {