From 0d45b277d6c750377b336034b8adc53eae238d91 Mon Sep 17 00:00:00 2001 From: UjinT34 <41110182+UjinT34@users.noreply.github.com> Date: Fri, 22 Aug 2025 20:24:25 +0300 Subject: internal: Solitary clients with single subsurface & verbose solitary/tearing/DS checks (#11228) Adds more verbose checks for various conditional rendering mechanisms --- src/desktop/Window.cpp | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) (limited to 'src/desktop/Window.cpp') diff --git a/src/desktop/Window.cpp b/src/desktop/Window.cpp index c7fd6b0b..f9857438 100644 --- a/src/desktop/Window.cpp +++ b/src/desktop/Window.cpp @@ -18,6 +18,7 @@ #include "../managers/ANRManager.hpp" #include "../protocols/XDGShell.hpp" #include "../protocols/core/Compositor.hpp" +#include "../protocols/core/Subcompositor.hpp" #include "../protocols/ContentType.hpp" #include "../protocols/FractionalScale.hpp" #include "../xwayland/XWayland.hpp" @@ -1180,7 +1181,8 @@ bool CWindow::opaque() { if (m_isX11 && m_xwaylandSurface && m_xwaylandSurface->m_surface && m_xwaylandSurface->m_surface->m_current.texture) return m_xwaylandSurface->m_surface->m_current.texture->m_opaque; - if (!m_wlSurface->resource() || !m_wlSurface->resource()->m_current.texture) + auto solitaryResource = getSolitaryResource(); + if (!solitaryResource || !solitaryResource->m_current.texture) return false; // TODO: this is wrong @@ -1188,7 +1190,7 @@ bool CWindow::opaque() { if (EXTENTS.w >= m_xdgSurface->m_surface->m_current.bufferSize.x && EXTENTS.h >= m_xdgSurface->m_surface->m_current.bufferSize.y) return true; - return m_wlSurface->resource()->m_current.texture->m_opaque; + return solitaryResource->m_current.texture->m_opaque; } float CWindow::rounding() { @@ -1324,7 +1326,7 @@ void CWindow::onFocusAnimUpdate() { } int CWindow::popupsCount() { - if (m_isX11) + if (m_isX11 || !m_popupHead) return 0; int no = -1; @@ -1870,3 +1872,29 @@ PHLWINDOW CWindow::parent() { bool CWindow::priorityFocus() { return !m_isX11 && CAsyncDialogBox::isPriorityDialogBox(getPID()); } + +SP CWindow::getSolitaryResource() { + if (!m_wlSurface || !m_wlSurface->resource()) + return nullptr; + + auto res = m_wlSurface->resource(); + if (m_isX11) + return res; + + if (popupsCount()) + return nullptr; + + 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; + } + + return nullptr; +} \ No newline at end of file -- cgit v1.2.3