diff --git a/src/managers/KeybindManager.cpp b/src/managers/KeybindManager.cpp index 29e0c12de77..f16f680ab9d 100644 --- a/src/managers/KeybindManager.cpp +++ b/src/managers/KeybindManager.cpp @@ -807,8 +807,7 @@ void CKeybindManager::changeworkspace(std::string args) { const auto PMONITOR = g_pCompositor->m_pLastMonitor; const auto PCURRENTWORKSPACE = g_pCompositor->getWorkspaceByID(PMONITOR->activeWorkspace); - - const bool EXPLICITPREVIOUS = args.find("previous") == 0; + const bool EXPLICITPREVIOUS = args.find("previous") == 0; if (args.find("previous") == 0) { // Do nothing if there's no previous workspace, otherwise switch to it. @@ -833,57 +832,20 @@ void CKeybindManager::changeworkspace(std::string args) { return; } - g_pInputManager->unconstrainMouse(); - g_pInputManager->m_bEmptyFocusCursorSet = false; - - if (workspaceToChangeTo == PCURRENTWORKSPACE->m_iID) { - if ((!*PBACKANDFORTH && !EXPLICITPREVIOUS) || PCURRENTWORKSPACE->m_sPrevWorkspace.iID == -1) - return; - - auto pWorkspaceToChangeTo = g_pCompositor->getWorkspaceByID(PCURRENTWORKSPACE->m_sPrevWorkspace.iID); - - g_pInputManager->releaseAllMouseButtons(); - - if (pWorkspaceToChangeTo) { - const auto PMONITORWORKSPACEOWNER = PMONITOR->ID == pWorkspaceToChangeTo->m_iMonitorID ? PMONITOR : g_pCompositor->getMonitorFromID(pWorkspaceToChangeTo->m_iMonitorID); - - if (!PMONITORWORKSPACEOWNER) - return; - - g_pCompositor->setActiveMonitor(PMONITORWORKSPACEOWNER); - - const auto PREVWSDATA = pWorkspaceToChangeTo->m_sPrevWorkspace; - - PMONITORWORKSPACEOWNER->changeWorkspace(pWorkspaceToChangeTo); - - if (PMONITOR != PMONITORWORKSPACEOWNER) { - g_pCompositor->warpCursorTo(PMONITORWORKSPACEOWNER->vecPosition + PMONITORWORKSPACEOWNER->vecSize / 2.f); - g_pCompositor->setActiveMonitor(PMONITORWORKSPACEOWNER); - if (const auto PLASTWINDOW = pWorkspaceToChangeTo->getLastFocusedWindow(); PLASTWINDOW) - g_pCompositor->focusWindow(PLASTWINDOW); - else if (const auto PFIRSTWINDOW = g_pCompositor->getFirstWindowOnWorkspace(pWorkspaceToChangeTo->m_iID); PFIRSTWINDOW) - g_pCompositor->focusWindow(PFIRSTWINDOW); - else - g_pCompositor->focusWindow(nullptr); - } - } else { - pWorkspaceToChangeTo = g_pCompositor->createNewWorkspace(PCURRENTWORKSPACE->m_sPrevWorkspace.iID, PMONITOR->ID, PCURRENTWORKSPACE->m_sPrevWorkspace.name); - PMONITOR->changeWorkspace(pWorkspaceToChangeTo); - } - - if (*PALLOWWORKSPACECYCLES) - pWorkspaceToChangeTo->m_sPrevWorkspace = {PCURRENTWORKSPACE->m_iID, PCURRENTWORKSPACE->m_szName}; - else if (!EXPLICITPREVIOUS) - pWorkspaceToChangeTo->m_sPrevWorkspace = {-1, ""}; + const bool BISWORKSPACECURRENT = workspaceToChangeTo == PCURRENTWORKSPACE->m_iID; + if (BISWORKSPACECURRENT && (!(*PBACKANDFORTH || EXPLICITPREVIOUS) || PCURRENTWORKSPACE->m_sPrevWorkspace.iID == -1)) return; - } - auto pWorkspaceToChangeTo = g_pCompositor->getWorkspaceByID(workspaceToChangeTo); + g_pInputManager->unconstrainMouse(); + g_pInputManager->m_bEmptyFocusCursorSet = false; + + auto pWorkspaceToChangeTo = g_pCompositor->getWorkspaceByID(BISWORKSPACECURRENT ? PCURRENTWORKSPACE->m_sPrevWorkspace.iID : workspaceToChangeTo); if (!pWorkspaceToChangeTo) - pWorkspaceToChangeTo = g_pCompositor->createNewWorkspace(workspaceToChangeTo, PMONITOR->ID, workspaceName); + pWorkspaceToChangeTo = g_pCompositor->createNewWorkspace(BISWORKSPACECURRENT ? PCURRENTWORKSPACE->m_sPrevWorkspace.iID : workspaceToChangeTo, PMONITOR->ID, + BISWORKSPACECURRENT ? PCURRENTWORKSPACE->m_sPrevWorkspace.name : workspaceName); - if (pWorkspaceToChangeTo->m_bIsSpecialWorkspace) { + if (!BISWORKSPACECURRENT && pWorkspaceToChangeTo->m_bIsSpecialWorkspace) { PMONITOR->setSpecialWorkspace(pWorkspaceToChangeTo); g_pInputManager->simulateMouseMovement(); return; @@ -893,13 +855,15 @@ void CKeybindManager::changeworkspace(std::string args) { const auto PMONITORWORKSPACEOWNER = PMONITOR->ID == pWorkspaceToChangeTo->m_iMonitorID ? PMONITOR : g_pCompositor->getMonitorFromID(pWorkspaceToChangeTo->m_iMonitorID); + if (!PMONITORWORKSPACEOWNER) + return; + g_pCompositor->setActiveMonitor(PMONITORWORKSPACEOWNER); PMONITORWORKSPACEOWNER->changeWorkspace(pWorkspaceToChangeTo); if (PMONITOR != PMONITORWORKSPACEOWNER) { g_pCompositor->warpCursorTo(PMONITORWORKSPACEOWNER->vecPosition + PMONITORWORKSPACEOWNER->vecSize / 2.f); - if (const auto PLASTWINDOW = pWorkspaceToChangeTo->getLastFocusedWindow(); PLASTWINDOW) g_pCompositor->focusWindow(PLASTWINDOW); else if (const auto PFIRSTWINDOW = g_pCompositor->getFirstWindowOnWorkspace(pWorkspaceToChangeTo->m_iID); PFIRSTWINDOW) @@ -908,6 +872,13 @@ void CKeybindManager::changeworkspace(std::string args) { g_pCompositor->focusWindow(nullptr); } + if (BISWORKSPACECURRENT) { + if (*PALLOWWORKSPACECYCLES) + pWorkspaceToChangeTo->m_sPrevWorkspace = {PCURRENTWORKSPACE->m_iID, PCURRENTWORKSPACE->m_szName}; + else if (!EXPLICITPREVIOUS) + pWorkspaceToChangeTo->m_sPrevWorkspace = {-1, ""}; + return; + } pWorkspaceToChangeTo->m_sPrevWorkspace = {PCURRENTWORKSPACE->m_iID, PCURRENTWORKSPACE->m_szName}; g_pInputManager->simulateMouseMovement();