fix invalidating the deque in CHyprGroupBarDeco

This commit is contained in:
vaxerski 2022-07-05 17:31:47 +02:00
parent dd422abb33
commit 6f5b8425cb
3 changed files with 17 additions and 12 deletions

View file

@ -77,6 +77,18 @@ wlr_box CWindow::getWindowIdealBoundingBoxIgnoreReserved() {
void CWindow::updateWindowDecos() { void CWindow::updateWindowDecos() {
for (auto& wd : m_dWindowDecorations) for (auto& wd : m_dWindowDecorations)
wd->updateWindow(this); wd->updateWindow(this);
for (auto& wd : m_vDecosToRemove) {
for (auto it = m_dWindowDecorations.begin(); it != m_dWindowDecorations.end(); it++) {
if (it->get() == wd) {
it = m_dWindowDecorations.erase(it);
if (it == m_dWindowDecorations.end())
break;
}
}
}
m_vDecosToRemove.clear();
} }
pid_t CWindow::getPID() { pid_t CWindow::getPID() {

View file

@ -99,6 +99,7 @@ public:
// Window decorations // Window decorations
std::deque<std::unique_ptr<IHyprWindowDecoration>> m_dWindowDecorations; std::deque<std::unique_ptr<IHyprWindowDecoration>> m_dWindowDecorations;
std::vector<IHyprWindowDecoration*> m_vDecosToRemove;
// Special render data, rules, etc // Special render data, rules, etc
SWindowSpecialRenderData m_sSpecialRenderData; SWindowSpecialRenderData m_sSpecialRenderData;

View file

@ -40,13 +40,9 @@ void CHyprGroupBarDecoration::updateWindow(CWindow* pWindow) {
if (g_pLayoutManager->getCurrentLayout()->getLayoutName() != "dwindle") { if (g_pLayoutManager->getCurrentLayout()->getLayoutName() != "dwindle") {
// ???? // ????
for (auto it = pWindow->m_dWindowDecorations.begin(); it != pWindow->m_dWindowDecorations.end(); it++) { m_pWindow->m_vDecosToRemove.push_back(this);
if (it->get() == this) {
pWindow->m_dWindowDecorations.erase(it);
return; return;
} }
}
}
// get the group info // get the group info
SLayoutMessageHeader header; SLayoutMessageHeader header;
@ -58,14 +54,10 @@ void CHyprGroupBarDecoration::updateWindow(CWindow* pWindow) {
if (m_dwGroupMembers.size() == 0) { if (m_dwGroupMembers.size() == 0) {
// remove // remove
for (auto it = pWindow->m_dWindowDecorations.begin(); it != pWindow->m_dWindowDecorations.end(); it++) { m_pWindow->m_vDecosToRemove.push_back(this);
if (it->get() == this) {
pWindow->m_dWindowDecorations.erase(it);
return; return;
} }
} }
}
}
void CHyprGroupBarDecoration::damageEntire() { void CHyprGroupBarDecoration::damageEntire() {
wlr_box dm = {m_vLastWindowPos.x - m_seExtents.topLeft.x, m_vLastWindowPos.y - m_seExtents.topLeft.y, m_vLastWindowSize.x + m_seExtents.topLeft.x + m_seExtents.bottomRight.x, m_seExtents.topLeft.y}; wlr_box dm = {m_vLastWindowPos.x - m_seExtents.topLeft.x, m_vLastWindowPos.y - m_seExtents.topLeft.y, m_vLastWindowSize.x + m_seExtents.topLeft.x + m_seExtents.bottomRight.x, m_seExtents.topLeft.y};