summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorfazzi <18248986+fxzzi@users.noreply.github.com>2026-05-04 17:00:56 +0100
committerGitHub <noreply@github.com>2026-05-04 17:00:56 +0100
commiteff3bfe261e90b8950b59379ca7815f735a7aab6 (patch)
tree5d4bef57fdd9130c47fbd6a24772bbbd321d61c0 /src
parent2824ffdda04d8471cd8a4ff30641ea06e4d80cf5 (diff)
windows/focus: add fallbacks when focussing workspaces (#14270)
Diffstat (limited to 'src')
-rw-r--r--src/config/shared/actions/ConfigActions.cpp12
-rw-r--r--src/desktop/Workspace.cpp12
-rw-r--r--src/desktop/Workspace.hpp1
-rw-r--r--src/desktop/state/FocusState.cpp8
-rw-r--r--src/helpers/Monitor.cpp5
-rw-r--r--src/managers/input/InputManager.cpp3
6 files changed, 29 insertions, 12 deletions
diff --git a/src/config/shared/actions/ConfigActions.cpp b/src/config/shared/actions/ConfigActions.cpp
index 7111afd8..56fb88e9 100644
--- a/src/config/shared/actions/ConfigActions.cpp
+++ b/src/config/shared/actions/ConfigActions.cpp
@@ -94,7 +94,7 @@ static bool tryMoveFocusToMonitor(PHLMONITOR monitor) {
const auto PNEWMAINWORKSPACE = monitor->m_activeWorkspace;
const auto PNEWWORKSPACE = monitor->m_activeSpecialWorkspace ? monitor->m_activeSpecialWorkspace : PNEWMAINWORKSPACE;
- const auto PNEWWINDOW = PNEWWORKSPACE->getLastFocusedWindow();
+ auto PNEWWINDOW = PNEWWORKSPACE->getFocusCandidate();
if (PNEWWINDOW) {
updateRelativeCursorCoords();
@@ -931,11 +931,13 @@ ActionResult Actions::changeWorkspace(PHLWORKSPACE ws) {
PMONITORWORKSPACEOWNER->changeWorkspace(ws, false, true);
if (PMONITOR != PMONITORWORKSPACEOWNER) {
- Vector2D middle = PMONITORWORKSPACEOWNER->middle();
- if (const auto PLAST = ws->getLastFocusedWindow(); PLAST) {
- Desktop::focusState()->fullWindowFocus(PLAST, Desktop::FOCUS_REASON_KEYBIND);
+ Vector2D middle = PMONITORWORKSPACEOWNER->middle();
+ auto pWindow = ws->getFocusCandidate();
+
+ if (pWindow) {
+ Desktop::focusState()->fullWindowFocus(pWindow, Desktop::FOCUS_REASON_KEYBIND);
if (*PWORKSPACECENTERON == 1)
- middle = PLAST->middle();
+ middle = pWindow->middle();
}
g_pCompositor->warpCursorTo(middle);
}
diff --git a/src/desktop/Workspace.cpp b/src/desktop/Workspace.cpp
index 60d8d985..23ea0dd7 100644
--- a/src/desktop/Workspace.cpp
+++ b/src/desktop/Workspace.cpp
@@ -83,6 +83,18 @@ PHLWINDOW CWorkspace::getLastFocusedWindow() {
return m_lastFocusedWindow.lock();
}
+PHLWINDOW CWorkspace::getFocusCandidate() {
+ auto pWindow = getLastFocusedWindow();
+
+ if (!pWindow)
+ pWindow = getTopLeftWindow();
+
+ if (!pWindow)
+ pWindow = getFirstWindow();
+
+ return pWindow;
+}
+
std::string CWorkspace::getConfigName() {
if (m_isSpecialWorkspace) {
return m_name;
diff --git a/src/desktop/Workspace.hpp b/src/desktop/Workspace.hpp
index d778324d..1ccf1454 100644
--- a/src/desktop/Workspace.hpp
+++ b/src/desktop/Workspace.hpp
@@ -61,6 +61,7 @@ class CWorkspace {
bool inert();
MONITORID monitorID();
PHLWINDOW getLastFocusedWindow();
+ PHLWINDOW getFocusCandidate();
std::string getConfigName();
bool matchesStaticSelector(const std::string& selector);
void markInert();
diff --git a/src/desktop/state/FocusState.cpp b/src/desktop/state/FocusState.cpp
index 5db4bac5..5dd22f94 100644
--- a/src/desktop/state/FocusState.cpp
+++ b/src/desktop/state/FocusState.cpp
@@ -167,8 +167,12 @@ void CFocusState::rawWindowFocus(PHLWINDOW pWindow, eFocusReason reason, SP<CWLS
return;
}
- const auto PLASTWINDOW = m_focusWindow.lock();
- m_focusWindow = pWindow;
+ if (PMONITOR && !pWindow->m_pinned)
+ rawMonitorFocus(PMONITOR);
+
+ const auto PLASTWINDOW = m_focusWindow.lock();
+ m_focusWindow = pWindow;
+ pWindow->m_workspace->m_lastFocusedWindow = pWindow;
/* If special fallthrough is enabled, this behavior will be disabled, as I have no better idea of nicely tracking which
window focuses are "via keybinds" and which ones aren't. */
diff --git a/src/helpers/Monitor.cpp b/src/helpers/Monitor.cpp
index b2e94a31..c7d4168a 100644
--- a/src/helpers/Monitor.cpp
+++ b/src/helpers/Monitor.cpp
@@ -1406,10 +1406,7 @@ void CMonitor::changeWorkspace(const PHLWORKSPACE& pWorkspace, bool internal, bo
Desktop::View::RESERVED_EXTENTS | Desktop::View::INPUT_EXTENTS | Desktop::View::ALLOW_FLOATING);
if (!pWindow)
- pWindow = pWorkspace->getTopLeftWindow();
-
- if (!pWindow)
- pWindow = pWorkspace->getFirstWindow();
+ pWindow = pWorkspace->getFocusCandidate();
}
Desktop::focusState()->fullWindowFocus(pWindow, Desktop::FOCUS_REASON_KEYBIND);
diff --git a/src/managers/input/InputManager.cpp b/src/managers/input/InputManager.cpp
index b6f38433..65a98181 100644
--- a/src/managers/input/InputManager.cpp
+++ b/src/managers/input/InputManager.cpp
@@ -1694,7 +1694,8 @@ bool CInputManager::refocusLastWindow(PHLMONITOR pMonitor) {
foundSurface = nullptr;
}
- if (!foundSurface && Desktop::focusState()->window() && Desktop::focusState()->window()->m_workspace && Desktop::focusState()->window()->m_workspace->isVisibleNotCovered()) {
+ if (!foundSurface && Desktop::focusState()->window() && Desktop::focusState()->window()->m_monitor == pMonitor && Desktop::focusState()->window()->m_workspace &&
+ Desktop::focusState()->window()->m_workspace->isVisibleNotCovered()) {
// then the last focused window if we're on the same workspace as it
const auto PLASTWINDOW = Desktop::focusState()->window();
Desktop::focusState()->fullWindowFocus(PLASTWINDOW, Desktop::FOCUS_REASON_FFM);