From fcbfd193930dd146b141531a9cf5301d55f26907 Mon Sep 17 00:00:00 2001 From: Cyril Levis Date: Sat, 21 Jan 2023 11:18:55 +0100 Subject: [PATCH] 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/Compositor.cpp | 9 ++++++++ src/Compositor.hpp | 1 + src/managers/KeybindManager.cpp | 38 +++++++++++++++++++++++++++++++++ src/managers/KeybindManager.hpp | 1 + 4 files changed, 49 insertions(+) diff --git a/src/Compositor.cpp b/src/Compositor.cpp index f5918192..baf8b030 100644 --- a/src/Compositor.cpp +++ b/src/Compositor.cpp @@ -1084,6 +1084,15 @@ int CCompositor::getWindowsOnWorkspace(const int& id) { return no; } +CWindow* CCompositor::getUrgentWindow() { + for (auto& w : m_vWindows) { + if (w->m_bIsMapped && w->m_bIsUrgent) + return w.get(); + } + + return nullptr; +} + bool CCompositor::hasUrgentWindowOnWorkspace(const int& id) { for (auto& w : m_vWindows) { if (w->m_iWorkspaceID == id && w->m_bIsMapped && w->m_bIsUrgent) diff --git a/src/Compositor.hpp b/src/Compositor.hpp index 7bcd6cf4..0d9dba67 100644 --- a/src/Compositor.hpp +++ b/src/Compositor.hpp @@ -137,6 +137,7 @@ class CCompositor { void sanityCheckWorkspaces(); void updateWorkspaceWindowDecos(const int&); int getWindowsOnWorkspace(const int&); + CWindow* getUrgentWindow(); bool hasUrgentWindowOnWorkspace(const int&); CWindow* getFirstWindowOnWorkspace(const int&); CWindow* getFullscreenWindowOnWorkspace(const int&); 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]; diff --git a/src/managers/KeybindManager.hpp b/src/managers/KeybindManager.hpp index b29b48b0..689426f2 100644 --- a/src/managers/KeybindManager.hpp +++ b/src/managers/KeybindManager.hpp @@ -97,6 +97,7 @@ class CKeybindManager { static void moveActiveToWorkspace(std::string); static void moveActiveToWorkspaceSilent(std::string); static void moveFocusTo(std::string); + static void focusUrgentOrLast(std::string); static void centerWindow(std::string); static void moveActiveTo(std::string); static void toggleGroup(std::string);