mirror of
https://github.com/hyprwm/Hyprland
synced 2024-12-23 10:29:50 +01:00
layout: Allow the layout to control how windows are raised in groups (#3275)
* Allow the layout to control how windows are raised in groups Previously windows could only be focused if they weren't hidden or were part of a group. This shifts the logic for picking the window out of a group to the layout allowing for alternate group implementations to function normally. * Fix doc comment consistency * Fix tabs in comments
This commit is contained in:
parent
be19773aaa
commit
b0d5e4008b
3 changed files with 26 additions and 7 deletions
|
@ -829,10 +829,7 @@ void CCompositor::focusWindow(CWindow* pWindow, wlr_surface* pSurface) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pWindow && pWindow->isHidden() && pWindow->m_sGroupData.pNextWindow) {
|
g_pLayoutManager->getCurrentLayout()->bringWindowToTop(pWindow);
|
||||||
// grouped, change the current to us
|
|
||||||
pWindow->setGroupCurrent(pWindow);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!pWindow || !windowValidMapped(pWindow)) {
|
if (!pWindow || !windowValidMapped(pWindow)) {
|
||||||
const auto PLASTWINDOW = m_pLastWindow;
|
const auto PLASTWINDOW = m_pLastWindow;
|
||||||
|
@ -2171,7 +2168,7 @@ CWindow* CCompositor::getWindowByRegex(const std::string& regexp) {
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto& w : g_pCompositor->m_vWindows) {
|
for (auto& w : g_pCompositor->m_vWindows) {
|
||||||
if (!w->m_bIsMapped || (w->isHidden() && !w->m_sGroupData.pNextWindow))
|
if (!w->m_bIsMapped || (w->isHidden() && !g_pLayoutManager->getCurrentLayout()->isWindowReachable(w.get())))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
|
|
|
@ -535,12 +535,22 @@ CWindow* IHyprLayout::getNextWindowCandidate(CWindow* pWindow) {
|
||||||
return PWINDOWCANDIDATE;
|
return PWINDOWCANDIDATE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void IHyprLayout::requestFocusForWindow(CWindow* pWindow) {
|
bool IHyprLayout::isWindowReachable(CWindow* pWindow) {
|
||||||
|
return pWindow && (!pWindow->isHidden() || pWindow->m_sGroupData.pNextWindow);
|
||||||
|
}
|
||||||
|
|
||||||
|
void IHyprLayout::bringWindowToTop(CWindow* pWindow) {
|
||||||
|
if (pWindow == nullptr)
|
||||||
|
return;
|
||||||
|
|
||||||
if (pWindow->isHidden() && pWindow->m_sGroupData.pNextWindow) {
|
if (pWindow->isHidden() && pWindow->m_sGroupData.pNextWindow) {
|
||||||
// grouped, change the current to this window
|
// grouped, change the current to this window
|
||||||
pWindow->setGroupCurrent(pWindow);
|
pWindow->setGroupCurrent(pWindow);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void IHyprLayout::requestFocusForWindow(CWindow* pWindow) {
|
||||||
|
bringWindowToTop(pWindow);
|
||||||
g_pCompositor->focusWindow(pWindow);
|
g_pCompositor->focusWindow(pWindow);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -155,10 +155,22 @@ class IHyprLayout {
|
||||||
*/
|
*/
|
||||||
virtual void replaceWindowDataWith(CWindow* from, CWindow* to) = 0;
|
virtual void replaceWindowDataWith(CWindow* from, CWindow* to) = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Determines if a window can be focused. If hidden this usually means the window is part of a group.
|
||||||
|
*/
|
||||||
|
virtual bool isWindowReachable(CWindow*);
|
||||||
|
|
||||||
|
/*
|
||||||
|
Called before an attempt is made to focus a window.
|
||||||
|
Brings the window to the top of any groups and ensures it is not hidden.
|
||||||
|
If the window is unmapped following this call, the focus attempt will fail.
|
||||||
|
*/
|
||||||
|
virtual void bringWindowToTop(CWindow*);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Called via the foreign toplevel activation protocol.
|
Called via the foreign toplevel activation protocol.
|
||||||
Focuses a window, bringing it to the top of its group if applicable.
|
Focuses a window, bringing it to the top of its group if applicable.
|
||||||
May be ignored.
|
May be ignored.
|
||||||
*/
|
*/
|
||||||
virtual void requestFocusForWindow(CWindow*);
|
virtual void requestFocusForWindow(CWindow*);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue