mirror of
https://github.com/hyprwm/Hyprland
synced 2025-01-03 18:29:49 +01:00
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>
This commit is contained in:
parent
9977a8bfd4
commit
cb59763d32
3 changed files with 37 additions and 2 deletions
|
@ -1198,6 +1198,26 @@ CWindow* CCompositor::getFirstWindowOnWorkspace(const int& id) {
|
||||||
return nullptr;
|
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) {
|
bool CCompositor::doesSeatAcceptInput(wlr_surface* surface) {
|
||||||
if (g_pSessionLockManager->isSessionLocked()) {
|
if (g_pSessionLockManager->isSessionLocked()) {
|
||||||
if (g_pSessionLockManager->isSurfaceSessionLock(surface))
|
if (g_pSessionLockManager->isSurfaceSessionLock(surface))
|
||||||
|
|
|
@ -158,6 +158,7 @@ class CCompositor {
|
||||||
CWindow* getUrgentWindow();
|
CWindow* getUrgentWindow();
|
||||||
bool hasUrgentWindowOnWorkspace(const int&);
|
bool hasUrgentWindowOnWorkspace(const int&);
|
||||||
CWindow* getFirstWindowOnWorkspace(const int&);
|
CWindow* getFirstWindowOnWorkspace(const int&);
|
||||||
|
CWindow* getTopLeftWindowOnWorkspace(const int&);
|
||||||
CWindow* getFullscreenWindowOnWorkspace(const int&);
|
CWindow* getFullscreenWindowOnWorkspace(const int&);
|
||||||
bool doesSeatAcceptInput(wlr_surface*);
|
bool doesSeatAcceptInput(wlr_surface*);
|
||||||
bool isWindowActive(CWindow*);
|
bool isWindowActive(CWindow*);
|
||||||
|
|
|
@ -551,13 +551,27 @@ void CMonitor::changeWorkspace(CWorkspace* const pWorkspace, bool internal) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static auto* const PFOLLOWMOUSE = &g_pConfigManager->getConfigValuePtr("input:follow_mouse")->intValue;
|
||||||
|
|
||||||
if (const auto PLASTWINDOW = pWorkspace->getLastFocusedWindow(); PLASTWINDOW)
|
if (const auto PLASTWINDOW = pWorkspace->getLastFocusedWindow(); PLASTWINDOW)
|
||||||
g_pCompositor->focusWindow(PLASTWINDOW);
|
g_pCompositor->focusWindow(PLASTWINDOW);
|
||||||
else {
|
else {
|
||||||
g_pCompositor->focusWindow(nullptr);
|
CWindow* pWindow = nullptr;
|
||||||
g_pInputManager->simulateMouseMovement();
|
|
||||||
|
if (*PFOLLOWMOUSE == 1)
|
||||||
|
pWindow = g_pCompositor->vectorToWindowIdeal(g_pInputManager->getMouseCoordsInternal());
|
||||||
|
|
||||||
|
if (!pWindow)
|
||||||
|
pWindow = g_pCompositor->getTopLeftWindowOnWorkspace(pWorkspace->m_iID);
|
||||||
|
|
||||||
|
if (!pWindow)
|
||||||
|
pWindow = g_pCompositor->getFirstWindowOnWorkspace(pWorkspace->m_iID);
|
||||||
|
|
||||||
|
g_pCompositor->focusWindow(pWindow);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
g_pInputManager->simulateMouseMovement();
|
||||||
|
|
||||||
g_pLayoutManager->getCurrentLayout()->recalculateMonitor(ID);
|
g_pLayoutManager->getCurrentLayout()->recalculateMonitor(ID);
|
||||||
|
|
||||||
// set some flags and fire event
|
// set some flags and fire event
|
||||||
|
|
Loading…
Reference in a new issue