diff options
| author | vaxerski <43317083+vaxerski@users.noreply.github.com> | 2022-11-10 12:22:19 +0000 |
|---|---|---|
| committer | vaxerski <43317083+vaxerski@users.noreply.github.com> | 2022-11-10 12:22:19 +0000 |
| commit | 9a9ecc25db21c2797c691ee90624e81b3c1f897c (patch) | |
| tree | 3bb21b1e48c032360163e46c546299672844edc7 /src/Compositor.cpp | |
| parent | 34b145ee65d1c851e42a38a63ef389e345577cb5 (diff) | |
added monitor cycling
Diffstat (limited to 'src/Compositor.cpp')
| -rw-r--r-- | src/Compositor.cpp | 35 |
1 files changed, 34 insertions, 1 deletions
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 { |
