diff --git a/src/helpers/MiscFunctions.cpp b/src/helpers/MiscFunctions.cpp index 4855553a..7382d24c 100644 --- a/src/helpers/MiscFunctions.cpp +++ b/src/helpers/MiscFunctions.cpp @@ -284,16 +284,24 @@ int getWorkspaceIDFromString(const std::string& in, std::string& outName) { } else if (in.starts_with("empty")) { const bool same_mon = in.substr(5).contains("m"); const bool next = in.substr(5).contains("n"); - if (same_mon || next) { - if (!g_pCompositor->m_pLastMonitor) { - Debug::log(ERR, "Empty monitor workspace on monitor null!"); - return WORKSPACE_INVALID; + if ((same_mon || next) && !g_pCompositor->m_pLastMonitor) { + Debug::log(ERR, "Empty monitor workspace on monitor null!"); + return WORKSPACE_INVALID; + } + + std::set invalidWSes; + if (same_mon) { + for (auto& rule : g_pConfigManager->getAllWorkspaceRules()) { + const auto PMONITOR = g_pCompositor->getMonitorFromName(rule.monitor); + if (PMONITOR && (PMONITOR->ID != g_pCompositor->m_pLastMonitor->ID)) + invalidWSes.insert(rule.workspaceId); } } + int id = next ? g_pCompositor->m_pLastMonitor->activeWorkspaceID() : 0; while (++id < INT_MAX) { const auto PWORKSPACE = g_pCompositor->getWorkspaceByID(id); - if (!PWORKSPACE || (g_pCompositor->getWindowsOnWorkspace(id) == 0 && (!same_mon || PWORKSPACE->m_iMonitorID == g_pCompositor->m_pLastMonitor->ID))) + if (!invalidWSes.contains(id) && (!PWORKSPACE || g_pCompositor->getWindowsOnWorkspace(id) == 0)) return id; } } else if (in.starts_with("prev")) {