summaryrefslogtreecommitdiff
path: root/src/helpers/MiscFunctions.cpp
diff options
context:
space:
mode:
authorvaxerski <43317083+vaxerski@users.noreply.github.com>2022-12-08 12:08:41 +0000
committervaxerski <43317083+vaxerski@users.noreply.github.com>2022-12-08 12:08:41 +0000
commit0803febac521ae07394eb10a628b9507118335eb (patch)
tree3805af4c0b8f13bd8f8abf973a9a7f755ff29004 /src/helpers/MiscFunctions.cpp
parent6259202c0182fe3e7e36ab5b3010db567738375a (diff)
optimize m+- and e+- workspace opts
Diffstat (limited to 'src/helpers/MiscFunctions.cpp')
-rw-r--r--src/helpers/MiscFunctions.cpp70
1 files changed, 29 insertions, 41 deletions
diff --git a/src/helpers/MiscFunctions.cpp b/src/helpers/MiscFunctions.cpp
index 5f2aae6a..9bd94a7c 100644
--- a/src/helpers/MiscFunctions.cpp
+++ b/src/helpers/MiscFunctions.cpp
@@ -277,51 +277,39 @@ int getWorkspaceIDFromString(const std::string& in, std::string& outName) {
// result now has +/- what we should move on mon
int remains = (int)result;
- int currentID = g_pCompositor->m_pLastMonitor->activeWorkspace;
- int searchID = currentID;
-
- while (remains != 0) {
- if (remains < 0)
- searchID--;
- else
- searchID++;
-
- if (g_pCompositor->workspaceIDOutOfBounds(searchID)){
- // means we need to wrap around
- int lowestID = 99999;
- int highestID = -99999;
-
- for (auto& w : g_pCompositor->m_vWorkspaces) {
- if (g_pCompositor->isWorkspaceSpecial(w->m_iID))
- continue;
-
- if (w->m_iID < lowestID)
- lowestID = w->m_iID;
-
- if (w->m_iID > highestID)
- highestID = w->m_iID;
- }
-
- if (remains < 0)
- searchID = highestID;
- else
- searchID = lowestID;
- }
+
+ std::vector<int> validWSes;
+ for (auto& ws : g_pCompositor->m_vWorkspaces) {
+ if (ws->m_bIsSpecialWorkspace || (ws->m_iMonitorID != g_pCompositor->m_pLastMonitor->ID && !onAllMonitors))
+ continue;
+
+ validWSes.push_back(ws->m_iID);
+ }
- if (const auto PWORKSPACE = g_pCompositor->getWorkspaceByID(searchID); PWORKSPACE && !PWORKSPACE->m_bIsSpecialWorkspace) {
- if (onAllMonitors || PWORKSPACE->m_iMonitorID == g_pCompositor->m_pLastMonitor->ID) {
- currentID = PWORKSPACE->m_iID;
+ // get the offset
+ remains = remains < 0 ? -((-remains) % validWSes.size()) : remains % validWSes.size();
- if (remains < 0)
- remains++;
- else
- remains--;
- }
+ // get the current item
+ int currentItem = -1;
+ for (size_t i = 0; i < validWSes.size(); i++) {
+ if (validWSes[i] == g_pCompositor->m_pLastMonitor->activeWorkspace) {
+ currentItem = i;
+ break;
}
}
- result = currentID;
- outName = g_pCompositor->getWorkspaceByID(currentID)->m_szName;
+ // apply
+ currentItem += remains;
+
+ // sanitize
+ if (currentItem >= (int)validWSes.size()) {
+ currentItem = currentItem % validWSes.size();
+ } else if (currentItem < 0) {
+ currentItem = validWSes.size() + currentItem;
+ }
+
+ result = validWSes[currentItem];
+ outName = g_pCompositor->getWorkspaceByID(validWSes[currentItem])->m_szName;
} else {
if (in[0] == '+' || in[0] == '-') {
@@ -503,4 +491,4 @@ int64_t configStringToInt(const std::string& VALUE) {
return 0;
}
return stol(VALUE);
-}
+} \ No newline at end of file