diff --git a/src/desktop/Window.cpp b/src/desktop/Window.cpp index fbf632439..8671c0036 100644 --- a/src/desktop/Window.cpp +++ b/src/desktop/Window.cpp @@ -1927,13 +1927,18 @@ SP CWindow::getSolitaryResource() { if (res->m_subsurfaces.size() == 0) return res; - if (res->m_subsurfaces.size() == 1) { - if (res->m_subsurfaces[0].expired() || res->m_subsurfaces[0]->m_surface.expired()) - return nullptr; - auto surf = res->m_subsurfaces[0]->m_surface.lock(); - if (!surf || surf->m_subsurfaces.size() != 0 || surf->extends() != res->extends() || !surf->m_current.texture || !surf->m_current.texture->m_opaque) - return nullptr; - return surf; + if (res->m_subsurfaces.size() >= 1) { + if (!res->hasVisibleSubsurface()) + return res; + + if (res->m_subsurfaces.size() == 1) { + if (res->m_subsurfaces[0].expired() || res->m_subsurfaces[0]->m_surface.expired()) + return nullptr; + auto surf = res->m_subsurfaces[0]->m_surface.lock(); + if (!surf || surf->m_subsurfaces.size() != 0 || surf->extends() != res->extends() || !surf->m_current.texture || !surf->m_current.texture->m_opaque) + return nullptr; + return surf; + } } return nullptr; diff --git a/src/protocols/core/Compositor.cpp b/src/protocols/core/Compositor.cpp index 06a4587fc..ed36b1f98 100644 --- a/src/protocols/core/Compositor.cpp +++ b/src/protocols/core/Compositor.cpp @@ -602,6 +602,19 @@ void CWLSurfaceResource::sortSubsurfaces() { } } +bool CWLSurfaceResource::hasVisibleSubsurface() { + for (auto const& subsurface : m_subsurfaces) { + if (!subsurface || !subsurface->m_surface) + continue; + + const auto& surf = subsurface->m_surface; + if (surf->m_current.size.x > 0 && surf->m_current.size.y > 0) + return true; + } + + return false; +} + void CWLSurfaceResource::updateCursorShm(CRegion damage) { if (damage.empty()) return; diff --git a/src/protocols/core/Compositor.hpp b/src/protocols/core/Compositor.hpp index c024a3eba..0dc03cf47 100644 --- a/src/protocols/core/Compositor.hpp +++ b/src/protocols/core/Compositor.hpp @@ -128,6 +128,7 @@ class CWLSurfaceResource { void commitState(SSurfaceState& state); NColorManagement::SImageDescription getPreferredImageDescription(); void sortSubsurfaces(); + bool hasVisibleSubsurface(); // returns a pair: found surface (null if not found) and surface local coords. // localCoords param is relative to 0,0 of this surface