diff --git a/src/Compositor.cpp b/src/Compositor.cpp index 20bc82e74fc..8f36b4aece3 100644 --- a/src/Compositor.cpp +++ b/src/Compositor.cpp @@ -1361,6 +1361,10 @@ void CCompositor::addToFadingOutSafe(PHLLS pLS) { m_vSurfacesFadingOut.emplace_back(pLS); } +void CCompositor::removeFromFadingOutSafe(PHLLS ls) { + std::erase(m_vSurfacesFadingOut, ls); +} + void CCompositor::addToFadingOutSafe(PHLWINDOW pWindow) { const auto FOUND = std::find_if(m_vWindowsFadingOut.begin(), m_vWindowsFadingOut.end(), [&](PHLWINDOWREF& other) { return other.lock() == pWindow; }); diff --git a/src/Compositor.hpp b/src/Compositor.hpp index 458e37a7adc..242c3b136e0 100644 --- a/src/Compositor.hpp +++ b/src/Compositor.hpp @@ -156,6 +156,7 @@ class CCompositor { PHLWINDOW getX11Parent(PHLWINDOW); void scheduleFrameForMonitor(CMonitor*); void addToFadingOutSafe(PHLLS); + void removeFromFadingOutSafe(PHLLS); void addToFadingOutSafe(PHLWINDOW); PHLWINDOW getWindowByRegex(const std::string&); void warpCursorTo(const Vector2D&, bool force = false); diff --git a/src/desktop/LayerSurface.cpp b/src/desktop/LayerSurface.cpp index 0b2e23a38f3..2eb664408fc 100644 --- a/src/desktop/LayerSurface.cpp +++ b/src/desktop/LayerSurface.cpp @@ -119,6 +119,10 @@ void CLayerSurface::onMap() { mapped = true; interactivity = layerSurface->current.interactivity; + // this layer might be re-mapped. + fadingOut = false; + g_pCompositor->removeFromFadingOutSafe(self.lock()); + // fix if it changed its mon const auto PMONITOR = g_pCompositor->getMonitorFromID(monitorID); @@ -204,8 +208,6 @@ void CLayerSurface::onUnmap() { const bool WASLASTFOCUS = g_pCompositor->m_pLastFocus == surface->resource(); - surface.reset(); - if (!PMONITOR) return; @@ -221,12 +223,25 @@ void CLayerSurface::onUnmap() { g_pHyprRenderer->damageBox(&geomFixed); g_pInputManager->sendMotionEventsToFocused(); + + g_pHyprRenderer->arrangeLayersForMonitor(PMONITOR->ID); } void CLayerSurface::onCommit() { if (!layerSurface) return; + if (!mapped) { + // we're re-mapping if this is the case + if (layerSurface->surface && !layerSurface->surface->current.buffer) { + fadingOut = false; + geometry = {}; + g_pHyprRenderer->arrangeLayersForMonitor(monitorID); + } + + return; + } + const auto PMONITOR = g_pCompositor->getMonitorFromID(monitorID); if (!PMONITOR)