summaryrefslogtreecommitdiff
path: root/src/Compositor.cpp
diff options
context:
space:
mode:
authorvaxerski <43317083+vaxerski@users.noreply.github.com>2022-08-25 21:25:28 +0200
committervaxerski <43317083+vaxerski@users.noreply.github.com>2022-08-25 21:25:28 +0200
commite327b0a8354f7c967d2f701162a3138487ecd5ca (patch)
tree20fce4e3ec72ead523a6619d0eb78634034c6d4e /src/Compositor.cpp
parentde477a6ff589479e6ae8773ea5da097d7d0fdce5 (diff)
added a swapactiveworkspaces dispatcher
Diffstat (limited to 'src/Compositor.cpp')
-rw-r--r--src/Compositor.cpp82
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.