From fcbfd193930dd146b141531a9cf5301d55f26907 Mon Sep 17 00:00:00 2001 From: Cyril Levis Date: Sat, 21 Jan 2023 11:18:55 +0100 Subject: feat: add focus to urgent or last window (#1402) * feat: add focus to urgent or last window * Rename dispatcher Co-authored-by: Maxim Baz --- src/managers/KeybindManager.cpp | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) (limited to 'src/managers/KeybindManager.cpp') diff --git a/src/managers/KeybindManager.cpp b/src/managers/KeybindManager.cpp index 1fe4b729..164d9737 100644 --- a/src/managers/KeybindManager.cpp +++ b/src/managers/KeybindManager.cpp @@ -48,6 +48,7 @@ CKeybindManager::CKeybindManager() { m_mDispatchers["pin"] = pinActive; m_mDispatchers["mouse"] = mouse; m_mDispatchers["bringactivetotop"] = bringActiveToTop; + m_mDispatchers["focusurgentorlast"] = focusUrgentOrLast; m_tScrollTimer.reset(); } @@ -1099,6 +1100,43 @@ void CKeybindManager::moveFocusTo(std::string args) { } } +void CKeybindManager::focusUrgentOrLast(std::string args) { + const auto PWINDOWURGENT = g_pCompositor->getUrgentWindow(); + const auto PWINDOWPREV = g_pCompositor->m_pLastWindow + ? (g_pCompositor->m_vWindowFocusHistory.size() < 2 ? nullptr : g_pCompositor->m_vWindowFocusHistory[1]) + : (g_pCompositor->m_vWindowFocusHistory.empty() ? nullptr : g_pCompositor->m_vWindowFocusHistory[0]); + + if (!PWINDOWURGENT && !PWINDOWPREV) + return; + + // remove constraints + g_pInputManager->unconstrainMouse(); + + auto switchToWindow = [&](CWindow* PWINDOWTOCHANGETO) { + if (PWINDOWTOCHANGETO == g_pCompositor->m_pLastWindow || !PWINDOWTOCHANGETO) + return; + + if (g_pCompositor->m_pLastWindow && g_pCompositor->m_pLastWindow->m_iWorkspaceID == PWINDOWTOCHANGETO->m_iWorkspaceID && g_pCompositor->m_pLastWindow->m_bIsFullscreen) { + const auto PWORKSPACE = g_pCompositor->getWorkspaceByID(g_pCompositor->m_pLastWindow->m_iWorkspaceID); + const auto FSMODE = PWORKSPACE->m_efFullscreenMode; + + if (!PWINDOWTOCHANGETO->m_bPinned) + g_pCompositor->setWindowFullscreen(g_pCompositor->m_pLastWindow, false, FULLSCREEN_FULL); + + g_pCompositor->focusWindow(PWINDOWTOCHANGETO); + + if (!PWINDOWTOCHANGETO->m_bPinned) + g_pCompositor->setWindowFullscreen(PWINDOWTOCHANGETO, true, FSMODE); + } else { + g_pCompositor->focusWindow(PWINDOWTOCHANGETO); + Vector2D middle = PWINDOWTOCHANGETO->m_vRealPosition.goalv() + PWINDOWTOCHANGETO->m_vRealSize.goalv() / 2.f; + g_pCompositor->warpCursorTo(middle); + } + }; + + switchToWindow(PWINDOWURGENT ? PWINDOWURGENT : PWINDOWPREV); +} + void CKeybindManager::moveActiveTo(std::string args) { char arg = args[0]; -- cgit v1.2.3