summaryrefslogtreecommitdiff
path: root/src/Compositor.cpp
diff options
context:
space:
mode:
authorvaxerski <43317083+vaxerski@users.noreply.github.com>2022-11-10 12:22:19 +0000
committervaxerski <43317083+vaxerski@users.noreply.github.com>2022-11-10 12:22:19 +0000
commit9a9ecc25db21c2797c691ee90624e81b3c1f897c (patch)
tree3bb21b1e48c032360163e46c546299672844edc7 /src/Compositor.cpp
parent34b145ee65d1c851e42a38a63ef389e345577cb5 (diff)
added monitor cycling
Diffstat (limited to 'src/Compositor.cpp')
-rw-r--r--src/Compositor.cpp35
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 {