summaryrefslogtreecommitdiff
path: root/src/managers/KeybindManager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/managers/KeybindManager.cpp')
-rw-r--r--src/managers/KeybindManager.cpp38
1 files changed, 38 insertions, 0 deletions
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];