diff options
| author | memchr <118117622+memchr@users.noreply.github.com> | 2023-08-21 18:54:02 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-08-21 20:54:02 +0200 |
| commit | cb59763d32b5ac9824ed921d225c376cd1f98df6 (patch) | |
| tree | a3082b700b3bd8ffab208fc453b206a57d89f06d /src/Compositor.cpp | |
| parent | 9977a8bfd4f5fcf932880b72f1271546c401f783 (diff) | |
fix: improved focus behaviour on workspace switching for follow_mouse!=1 (#3041)
* fix: improved focus behaviour on workspace switching for follow_mouse!=1
When the 'input:follow_mouse' is not set to 1 and the target workspace
for switching does not currently have the previously focused window,
Hyprland will prioritize focusing on the top-left-most window.
* fix: #2451 call simulateMouseMovement.
* unify logic
* multimon fix
---------
Co-authored-by: vaxerski <43317083+vaxerski@users.noreply.github.com>
Diffstat (limited to 'src/Compositor.cpp')
| -rw-r--r-- | src/Compositor.cpp | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/src/Compositor.cpp b/src/Compositor.cpp index a6370de3..44d7c89e 100644 --- a/src/Compositor.cpp +++ b/src/Compositor.cpp @@ -1198,6 +1198,26 @@ CWindow* CCompositor::getFirstWindowOnWorkspace(const int& id) { return nullptr; } +CWindow* CCompositor::getTopLeftWindowOnWorkspace(const int& id) { + const auto PWORKSPACE = getWorkspaceByID(id); + + if (!PWORKSPACE) + return nullptr; + + const auto PMONITOR = getMonitorFromID(PWORKSPACE->m_iMonitorID); + + for (auto& w : m_vWindows) { + if (w->m_iWorkspaceID != id || !w->m_bIsMapped || w->isHidden()) + continue; + + const auto WINDOWIDEALBB = w->getWindowIdealBoundingBoxIgnoreReserved(); + + if (WINDOWIDEALBB.x <= PMONITOR->vecPosition.x + 1 && WINDOWIDEALBB.y <= PMONITOR->vecPosition.y + 1) + return w.get(); + } + return nullptr; +} + bool CCompositor::doesSeatAcceptInput(wlr_surface* surface) { if (g_pSessionLockManager->isSessionLocked()) { if (g_pSessionLockManager->isSurfaceSessionLock(surface)) |
