diff options
| author | vaxerski <43317083+vaxerski@users.noreply.github.com> | 2022-08-25 21:25:28 +0200 |
|---|---|---|
| committer | vaxerski <43317083+vaxerski@users.noreply.github.com> | 2022-08-25 21:25:28 +0200 |
| commit | e327b0a8354f7c967d2f701162a3138487ecd5ca (patch) | |
| tree | 20fce4e3ec72ead523a6619d0eb78634034c6d4e /src/Compositor.cpp | |
| parent | de477a6ff589479e6ae8773ea5da097d7d0fdce5 (diff) | |
added a swapactiveworkspaces dispatcher
Diffstat (limited to 'src/Compositor.cpp')
| -rw-r--r-- | src/Compositor.cpp | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/src/Compositor.cpp b/src/Compositor.cpp index c9bd3aad..44ad52b4 100644 --- a/src/Compositor.cpp +++ b/src/Compositor.cpp @@ -1299,6 +1299,88 @@ int CCompositor::getNextAvailableMonitorID() { return topID + 1; } +void CCompositor::swapActiveWorkspaces(CMonitor* pMonitorA, CMonitor* pMonitorB) { + + const auto PWORKSPACEA = g_pCompositor->getWorkspaceByID(pMonitorA->activeWorkspace); + const auto PWORKSPACEB = g_pCompositor->getWorkspaceByID(pMonitorB->activeWorkspace); + + PWORKSPACEA->m_iMonitorID = pMonitorB->ID; + PWORKSPACEA->moveToMonitor(pMonitorB->ID); + + for (auto& w : m_vWindows) { + if (w->m_iWorkspaceID == PWORKSPACEA->m_iID) { + w->m_iMonitorID = pMonitorB->ID; + + // additionally, move floating windows manually + if (w->m_bIsFloating && w->m_bIsMapped && !w->m_bHidden) { + w->m_vRealPosition = w->m_vRealPosition.vec() - pMonitorA->vecPosition + pMonitorB->vecPosition; + } + + w->updateToplevel(); + } + } + + PWORKSPACEB->m_iMonitorID = pMonitorA->ID; + PWORKSPACEB->moveToMonitor(pMonitorA->ID); + + for (auto& w : m_vWindows) { + if (w->m_iWorkspaceID == PWORKSPACEB->m_iID) { + w->m_iMonitorID = pMonitorA->ID; + + // additionally, move floating windows manually + if (w->m_bIsFloating && w->m_bIsMapped && !w->m_bHidden) { + w->m_vRealPosition = w->m_vRealPosition.vec() - pMonitorB->vecPosition + pMonitorA->vecPosition; + } + + w->updateToplevel(); + } + } + + pMonitorA->activeWorkspace = PWORKSPACEB->m_iID; + pMonitorB->activeWorkspace = PWORKSPACEA->m_iID; + + g_pLayoutManager->getCurrentLayout()->recalculateMonitor(pMonitorA->ID); + g_pLayoutManager->getCurrentLayout()->recalculateMonitor(pMonitorB->ID); + + g_pInputManager->refocus(); +} + +CMonitor* CCompositor::getMonitorFromString(const std::string& name) { + if (isNumber(name)) { + // change by ID + int monID = -1; + try { + monID = std::stoi(name); + } catch (std::exception& e) { + // shouldn't happen but jic + Debug::log(ERR, "Error in getMonitorFromString: invalid num"); + return nullptr; + } + + if (monID > -1 && monID < (int)g_pCompositor->m_vMonitors.size()) { + return g_pCompositor->getMonitorFromID(monID); + } else { + Debug::log(ERR, "Error in getMonitorFromString: invalid arg 1"); + return nullptr; + } + } else { + if (isDirection(name)) { + const auto PMONITOR = g_pCompositor->getMonitorInDirection(name[0]); + return PMONITOR; + } else { + for (auto& m : g_pCompositor->m_vMonitors) { + if (m->szName == name) { + return m.get(); + } + } + } + + Debug::log(ERR, "Error in getMonitorFromString: no such monitor"); + } + + return nullptr; +} + void CCompositor::moveWorkspaceToMonitor(CWorkspace* pWorkspace, CMonitor* pMonitor) { // We trust the workspace and monitor to be correct. |
