summaryrefslogtreecommitdiff
path: root/src/desktop/Window.cpp
diff options
context:
space:
mode:
authorUjinT34 <41110182+UjinT34@users.noreply.github.com>2025-08-22 20:24:25 +0300
committerGitHub <noreply@github.com>2025-08-22 18:24:25 +0100
commit0d45b277d6c750377b336034b8adc53eae238d91 (patch)
tree0489c239e9ef6ab6e3c1ee70b8baa03d7b5cf2d7 /src/desktop/Window.cpp
parente95ba5bf5911fbc5e33d10e3f1ae1291f906a19f (diff)
internal: Solitary clients with single subsurface & verbose solitary/tearing/DS checks (#11228)
Adds more verbose checks for various conditional rendering mechanisms
Diffstat (limited to 'src/desktop/Window.cpp')
-rw-r--r--src/desktop/Window.cpp34
1 files changed, 31 insertions, 3 deletions
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<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;
+} \ No newline at end of file