desktop: Damage subsurface when position changes (#10094)

This commit is contained in:
Lee Bousfield
2025-04-16 10:49:01 -05:00
committed by GitHub
parent 1ae7e2164c
commit 3fa6320a39
3 changed files with 20 additions and 22 deletions

View File

@@ -115,21 +115,10 @@ void CSubsurface::onCommit() {
// I do not think this is correct, but it solves a lot of issues with some apps (e.g. firefox) // I do not think this is correct, but it solves a lot of issues with some apps (e.g. firefox)
checkSiblingDamage(); checkSiblingDamage();
if (m_vLastSize != m_pWLSurface->resource()->current.size) { if (m_vLastSize != m_pWLSurface->resource()->current.size || m_vLastPosition != m_pSubsurface->position) {
// TODO: fix this damageLastArea();
// CBox box{COORDS, m_vLastSize}; m_vLastSize = m_pWLSurface->resource()->current.size;
// g_pHyprRenderer->damageBox(box); m_vLastPosition = m_pSubsurface->position;
// m_vLastSize = m_pWLSurface->resource()->current.size;
// box = {COORDS, m_vLastSize};
// g_pHyprRenderer->damageBox(box);
CBox box;
if (m_pPopupParent && !m_pPopupParent->inert() && m_pPopupParent->m_pWLSurface)
box = m_pPopupParent->m_pWLSurface->getSurfaceBoxGlobal().value_or(CBox{});
else if (m_pWindowParent)
box = m_pWindowParent->getWindowMainSurfaceBox();
g_pHyprRenderer->damageBox(box);
} }
} }
@@ -162,7 +151,8 @@ void CSubsurface::onNewSubsurface(SP<CWLSubsurfaceResource> pSubsurface) {
} }
void CSubsurface::onMap() { void CSubsurface::onMap() {
m_vLastSize = m_pWLSurface->resource()->current.size; m_vLastSize = m_pWLSurface->resource()->current.size;
m_vLastPosition = m_pSubsurface->position;
const auto COORDS = coordsGlobal(); const auto COORDS = coordsGlobal();
CBox box{COORDS, m_vLastSize}; CBox box{COORDS, m_vLastSize};
@@ -174,10 +164,7 @@ void CSubsurface::onMap() {
} }
void CSubsurface::onUnmap() { void CSubsurface::onUnmap() {
const auto COORDS = coordsGlobal(); damageLastArea();
CBox box{COORDS, m_vLastSize};
box.expand(4);
g_pHyprRenderer->damageBox(box);
if (m_pWLSurface->resource() == g_pCompositor->m_pLastFocus) if (m_pWLSurface->resource() == g_pCompositor->m_pLastFocus)
g_pInputManager->releaseAllMouseButtons(); g_pInputManager->releaseAllMouseButtons();
@@ -187,6 +174,13 @@ void CSubsurface::onUnmap() {
// TODO: should this remove children? Currently it won't, only on .destroy // TODO: should this remove children? Currently it won't, only on .destroy
} }
void CSubsurface::damageLastArea() {
const auto COORDS = coordsGlobal() + m_vLastPosition - m_pSubsurface->position;
CBox box{COORDS, m_vLastSize};
box.expand(4);
g_pHyprRenderer->damageBox(box);
}
Vector2D CSubsurface::coordsRelativeToParent() { Vector2D CSubsurface::coordsRelativeToParent() {
if (!m_pSubsurface) if (!m_pSubsurface)
return {}; return {};

View File

@@ -49,7 +49,8 @@ class CSubsurface {
WP<CWLSubsurfaceResource> m_pSubsurface; WP<CWLSubsurfaceResource> m_pSubsurface;
SP<CWLSurface> m_pWLSurface; SP<CWLSurface> m_pWLSurface;
Vector2D m_vLastSize = {}; Vector2D m_vLastSize = {};
Vector2D m_vLastPosition = {};
// if nullptr, means it's a dummy node // if nullptr, means it's a dummy node
WP<CSubsurface> m_pParent; WP<CSubsurface> m_pParent;
@@ -64,4 +65,5 @@ class CSubsurface {
void initSignals(); void initSignals();
void initExistingSubsurfaces(SP<CWLSurfaceResource> pSurface); void initExistingSubsurfaces(SP<CWLSurfaceResource> pSurface);
void checkSiblingDamage(); void checkSiblingDamage();
void damageLastArea();
}; };

View File

@@ -99,8 +99,10 @@ CWLSubsurfaceResource::~CWLSubsurfaceResource() {
} }
void CWLSubsurfaceResource::destroy() { void CWLSubsurfaceResource::destroy() {
if (surface && surface->mapped) if (surface && surface->mapped) {
surface->events.unmap.emit();
surface->unmap(); surface->unmap();
}
events.destroy.emit(); events.destroy.emit();
PROTO::subcompositor->destroyResource(this); PROTO::subcompositor->destroyResource(this);
} }