aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/managers/KeybindManager.cpp36
-rw-r--r--src/managers/KeybindManager.hpp1
2 files changed, 37 insertions, 0 deletions
diff --git a/src/managers/KeybindManager.cpp b/src/managers/KeybindManager.cpp
index 58be9ea9..26bc3565 100644
--- a/src/managers/KeybindManager.cpp
+++ b/src/managers/KeybindManager.cpp
@@ -58,6 +58,7 @@ CKeybindManager::CKeybindManager() {
m_mDispatchers["mouse"] = mouse;
m_mDispatchers["bringactivetotop"] = bringActiveToTop;
m_mDispatchers["focusurgentorlast"] = focusUrgentOrLast;
+ m_mDispatchers["focuscurrentorlast"] = focusCurrentOrLast;
m_tScrollTimer.reset();
}
@@ -1148,6 +1149,41 @@ void CKeybindManager::focusUrgentOrLast(std::string args) {
switchToWindow(PWINDOWURGENT ? PWINDOWURGENT : PWINDOWPREV);
}
+void CKeybindManager::focusCurrentOrLast(std::string args) {
+ 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 (!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(PWINDOWPREV);
+}
+
void CKeybindManager::moveActiveTo(std::string args) {
char arg = args[0];
diff --git a/src/managers/KeybindManager.hpp b/src/managers/KeybindManager.hpp
index 689426f2..3ed09cb4 100644
--- a/src/managers/KeybindManager.hpp
+++ b/src/managers/KeybindManager.hpp
@@ -98,6 +98,7 @@ class CKeybindManager {
static void moveActiveToWorkspaceSilent(std::string);
static void moveFocusTo(std::string);
static void focusUrgentOrLast(std::string);
+ static void focusCurrentOrLast(std::string);
static void centerWindow(std::string);
static void moveActiveTo(std::string);
static void toggleGroup(std::string);