diff options
| author | vaxerski <43317083+vaxerski@users.noreply.github.com> | 2022-05-30 20:05:38 +0200 |
|---|---|---|
| committer | vaxerski <43317083+vaxerski@users.noreply.github.com> | 2022-05-30 20:05:38 +0200 |
| commit | 1f4c938c67dc0eb13963952bb4a061a304b5f246 (patch) | |
| tree | 25ce68edc4e751b832315c4a8d09dc27831a80b9 /src/Compositor.cpp | |
| parent | c44c79abb269da36b68d0524f45aa4c0b92dedca (diff) | |
Added moving workspaces
Diffstat (limited to 'src/Compositor.cpp')
| -rw-r--r-- | src/Compositor.cpp | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/src/Compositor.cpp b/src/Compositor.cpp index 4239c7bf..17d48b0f 100644 --- a/src/Compositor.cpp +++ b/src/Compositor.cpp @@ -622,6 +622,9 @@ void CCompositor::fixXWaylandWindowsOnWorkspace(const int& id) { const auto PWORKSPACE = g_pCompositor->getWorkspaceByID(id); + if (!PWORKSPACE) + return; + for (auto& w : m_lWindows) { if (w.m_iWorkspaceID == id) { @@ -954,3 +957,67 @@ int CCompositor::getNextAvailableMonitorID() { return topID + 1; } + +void CCompositor::moveWorkspaceToMonitor(CWorkspace* pWorkspace, SMonitor* pMonitor) { + + // We trust the workspace and monitor to be correct. + + if (pWorkspace->m_iMonitorID == pMonitor->ID) + return; + + Debug::log(LOG, "moveWorkspaceToMonitor: Moving %d to monitor %d", pWorkspace->m_iID, pMonitor->ID); + + const auto POLDMON = getMonitorFromID(pWorkspace->m_iMonitorID); + + const bool SWITCHINGISACTIVE = POLDMON->activeWorkspace == pWorkspace->m_iID; + + // fix old mon + int nextWorkspaceOnMonitorID = -1; + for (auto& w : m_lWorkspaces) { + if (w.m_iMonitorID == POLDMON->ID && w.m_iID != pWorkspace->m_iID) { + nextWorkspaceOnMonitorID = w.m_iID; + break; + } + } + + if (nextWorkspaceOnMonitorID == -1) { + nextWorkspaceOnMonitorID = 1; + + while (getWorkspaceByID(nextWorkspaceOnMonitorID)) + nextWorkspaceOnMonitorID++; + + Debug::log(LOG, "moveWorkspaceToMonitor: Plugging gap with new %d", nextWorkspaceOnMonitorID); + } + + Debug::log(LOG, "moveWorkspaceToMonitor: Plugging gap with existing %d", nextWorkspaceOnMonitorID); + + g_pKeybindManager->focusMonitor(std::to_string(POLDMON->ID)); + g_pKeybindManager->changeworkspace(std::to_string(nextWorkspaceOnMonitorID)); + + // move the workspace + + pWorkspace->m_iMonitorID = pMonitor->ID; + + for (auto& w : m_lWindows) { + if (w.m_iWorkspaceID == pWorkspace->m_iID) + w.m_iMonitorID = pMonitor->ID; + } + + if (SWITCHINGISACTIVE) { // if it was active, preserve its' status. If it wasn't, don't. + Debug::log(LOG, "moveWorkspaceToMonitor: SWITCHINGISACTIVE, active %d -> %d", pMonitor->activeWorkspace, pWorkspace->m_iID); + + getWorkspaceByID(pMonitor->activeWorkspace)->startAnim(false, false); + + pMonitor->activeWorkspace = pWorkspace->m_iID; + g_pLayoutManager->getCurrentLayout()->recalculateMonitor(pMonitor->ID); + + pWorkspace->startAnim(true, true, true); + + wlr_cursor_warp(m_sWLRCursor, m_sSeat.mouse->mouse, pMonitor->vecPosition.x + pMonitor->vecTransformedSize.x / 2, pMonitor->vecPosition.y + pMonitor->vecTransformedSize.y / 2); + } + + // finalize + g_pLayoutManager->getCurrentLayout()->recalculateMonitor(POLDMON->ID); + + g_pInputManager->refocus(); +}
\ No newline at end of file |
