internal: Solitary clients with single subsurface & verbose solitary/tearing/DS checks (#11228)

Adds more verbose checks for various conditional rendering mechanisms
This commit is contained in:
UjinT34 2025-08-22 20:24:25 +03:00 committed by GitHub
parent e95ba5bf59
commit 0d45b277d6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
15 changed files with 551 additions and 137 deletions

View file

@ -385,6 +385,9 @@ void CPopup::bfHelper(std::vector<WP<CPopup>> const& nodes, std::function<void(W
nodes2.reserve(nodes.size() * 2);
for (auto const& n : nodes) {
if (!n)
continue;
for (auto const& c : n->m_children) {
nodes2.push_back(c->m_self);
}
@ -395,6 +398,9 @@ void CPopup::bfHelper(std::vector<WP<CPopup>> const& nodes, std::function<void(W
}
void CPopup::breadthfirst(std::function<void(WP<CPopup>, void*)> fn, void* data) {
if (!m_self)
return;
std::vector<WP<CPopup>> popups;
popups.push_back(m_self);
bfHelper(popups, fn, data);

View file

@ -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<CWLSurfaceResource> 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;
}

View file

@ -413,6 +413,7 @@ class CWindow {
std::optional<std::string> xdgDescription();
PHLWINDOW parent();
bool priorityFocus();
SP<CWLSurfaceResource> getSolitaryResource();
CBox getWindowMainSurfaceBox() const {
return {m_realPosition->value().x, m_realPosition->value().y, m_realSize->value().x, m_realSize->value().y};